Wir möchten ein Semiprime faktorisieren . Das Ziel dieser Herausforderung ist es, zwei kleine ganze Zahlen und v zu finden, so dass uvN mit der Methode von Fermat trivial faktorisiert werden kann, wodurch die Faktoren von N leicht abgeleitet werden können .u v u v N N
Die Aufgabe
Ausgehend von einem Halbwert und einer positiven ganzen Zahl definieren wir und als:
y=x2-kN
Schritt # 1 - Finden Sie
Sie müssen zuerst den kleinstmöglichen Wert von , sodass eine quadratische Zahl ist (auch als perfektes Quadrat bezeichnet).
Dies ermöglicht die Faktorisierung von mit einer einzigen Iteration der Fermat-Faktorisierungsmethode . Konkret führt dies sofort zu:
(Update: Diese Sequenz ist jetzt als A316780 veröffentlicht )
Schritt # 2 - Faktorisiere
Sie müssen dann die beiden positiven ganzen Zahlen und so finden, dass:v
c u = x + √
wobei und die Primfaktoren von .d N
Zusammenfassung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die als Eingabe verwendet und und in beliebiger Reihenfolge und in einem angemessenen Format ausgibt oder ausgibt .u v
Beispiel
Betrachten wir
Schritt 1
Der kleinstmögliche Wert von ist , was ergibt:40
y=28232-40×199.163=7.969.329-7,96652 Millionen=2809=532kN=(2823+53)×(2823-53)
Schritt 2
Die korrekte Faktorisierung von ist , weil:k = 4 × 10
k N = ( 719 × 4 ) × ( 277 × 10 ) N = 719 × 277
Die richtige Antwort wäre also entweder oder .[ 10 , 4 ]
Regeln
- Es ist nicht erforderlich, die beiden oben beschriebenen Schritte strikt anzuwenden. Es steht Ihnen frei, eine andere Methode zu verwenden, solange die korrekten Werte für und .v
- Sie müssen alle Werte von bis zur nativen Maximalgröße einer vorzeichenlosen Ganzzahl in Ihrer Sprache unterstützen.
- Der Eingang ist garantiert ein Halbbild.
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
- Standardlücken sind verboten.
Testfälle
N | k | Output
-----------+------+------------
143 | 1 | [ 1, 1 ]
2519 | 19 | [ 1, 19 ]
199163 | 40 | [ 4, 10 ]
660713 | 1 | [ 1, 1 ]
4690243 | 45 | [ 9, 5 ]
11755703 | 80 | [ 40, 2 ]
35021027 | 287 | [ 7, 41 ]
75450611 | 429 | [ 143, 3 ]
806373439 | 176 | [ 8, 22 ]
1355814601 | 561 | [ 17, 33 ]
3626291857 | 77 | [ 7, 11 ]
6149223463 | 255 | [ 17, 15 ]
6330897721 | 3256 | [ 74, 44 ]
Beispielimplementierung
quelle
N
sicher, dass der Input tatsächlich ein Semiprime sein wird?Antworten:
Mathematica,
8179 BytesVielen Dank an Martin Ender für das Speichern von 2 Bytes!
Reine Funktion, die ein Semiprime als Eingabe verwendet und ein geordnetes Paar positiver Ganzzahlen zurückgibt. Die
For
Schleife implementiert die genaue Prozedur, die in der Frage (unter Verwendung#
für die Eingabe anstelle vonn
) beschrieben ist, mitx
der dort definierten, obwohl wirj = k*n
anstelle von sichk
selbst undz=Sqrt[y]
anstelle von sichy
selbst speichern . Wir berechnen auchp={x+z,x-z}
innerhalb derFor
Schleife, wodurch am Ende ein Byte gespart wird (wie beim siebten Versuch). Dann sind die beiden gewünschten Faktoren(x+z)/GCD[#,x+z]
und(x-z)/GCD[#,x-z]
, die der prägnante Ausdruckp/#~GCD~p
direkt als geordnetes Paar berechnet.Kurioses: Wir wollen eine Schleife machen, bis
z
eine ganze Zahl ist. Da wir aberCeiling
bereits im Code verwenden werden, werden zwei Bytes gespart, um!IntegerQ@z
zu definierenc=Ceiling
(was, wie Mathematica-Golfer wissen, vier Bytes kostet) und dann zu testen, obc@z>z
. Wir müssenz
etwas initialisieren , und dieses etwas sollte besser keine ganze Zahl sein, damit die Schleife beginnen kann; Zum GlückE
ist eine prägnante Wahl.quelle
JavaScript (ES7),
8681 BytesBearbeiten: 4 Bytes dank @Arnauld gespeichert.
quelle
Python 2,
12712111711110710410199 Byte-1 Byte dank Neil & -3 Byte dank Ovs
Probieren Sie es online!
Kuriositäten:
p
wird so initialisiert,.5
dass die Schleifenbedingung bei der ersten Iteration wahr ist. Beachten Sie, dass das Speichernp
(alsx
+sqrt(y)
) kürzer ist als das Speichern der einzelnenx
undy
getrennt.quelle
x*x
stattx**2
?Axiom,
131115 BytesDie Funktion, die die Frage lösen würde, ist r (n) oben. ungolf und test
quelle