Étant donné un entier positif qui n'est pas un carré, trouvez la solution fondamentale de l' équation de Pell associée
Détails
- Le fondamental est une paire d'entiers satisfaisant l'équation où est minimal et positif. (Il y a toujours la solution triviale qui n'est pas comptée.)
- Vous pouvez supposer que n'est pas un carré.
Exemples
n x y
1 - -
2 3 2
3 2 1
4 - -
5 9 4
6 5 2
7 8 3
8 3 1
9 - -
10 19 6
11 10 3
12 7 2
13 649 180
14 15 4
15 4 1
16 - -
17 33 8
18 17 4
19 170 39
20 9 2
21 55 12
22 197 42
23 24 5
24 5 1
25 - -
26 51 10
27 26 5
28 127 24
29 9801 1820
30 11 2
31 1520 273
32 17 3
33 23 4
34 35 6
35 6 1
36 - -
37 73 12
38 37 6
39 25 4
40 19 3
41 2049 320
42 13 2
43 3482 531
44 199 30
45 161 24
46 24335 3588
47 48 7
48 7 1
49 - -
50 99 14
51 50 7
52 649 90
53 66249 9100
54 485 66
55 89 12
56 15 2
57 151 20
58 19603 2574
59 530 69
60 31 4
61 1766319049 226153980
62 63 8
63 8 1
64 - -
65 129 16
66 65 8
67 48842 5967
68 33 4
69 7775 936
70 251 30
71 3480 413
72 17 2
73 2281249 267000
74 3699 430
75 26 3
76 57799 6630
77 351 40
78 53 6
79 80 9
80 9 1
81 - -
82 163 18
83 82 9
84 55 6
85 285769 30996
86 10405 1122
87 28 3
88 197 21
89 500001 53000
90 19 2
91 1574 165
92 1151 120
93 12151 1260
94 2143295 221064
95 39 4
96 49 5
97 62809633 6377352
98 99 10
99 10 1
n
s. (btw j'étais aussi surpris mais j'ai eu ce défi dans le bac à sable pendant environ un an)Réponses:
Piet , 612 codels
Prend n de l'entrée standard. Sorties y puis x , séparées par des espaces.
Codel taille 1:
Codel taille 4, pour une visualisation plus aisée:
Explication
Découvrez cette trace NPiet , qui montre le programme calculant la solution pour une valeur d'entrée de 99.
Je ne sais pas si j'avais déjà entendu parler de l'équation de Pell avant ce défi, alors j'ai obtenu tout ce qui suit de Wikipedia; plus précisément, ces sections de trois articles:
Fondamentalement, ce que nous faisons est le suivant:
Je n'ai franchement aucune idée si une approche par force brute serait ou non plus courte, et je ne suis pas sur le point de l'essayer!D'accord, je l'ai donc essayé.la source
Piet , 184 codels
C'est l'alternative de force brute que j'ai dit (dans mon autre réponse ) que je ne voulais pas écrire. Il faut plus de 2 minutes pour calculer la solution pour n = 13. Je ne veux vraiment pas l'essayer sur n = 29 ... mais il vérifie pour chaque n jusqu'à 20, donc je suis sûr que c'est correct.
Comme cette autre réponse, cela prend n de l'entrée standard et sort y puis x , séparés par des espaces.
Codel taille 1:
Codel taille 4, pour une visualisation plus aisée:
Explication
Voici la trace NPiet pour une valeur d'entrée de 5.
C'est la force brute la plus brutale, itérant surx et y . D'autres solutions pourraient itérer sur x puis calculer y=x2−1n−−−−√ , mais ce sont desmauviettes.
En partant dex=2 et y=1 , cela vérifie si x et y ont encore résolu l'équation. Si c'est le cas (la fourche en bas près de la droite), il sort les valeurs et quitte.
Sinon, il continue à gauche, oùy est incrémenté et comparé à x . (Ensuite, il y a un virage directionnel pour suivre le chemin en zigzag.)
Cette dernière comparaison est l'endroit où le chemin se divise vers le milieu à gauche. S'ils sont égaux,x est incrémenté et y est remis à 1. Et nous revenons à vérifier si c'est encore une solution.
J'ai encore des espaces disponibles, alors je vais peut-être voir si je peux incorporer ce calcul de racine carrée sans agrandir le programme.
la source
Brachylog , 16 octets
Essayez-le en ligne!
Explication
la source
Pari / GP , 34 octets
PARI / GP a presque un intégré pour cela:Q ( D--√) , oùré est lediscriminantdu champ. En d'autres termes,X2- n ⋅ y2= ± 1 . Je dois donc prendre le carré lorsque sa norme est- 1 .
quadunit
donne l' unité fondamentale du champ quadratiquequadunit(4*n)
résout l'équation de Pellx + y*w
w
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) , 46 octets
Essayez-le en ligne!
la source
05AB1E,
171614 bytesUn octet enregistré grâce à Kevin Cruijssen .
Les sorties
[y, x]
Essayez-le en ligne!
Explication
la source
Ų
est buggé avec des décimales ..>. <Quoi qu'il en soit, vous pouvez supprimer les deux,
et ajouter une fin‚
(non, les virgules ne sont pas les idem; p) pour enregistrer un octet.Ų
première fois en remarquant que cela ne fonctionnait pas comme prévu.Java 8,
747372 octets-1 byte thanks to @Arnauld.
-1 byte thanks to @OlivierGrégoire.
Try it online.
Explanation:
la source
n
to adouble
, andx
to anint
, playing on the fact thatx*x-1
is equal to(-x-1)*(-x+1)
.(x+1)*(x+1)-1
is equal to-x*-(x+2)
, to be entirely correct.R,
66565453524745 bytesa full program
-1 -2thanks to @Giuseppe-7 thanks to @Giuseppe & @Robin Ryder -2 @JAD
la source
.5
au lieu de0.5
x
équivaut à trouver la plus petite valeur dey
. Cela vous permet d'économiser 2 octets car l'expressionx
en termes dey
est plus courte que l'inverse, et 4 octets en utilisant l'astuce d'utilisationT
qui est initialisée à 1.+T
à la fin pour vous assurer que lorsqu'ily==1
reviendra1
au lieu deTRUE
mais je ne suis pas tout à fait sûr.Gelée , 40 octets
Essayez-le en ligne!
Une réponse alternative à Jelly, moins golfique mais plus efficace algorithmiquement lorsque x et y sont grands. Ceci trouve les convergents de la fraction continue régulière qui se rapprochent de la racine carrée de n, puis vérifie qui résout l'équation de Pell. Trouve maintenant correctement la période de la fraction continue régulière.
Grâce à @TimPederick, j'ai également implémenté une solution basée sur des nombres entiers qui devrait gérer n'importe quel nombre:
Gelée , 68 octets
Essayez-le en ligne!
Par exemple, la solution pour 1234567890 comporte respectivement 1936 et 1932 chiffres pour le numérateur et le dénominateur.
la source
JavaScript (ES7), 47 octets
Essayez-le en ligne!
Voici une autre version de 49 octets qui garde une trace dex ² - 1 directement au lieu de la quadrature X à chaque itération:
Essayez-le en ligne!
Ou nous pouvons suivre la voie non récursive pour 50 octets :
Essayez-le en ligne!
la source
TI-BASIC,
444241 octetsL'entrée estn . ( x , y) .
La sortie est une liste dont les valeurs correspondent à
Utilise l'équationy= x2- 1n----√ pour x ≥ 2 pour calculer la solution fondamentale. ( x , y) paire pour cette équation est une solution fondamentale ssi ymod 1 = 0 .
Le courant
Exemples:
Explication:
Remarque: TI-BASIC est un langage à jetons. Le nombre de caractères n'est pas égal au nombre d'octets.
la source
MATL , 17 octets
Essayez-le en ligne!
Explication
Le code continue d'augmenter un compteur k = 1, 2, 3, ... Pour chaque k , les solutions x , y avec 1 ≤ x ≤ k , 1 ≤ y ≤ k sont recherchées. Le processus lorsqu'une solution est trouvée.
Cette procédure est garantie de ne trouver qu'une seule solution, qui est précisément la solution fondamentale. Pour voir pourquoi, notez que
En conséquence de 1 et 2,
la source
Python 2 , 49 octets
Essayez-le en ligne!
Trouve
x
comme le plus petit nombre au-dessus de 1 oùx % sqrt(n) <= 1/x
. Ensuite, trouve ày
partir dex
asy = floor(x / sqrt(n))
.la source
Haskell , 46 octets
Une recherche simple de force brute. Cela utilise le fait qu'une solution fondamentale( x , y) satisfaisant X2- n y2= 1 doit avoir y≤ x .
Essayez-le en ligne!
la source
n
pourx
eny<-[1..n]
afin que vous puissiez calculerf 13
.C # (Visual C # Interactive Compiler),
7069 octetsPort de ma réponse Java 8 , mais génère un tuple au lieu d'une chaîne pour enregistrer les octets.
Essayez-le en ligne.
la source
Gelée , 15 octets
Essayez-le en ligne!
Un programme complet qui prend un seul argument
n
et renvoie un tuple dex, y
.la source
Husk , 12 octets
Essayez-le en ligne!
Explication
la source
MathGolf , 12 octets
Essayez-le en ligne!
Je lance un Je vous salue Marie en ce qui concerne le formatage de sortie. Si ce n'est pas autorisé, j'ai une solution qui fait 1 octet de plus. Le format de sortie est
x.0y
, où.0
est le séparateur entre les deux nombres.Explication
Je me suis inspiré de la réponse 05AB1E d'Emigna, mais j'ai pu trouver des améliorations. Si le séparateur que j'ai choisi n'est pas autorisé, ajoutez un espace avant le dernier octet pour un nombre d'octets de 13.
la source
APL (NARS), 906 octets
Ci-dessus, il y a 2 fonctions sqrti qui trouveraient la racine carrée du plancher et la fonction pell retournerait Zilde pour erreur, et est basée sur la lecture de la page http://mathworld.wolfram.com/PellEquation.html, elle utiliserait l'algo pour connaître la sqrt d'un nombre trhu continue la fraction (même si j'utilise un algo pour connaître sqrt en utilisant la méthode newton) et s'arrête quand il trouve p et q tel que
Tester:
Il y a une limite pour les cycles dans la boucle dans la fonction sqrti, et une limite pour les cycles dans la boucle dans la fonction Pell, les deux pour le nombre possible de cas sont trop gros ou algo ne convergent pas ... (Je ne sais pas si sqrti faire converger toutes les entrées possibles et la même fonction Pell aussi)
la source
Groovy , 53 octets
Essayez-le en ligne!
Réponses Java et C # du port de Kevin Cruijssen
la source
Pyth, 15 octets
Essayez-le en ligne ici . La sortie est
x
ensuitey
séparée par une nouvelle ligne.la source
Wolfram Language (Mathematica) , 41 octets
√
est le caractère Unicode à 3 octets # 221A. Sort la solution dans l'ordre (y, x) au lieu de (x, y). Comme d'habitude avec l'imparfait//.
et ses itérations limitées, ne fonctionne que sur les entrées où la vraie valeur dey
est au plus 65538.Essayez-le en ligne!
la source
> <> , 45 octets
Essayez-le en ligne!
Algorithme de force brute, recherche
x=2
vers le haut, avecy=x-1
et décrémentation sur chaque boucle, incrémentationx
lorsqu'elley
atteint 0. La sortie estx
suivie dey
, séparée par une nouvelle ligne.la source
C # (Visual C # Interactive Compiler) , 69 octets
Essayez-le en ligne!
la source
Python 3 , 75 octets
Essayez-le en ligne!
Explication
Force brute. En utilisantx < ije comme limite de recherche supérieure, qui est bien en dessous de la limite supérieure définie de la solution fondamentale de l'équation de Pell x ≤ i !
Ce code s'exécuterait également en Python 2. Cependant, la fonction range () en Python 2 crée une liste au lieu d'un générateur comme en Python 3 et est donc extrêmement inefficace.
Avec du temps et de la mémoire inifinte, on pourrait utiliser une compréhension de liste au lieu de l'itérateur et économiser 3 octets comme ceci:
Python 3 , 72 octets
Essayez-le en ligne!
la source
Python 2 , 64 octets
Essayez-le en ligne!
Retours
(x, y)
.la source