Je montre ici comment une instance "difficile" de ce problème peut être résolue. Je pense que cette méthode peut être généralisée. J'ai mis une autre instance plus simple dans les commentaires de l'article original.
Considérez les deux lignes :
10000019 * X - 10000015 * Y + 909093 >= 0 (L1)
-10000022 * X + 10000018 * Y + 1428574 >= 0 (L2)
A = 10000019, B = -10000015, C = -909093
Le point d'intersection est H :
Hx = -5844176948071/3, Hy = -5844179285738/3
Pour un point M(X,Y), la distance au carré HM^2 est :
HM^2 = (9*X^2+35065061688426*X
+68308835724213587680825685
+9*Y^2+35065075714428*Y)/9
g = pgcd(A,B) = 1 : l'équation de L1 A*X+B*Y+909093
peut prendre n'importe quelle valeur entière.
Les coefficients de déviation, U=2500004 et V=2500005, sont vérifiés :
A * U + B * V = 1
Nous réécrivons maintenant le problème dans la base "double" (K,T) définie par :
X = T*U - K*B
Y = T*V + K*A
Après substitution, on obtient :
T+909093 >= 0
2*T+12*K+1428574 >= 0
minimize 112500405000369*T^2
+900003150002790*T*K
+1800006120005274*K^2
+175325659092760325844*T
+701302566240903900522*K
+Constant
Après une nouvelle traduction (d'abord sur T, puis sur K pour minimiser la constante de la deuxième équation), T=T1-909093, K=K1+32468 :
T1 >= 0
2*T1+4+12*K1 >= 0
minimize 112500405000369*T1^2
+300001050000930*T1
+900003150002790*T1*K1
+1200004080003516*K1
+1800006120005274*K1^2
+Constant
L'algorithme que j'ai proposé consiste à boucler sur T1. En fait, nous n'avons pas besoin de boucle ici, puisque le meilleur résultat est donné par T1=K1=0, correspondant à :
X = -1948055649352, Y = -1948056428573
Mon message initial ci-dessous.
Voici une autre idée d'algorithme. Elle peut fonctionner, mais je ne l'ai pas mise en oeuvre...
Avec un changement de signe approprié pour correspondre à la position de (x,y), le problème peut être écrit :
A*X+B*Y>=C (line D)
a*X+b*Y>=c (line d)
minimize the distance between M(X,Y) and H, the intersection point
A*b != a*B (intersection is defined)
A,B,C,a,b,c,X,Y all integers
L'ensemble de toutes les valeurs atteintes par (A X+B Y) est l'ensemble de tous les multiples de g=gcd(A,B), et il existe des entiers (u,v) tels que A u+B v=g (théorème de Bezout). A partir d'un point de coordonnées entières (X0,Y0), tous les points de coordonnées entières et de même valeur de A X+B Y sont (X0-K B/g,Y0+K A/g), pour tous les entiers K.
Pour résoudre le problème, on peut boucler sur des lignes parallèles à D à distance croissante de H, et contenant des points de coordonnées entières.
-
Calculez g,u,v, et H (les coordonnées de H ne sont probablement pas nécessaires, nous avons seulement besoin des coefficients de la forme quadratique correspondant à la distance).
-
T0 = ceil(C/g)
-
Boucle de T = T0
a. Trouvez K le plus petit (ou le plus grand, selon le signe de a B-b A) entier vérifiant a*(T u-K B/g)+b*(T v+K A/g)>=c
b. Point de maintien (T u-K B/g,T v+K A/g) si elle est plus proche de H
c. Sortir de la boucle lorsque (T-T0) correspond à une distance de D plus grande que le meilleur résultat obtenu jusqu'à présent, sinon continuer avec T+=1
5 votes
Ce n'est PAS un problème du projet Euler - c'est un problème de type Euler.
0 votes
Bon point, @Lew. Quoi qu'il en soit, merci pour ce titre plus spécifique.
1 votes
@All : J'ai rétrogradé toutes les réponses parce qu'elles ne résolvent pas le problème de manière rapide. Je suppose que cette tâche nécessite des connaissances particulières et appartient vraiment à mathoverflow.
2 votes
@Pavel : Ma solution nécessite le calcul de deux points arbitraires par ligne et deux déterminants 3x3, en quoi est-ce lent ?
4 votes
C'est dommage qu'il n'y ait pas de bonnes réponses. La plupart des questions de programmation obtiennent très rapidement un grand nombre de réponses et la plupart d'entre elles sont justes. Je ne sais pas pourquoi les questions d'algorithmique ne bénéficient pas du même traitement. Au moins si les gens ne postaient pas à moins d'avoir une solution réelle...
0 votes
@Hamish, ne le prenez pas mal, mais certaines personnes ne considèrent pas ce que vous avez posté comme "une solution".
0 votes
@Hamish : Je n'ai jamais dit que j'avais quelque chose de mieux, sinon j'aurais posté une explication détaillée, sans le "ceci est laissé comme un exercice pour le lecteur" <snip>. Cela ne veut pas dire que je ne reconnais pas une mauvaise solution quand j'en vois une.
0 votes
C'est pas grave, ma solution était partielle. J'espère que c'est réparé maintenant.
0 votes
@Hamish, je n'ai pas l'impression de savoir comment résoudre ce problème. Parce que je ne le sais pas. C'est pourquoi je ne poste rien. Vous avez posté une "solution" qui est exponentielle à la longueur de l'entrée. En fait, ce problème peut effectivement être NP-complet (pas NP-dur, puisque l'une des solutions possibles est (x,y)), mais il nécessite des connaissances mathématiques spéciales que ni moi ni vous n'avez pour le prouver/pour le souligner. La différence entre nous est que je peux l'admettre.
1 votes
@Pavel Shved : Le downvoting parce qu'ils ne sont pas assez rapides semble dur. Au moins, ils ont essayé.
0 votes
@Pavel : J'espère que vous savez que le downvoting nuit également à votre propre réputation.
1 votes
@Goose, je n'aime pas quand les gens postent d'abord, puis réfléchissent ; cela nuit à stackoverflow. Je n'aime pas non plus quand les gens défendent leurs solutions incorrectes au lieu de simplement les supprimer. Et oui, il semble que je sois le seul à être prêt à payer de ma réputation pour mettre le mauvais contenu là où il doit être : en bas des pages.
2 votes
Voici un cas non trivial possible : Première ligne 10000019 X - 10000015 Y + 909093 = 0. Deuxième ligne -10000022 X + 10000018 Y + 1428574 = 0. Le point (x,y) est l'origine.
3 votes
Un autre exemple plus facile dans le même esprit : 100003 X - 99999 Y + 9092 = 0 ; -100006 X + 100002 Y + 14286 = 0 ; (x,y) = (0,0). Ici la solution semble être (-194800325,-194808117).
0 votes
Au fait, il y a un bon résultat appelé Le théorème de Pick . fr.wikipedia.org/wiki/Pick%27s_theorem Je n'ai pas pu l'utiliser pour trouver une solution, mais cela pourrait être une façon d'aborder le problème...
1 votes
Posée sur mathoverflow : mathoverflow.net/questions/22777/
0 votes
@Pavel, ligne avec l'équation A x+B y+C=0 avec A,B,C entiers n'est pas équivalent à "ligne contenant au moins deux points de Z^2". 2*X-1=0 ne contient aucun point de Z^2 par exemple. Mais je suis d'accord que ce détail n'est pas pertinent.
0 votes
Je crois que la réponse que je viens de poster résout ce problème. Je n'ai pas lu les autres solutions très attentivement mais il semblait que le problème était toujours sans réponse.
0 votes
O(n) semble trop petit. Le problème semble au moins aussi difficile que de trouver le point d'intersection (un nombre rationnel exact), ce qui implique quelques multiplications et divisions de ces nombres à n bits, non ? Et bien que la complexité des multiplications et divisions pourrait être aussi bas que O(n) (problème ouvert selon wikipedia), le plus connu est actuellement O(n^1.465) donc je ne pense pas croire votre "auteur original" qui dit connaître une réponse O(n).
0 votes
Il semble que ce soit la solution : Statistiques d'ordre dans les séquences de Farey en temps sublinéaire et comptage des points de treillis primitifs dans les polygones
0 votes
Il s'agit d'un problème extrêmement intéressant qui possède en fait une solution solide en temps polynomial, mais la façon dont la question est présentée est plutôt confuse à plusieurs égards. En particulier, "Veuillez indiquer les complexités des algorithmes publiés (même s'ils sont exponentiels)" invite beaucoup de matériel de très mauvaise qualité dans les réponses. Il est préférable de dire quelque chose comme "montrez qu'il existe un algorithme en temps polynomial". Le site recadrage sur mathoverflow fait un peu mieux à cet égard.