introduction
Dans la théorie des nombres, nous disons qu'un nombre est lisse lorsque ses facteurs premiers sont tous au plus . Par exemple, 2940 est 7-lisse car .
Ici, nous définissons une paire lisse comme deux entiers consécutifs qui sont tous deux lisse. Un exemple de paire à 7 lisses sera car et . Fait amusant: il s'agit en fait de la plus grande paire de 7 lisses .
Størmer a prouvé en 1897 que pour chaque , il n'y a qu'un nombre fini de paires lisses , et ce fait est connu sous le nom de théorème de Størmer .
Défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné un nombre premier entré , génère ou renvoie tousgénère k paires lisses sans doublon (l'ordre dans la paire n'a pas d'importance) dans l'ordre que vous souhaitez.
Veuillez noter que pour les nombres premiers et , en supposant que , toutes les paires lisses sont également des paires lisses.
Exemple d'E / S
Input: 2
Output: (1, 2)
Input: 3
Output: (1, 2), (2, 3), (3, 4), (8, 9)
Input: 5
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (8, 9), (9, 10), (15, 16), (24, 25), (80, 81)
Input: 7
Output: (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (14, 15),
(15, 16), (20, 21), (24, 25), (27, 28), (35, 36), (48, 49), (49, 50), (63, 64),
(80, 81), (125, 126), (224, 225), (2400, 2401), (4374, 4375)
Restriction
Le programme ou la fonction devrait théoriquement se terminer en temps fini pour toutes les entrées. Les failles standard sont interdites par défaut.
Critères gagnants
Comme il s'agit d'un défi de code-golf , la soumission valide la plus courte pour chaque langue gagne.
la source
(1, 2)
partie de la sortie est-elle obligatoire? ..(1, 2)
paire.Réponses:
JavaScript (ES7),
234232 octetsTrouve les solutions en résolvant les équations de Pell de la formex2−2qy2=1 , où q est un nombre libre carré P lisse.
Il s'agit d'une implémentation de la procédure de Derrick Henry Lehmer , dérivée de la procédure originale de Størmer.
Renvoie un objet dont les clés et les valeurs décrivent les pairesP -mooth.
Essayez-le en ligne!
Comment?
La fonction d'assistances teste si un entier donné n est un nombre lisse P lorsqu'il est appelé avec i=0 , ou un nombre lisse 1 P carré lorsqu'il est appelé avec i=1 .
Nous recherchons tous les nombres sans carré 1P libres dans [1..PP−1] , où PP est utilisé comme limite supérieure pour P! .
Pour chaque nombren trouvé ci-dessus, nous recherchons la solution fondamentale de l'équation de Pell x2−ny2=1 :
(le code ci-dessus est la version non récursive de ma réponse à cet autre défi )
Une fois la solution fondamentale(x1,y1) trouvée, nous calculons les solutions (xk,yk) avec k≤max(3,(P+1)/2) , en utilisant les relations de récurrence:
Pour chaquexk , nous testons si xk est impair et les deux (xk−1)/2 et (xk+1)/2 sont P lisses. Si c'est le cas, nous les stockons dans l'objet r .
1: Parce qu'elle ne teste pas la primauté des diviseurs, la fonctions sera en fait vraie pour certains nombres libres non carrés, même lorsqu'elle est appelée avec i=1 . L'idée est de filtrer la plupart d'entre elles afin de ne pas résoudre trop d'équations de Pell inutiles.
la source
x = ~-x / 2
et.-~P / 2
S'agit-il d'une sorte d'arrondi ...~x
est un NOT au niveau du bit, qui calcule-(x+1)
. Par conséquent,~-x
est-(-x+1)
=x-1
et-~x
est-(-(x+1))
=x+1
. Comme toutes les opérations bit à bit dans JS, seule la partie entière 32 bits est prise en compte. Ainsi, ils peuvent en effet être utilisés pour l'arrondi. Mais et P sont déjà des entiers ici.Gelée ,
1614 octetsEssayez-le en ligne!
Vérifie les paires jusqu'à4k ce qui est inefficace pour les k plus grandsk mais devrait s'assurer qu'aucune ne soit manquée.
Merci à @JonathanAllan d'avoir économisé 1 octet!
Explication
la source
05AB1E , 8 octets
Essayez-le en ligne!
Explication:
la source
Gelée , 123 octets
Essayez-le en ligne!
Ceci est une réponse Jelly relativement efficace mais longue qui utilise la méthode des fractions continues pour résoudre la solution fondamentale des équations de Pell pour2 × chaque nombre sans carré k-lisse, trouve max ( 3 , k + 12) solutions pour chacun, puis vérifie si x−12,x+12 are smooth for each solution. This is Lehmer’s method, as described in the question’s Wikipedia link.
A full program that takes a single argument,k and returns a list of lists of pairs. The code above doesn’t sort the final output, but the TIO link does.
la source
Haskell,
118107 bytes-11 bytes thanks to nimi
Try it online!
q n
calculates a list of all prime factors ofn
f k
generates a list ofla source
[2..n]
withinp
and inline it intoq
. Try it online!Jelly, 24 bytes
Try it online!
This takes a long time for 7, but it computes much faster if you remove the squaring of the factorial: Try it online!
Explanation:
-3 bytes thanks to @JonathanAllen
la source
(8,9)
a 3-smooth pair sincek!
(except for 3, which has a small factorial because it is a small number).Python 3 + sympy, 116 bytes
Try it online!
Python 3 + sympy, 111 bytes
Try it online!
Two variations on my Jelly answer but in Python 3. They both define a function which accepts an argument
k
. The first returns a list of tuples of the pairs that meet the criteria. The second prints them to stdout.la source
Wolfram Language (Mathematica), 241 bytes
uses Pell equations
Try it online!
la source
Pyth, 15 bytes
Try it online!
Uses Nick Kennedy's observation that no output number will be larger than
4^k
.la source
05AB1E, 16 bytes
Try it online (extremely inefficient, so times out forn>3 ..). Here a slightly faster alternative, although still pretty slow..
Explanation:
la source
Stax, 14 bytes
Run and debug it
This is not the shortest possible program, but it begins producing output as soon as matching pairs are found. It does terminate eventually, but output is produced as it's found.
la source
Ruby, 89+8 = 97 bytes
Uses thei from 1 to 4n , map it to n -smooth, otherwise map it to
-rprime
flag. For each number[i, i+1]
if both arefalse
, then prune allfalse
from the list.Try it online!
la source