Eine Gaußsche Ganzzahl ist eine komplexe Zahl, deren Real- und Imaginärteil ganze Zahlen sind.
Gaußsche Ganzzahlen können wie gewöhnliche Ganzzahlen auf einzigartige Weise als Produkt von Gaußschen Primzahlen dargestellt werden. Hier besteht die Herausforderung darin, die Hauptbestandteile einer bestimmten Gaußschen Ganzzahl zu berechnen.
Eingabe: Eine Gaußsche Ganzzahl, die ungleich 0 ist und keine Einheit darstellt (dh 1, -1, i und -i können nicht als Eingabe angegeben werden). Verwenden Sie ein sinnvolles Format, zum Beispiel:
- 4-5i
- -5 * j + 4
- (4, -5)
Ausgabe: Eine Liste von Gaußschen Ganzzahlen, die Primzahlen sind (dh keine von ihnen kann als Produkt von zwei nichteinheitlichen Gaußschen Ganzzahlen dargestellt werden) und deren Produkt gleich der eingegebenen Zahl ist. Alle Zahlen in der Ausgabeliste dürfen nicht trivial sein, dh nicht 1, -1, i oder -i. Jedes sinnvolle Ausgabeformat kann verwendet werden. Es muss nicht unbedingt dasselbe sein wie das Eingabeformat.
Wenn die Ausgabeliste mehr als ein Element enthält, sind mehrere korrekte Ausgaben möglich. Für Eingang 9 kann der Ausgang beispielsweise [3, 3] oder [-3, -3] oder [3i, -3i] oder [-3i, 3i] sein.
Testfälle (aus dieser Tabelle entnommen ; 2 Zeilen pro Testfall)
2
1+i, 1-i
3i
3i
256
1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i
7+9i
1+i,2−i,3+2i
27+15i
1+i,3,7−2i
6840+585i
-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
Integrierte Funktionen zum Faktorisieren von Gaußschen Ganzzahlen sind nicht zulässig. Das Berücksichtigen gewöhnlicher Ganzzahlen durch integrierte Funktionen ist jedoch zulässig.
quelle
3i
als zurückkehren3,i
, oder3i
?3i
ist die richtige Antwort, weili
es keine Primzahl ist. Ich habe den Testfall aktualisiert, um ihn klarer zu machen.6840+585i
ist die Liste der Faktoren falsch, da5
es sich nicht um eine Gaußsche Primzahl handelt. Stattdessen kehrt es zurück-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
. Quelle256=(1+i)**16
(1+i)**8
256=2**8=(2i)**8
2i=(1+i)**2
Antworten:
Jelly ,
61-55BytesProbieren Sie es online! (Kopf- und Fußzeile formatieren die Ausgabe)
-6 Bytes dank @EricTheOutgolfer
Wie es funktioniert
quelle
Ruby ,
258256249246 + 8 =264257254 BytesVerwendet die
-rprime
Flagge.Meine Güte, was für ein Durcheinander.
Verwendet diesen Algorithmus von Stackoverflow.
Probieren Sie es online!
quelle
Python 2 ,
250239223215 BytesProbieren Sie es online!
(a,b)
Einige Erklärungen zerlegen einen Komplex rekursiv in zwei Komplexe, bis keine Zerlegung mehr möglich ist ...
quelle
def f(Z,s=[])
sollten Sie einen Charakter speichernRust - 212 Bytes
Ich bin nicht zu 100% sicher, ob dies zu 100% korrekt funktioniert, aber es scheint für eine Vielzahl von Tests richtig zu sein. Dies ist nicht kleiner als Jelly, aber zumindest ist es kleiner als die (bisher) interpretierten Sprachen. Es scheint auch schneller zu sein und kann Eingaben mit einer Größenordnung von einer Milliarde in weniger als einer Sekunde verarbeiten. Zum Beispiel faktoriert 1234567890 + 3141592650i als (-9487 + 7990i) (-1 + -1i) (-395 + 336i) (2 + -1i) (1 + 1i) (3 + 0i) (3 + 0i) (4+ 1i) (- 1 + 1i) (- 1 + 2i), (hier klicken, um auf Wolfram Alpha zu testen)
Dies begann mit der gleichen Idee wie das naive Faktorisieren von ganzen Zahlen, um jede Zahl unter der fraglichen ganzen Zahl durchzugehen, zu sehen, ob sie sich teilt, und zu wiederholen, bis es fertig ist. Dann, inspiriert von anderen Antworten, wandelte es sich ... es faktorisiert wiederholt Elemente in einem Vektor. Es tut dies eine gute Anzahl von Malen, aber nicht "bis" irgendetwas. Die Anzahl der Iterationen wurde gewählt, um einen guten Teil der sinnvollen Eingaben abzudecken.
Es wird immer noch "(a mod b) == 0" verwendet, um zu testen, ob eine Ganzzahl eine andere teilt (für Gaußsche verwenden wir eingebautes Rust-Gaußsches Modulo und betrachten "0" als Norm == 0), jedoch die Prüfung auf "norm" ( a / b)! = 1 'verhindert, dass "zu viel" geteilt wird, so dass der resultierende Vektor im Grunde genommen nur mit Primzahlen gefüllt werden kann, aber kein Element des Vektors auf Einheit reduziert wird (0-i, 0 + i, -1 +) 0i, 1 + 0i) (was durch die Frage verboten ist).
Die for-loop-Grenzen wurden experimentell ermittelt. y geht von 1 auf, um eine Panik beim Teilen durch Null zu vermeiden, und x kann dank der Spiegelung der Gaußschen über die Quadranten von -999 auf 0 gehen (glaube ich?). In Bezug auf die Einschränkungen gab die ursprüngliche Frage keinen gültigen Bereich für die Eingabe / Ausgabe an, daher wird eine "angemessene Eingabegröße" angenommen ... (Bearbeiten ... ich bin jedoch nicht genau sicher, wie mit welcher Zahl dies berechnet werden soll Ich stelle mir vor, dass es Gaußsche Ganzzahlen gibt, die durch nichts unter 999 teilbar sind, aber für mich immer noch überraschend klein sind.
Probieren Sie die etwas ungolfed Version auf play.rust-lang.org
quelle
Perl 6 ,
141124 BytesVielen Dank an Jo King für -17 Bytes
Probieren Sie es online!
quelle
floor
Teil prüft, ob$_/w
(dh der aktuelle Faktor durch eine Zahl geteilt) eine ganze Zahl istPyth ,
5451454236 BytesProbieren Sie es online!
Akzeptiert Eingaben in Form
1+2j
- rein reelle oder imaginäre Zahlen die andere Komponente auslassen können (z9
,2j
). Die Ausgabe ist eine durch Zeilenumbrüche getrennte Liste komplexer Zahlen in der Form(1+2j)
, wobei rein imaginäre Zahlen den Realteil weglassen.Hierbei wird eine einfache Aufteilung der Pfade verwendet, bei der alle Gaußschen Ganzzahlen mit einer Größe größer als 1 und kleiner als der aktuelle Wert plus dem Wert selbst generiert werden. Diese werden gefiltert, um diejenigen Werte beizubehalten, die ein Faktor des Werts sind, und der kleinste Wert wird als nächster Primfaktor ausgewählt. Dies wird ausgegeben und der Wert wird durch ihn geteilt, um den Wert für die nächste Iteration zu erhalten.
Außerdem schlägt Pyth Jelly 😲 (ich erwarte aber nicht, dass es hält)
quelle