Einführung
In der Zahlentheorie sagen wir, dass eine Zahl glatt ist, wenn ihre Primfaktoren alle höchstens . Zum Beispiel ist 2940 7-glatt, weil .
Hier definieren wir ein glattes Paar als zwei aufeinanderfolgende ganze Zahlen, die beide glatt sind. Ein Beispiel von 7-Paar glatter wird , weil und . Lustige Tatsache: Dies ist tatsächlich das größte 7-Smooth-Paar .
Størmer bewies 1897, dass es für jedes nur endlich viele glatte Paare gibt , und diese Tatsache ist als Satz von Størmer bekannt .
Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei gegebener Primzahleingabe alle glatten Paare ohne Duplikat (Reihenfolge innerhalb des Paares ist egal) in beliebiger Reihenfolge ausgibt oder zurückgibt .
Bitte beachten Sie, dass für die Primzahlen und unter der Annahme von alle glatten Paare auch glatte Paare sind.
Beispiel-E / A
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)
Beschränkung
Das Programm oder die Funktion sollte theoretisch für alle Eingaben in endlicher Zeit enden. Standardlücken sind standardmäßig nicht zulässig.
Gewinnkriterien
Da dies eine Code-Golf- Herausforderung ist, gewinnt die kürzeste gültige Einsendung für jede Sprache.
quelle
(1, 2)
Teil der Ausgabe obligatorisch? ..(1, 2)
Paar enthalten .Antworten:
JavaScript (ES7),
234232 ByteFindet die Lösungen durch Lösen von Pell-Gleichungen der Formx2−2qy2=1 , wobei q eine P glatte quadratfreie Zahl ist.
Dies ist eine Implementierung des Verfahrens von Derrick Henry Lehmer , abgeleitet von Størmers ursprünglichem Verfahren.
Gibt ein Objekt zurück, dessen Schlüssel und Werte dieP glatten Paare beschreiben.
Probieren Sie es online!
Wie?
Die Hilfsfunktions testet, ob eine gegebene Ganzzahl n eine P glatte Zahl ist, wenn sie mit i=0 aufgerufen wird , oder eine quadratfreie 1 P glatte Zahl, wenn sie mit i=1 aufgerufen wird .
Wir suchen nach allen quadratfreien 1P -glatten Zahlen in [ 1 .. PP- 1 ] , wobei PP als Obergrenze für P! .
Für jede oben gefundene Zahln suchen wir nach der fundamentalen Lösung der Pell-Gleichung x2- n y2= 1 :
(Der obige Code ist die nicht-rekursive Version meiner Antwort auf diese andere Herausforderung. )
Sobald die fundamentale Lösung( x1, y1) gefunden wurde, berechnen wir die Lösungen ( xk, yk) mit k≤max(3,(P+1)/2) unter Verwendung der Wiederholungsrelationen:
Für jedesxk testen wir , ob xk ungerade ist, und beide (xk−1)/2 und (xk+1)/2 sind P -Glatte. Wenn ja, speichern wir sie im Objekt r .
1: Da die Primalität der Divisoren nicht getestet wird, ist die Funktions für einige nicht-quadratische freie Zahlen sogar dann wahr, wenn sie mit i=1 aufgerufen wird . Die Idee ist, die meisten von ihnen herauszufiltern, damit nicht zu viele nutzlose Pell-Gleichungen gelöst werden.
quelle
x = ~-x / 2
und ...-~P / 2
Sind das eine Art Rundung ...~x
ist ein bitweises NOT, das rechnet-(x+1)
. Deshalb~-x
ist-(-x+1)
=x-1
und-~x
ist-(-(x+1))
=x+1
. Wie bei allen bitweisen Operationen in JS wird nur der 32-Bit-Integer-Teil berücksichtigt. Sie können also tatsächlich zum Runden verwendet werden. Aber sowohl als auch P sind hier bereits ganze Zahlen.Jelly ,
16 bis14 BytesProbieren Sie es online!
Prüft auf Paare bis zu4k was für größere k ineffizient ist, aber sicherstellen sollte, dass keine übersehen werden.
Vielen Dank an @ JonathanAllan für das Speichern von 1 Byte!
Erläuterung
quelle
05AB1E , 8 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Jelly , 123 Bytes
Probieren Sie es online!
Dies ist eine relativ effiziente, aber lange Gelee-Antwort, die die Methode der fortgesetzten Brüche verwendet, um die grundlegende Lösung für die Pell-Gleichungen für zu lösen2 × jede k-glatte quadratfreie Zahl findet max ( 3 , k + 12) lösungen für jeden und prüft dann ob x - 12, x + 12 sind für jede Lösung glatt. Dies ist Lehmers Methode, wie im Wikipedia-Link der Frage beschrieben .
Ein vollständiges Programm, das ein einziges Argument benötigt,k und gibt eine Liste mit Listen von Paaren zurück. Der obige Code sortiert die endgültige Ausgabe nicht, der TIO-Link jedoch.
quelle
Haskell ,
118107 Bytes-11 bytes dank nimi
Probieren Sie es online!
q n
berechnet eine Liste aller Primfaktoren vonn
f k
generiert eine Liste vonquelle
[2..n]
innerhalbp
und Inline es inq
. Probieren Sie es online!Gelee , 24 Bytes
Probieren Sie es online!
Für 7 dauert dies lange, aber es wird viel schneller berechnet, wenn Sie die Quadratur der Fakultät entfernen: Probieren Sie es online aus!
Erläuterung:
-3 Bytes dank @JonathanAllen
quelle
(8,9)
seitdem ist es kein 3-Smooth-Paark!
(mit Ausnahme von 3, das eine kleine Fakultät hat, weil es eine kleine Zahl ist).Python 3 + Sympy, 116 Bytes
Probieren Sie es online!
Python 3 + Sympy, 111 Bytes
Probieren Sie es online!
Zwei Variationen meiner Jelly-Antwort, aber in Python 3. Beide definieren eine Funktion, die ein Argument akzeptiert
k
. Die erste gibt eine Liste von Tupeln der Paare zurück, die die Kriterien erfüllen. Die Sekunde druckt sie zu stdout.quelle
Wolfram Language (Mathematica) , 241 Byte
verwendet Pell-Gleichungen
Probieren Sie es online!
quelle
Pyth , 15 Bytes
Probieren Sie es online!
Verwendet die Beobachtung von Nick Kennedy, dass keine Ausgabenummer größer als sein wird
4^k
.quelle
05AB1E , 16 Bytes
Probieren Sie es online aus (extrem ineffizient, also zögern Sie nichtn > 3 ..). Hier eine etwas schnellere Alternative , wenn auch noch ziemlich langsam.
Erläuterung:
quelle
Stax , 14 Bytes
Führen Sie es aus, und debuggen Sie es
Dies ist nicht das kürzestmögliche Programm, es wird jedoch ausgegeben, sobald passende Paare gefunden wurden. Es wird schließlich beendet , aber die Ausgabe wird so erstellt, wie sie gefunden wurde.
quelle
Ruby , 89 + 8 = 97 Bytes
Verwendet dieich von 1 bis 4n , ordnen Sie es zu, n -smooth, ordne es ansonsten zu
-rprime
Flagge. Für jede Nummer[i, i+1]
wenn beide sindfalse
und entferne dann allefalse
aus der Liste.Probieren Sie es online!
quelle