Bei einer Gaußschen Ganzzahl wobei , ganze Zahlen sind und die imaginäre Einheit ist, kehre die Eisenstein-Ganzzahl wobei , sind ganze Zahlen und .
Hintergrund
Es ist wahrscheinlich ziemlich offensichtlich, dass jede Gaußsche Ganzzahl eindeutig als mit , Ganzzahlen geschrieben werden kann. Es ist nicht so offensichtlich, aber dennoch wahr: Jede Eisenstein-Ganzzahl kann eindeutig als mit , ganzen Zahlen geschrieben werden. Sie bilden beide ein Modul innerhalb der komplexen Zahlen und sind beide p-te cyclotomische ganze Zahlen für bzw. . Man beachte, dass
Quelle: commons.wikimedia.org
Einzelheiten
Falls die gegebene komplexe Zahl zwei oder drei nächstliegende Punkte hat, kann jeder von diesen zurückgegeben werden.
Die komplexe Zahl wird in Rechteckkoordinaten (Basis) angegeben ) angegeben, jedoch nicht in einem geeigneten Format wie
(A,B)
oderA+Bi
oderA+B*1j
usw.- Die Eisenstein-Ganzzahl muss als Koordinaten der Basis zurückgegeben werden jedoch nicht in einem geeigneten Format wie
(K,L)
oderK+Lω
oderK+L*1ω
usw.
Beispiele
Alle reellen Ganzzahlen sollten natürlich wieder auf die reellen Ganzzahlen abgebildet werden.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
mit(-1,1+w)
. Außerdem habe ich diesen Abschnitt in " Beispiele" umbenannt , um zu verdeutlichen, dass es nicht ausreicht, nur die richtigen Ergebnisse für diese Fälle bereitzustellen.Antworten:
APL (Dyalog Extended) , 16 Byte SBCS
Probieren Sie es online!
Ein volles Programm, das dauert
y
dannx
aus der Standardeingabe einen 2-Element-Vektor von ganzen Zahlen ausgibt.Wie es funktioniert: die Mathematik
Zuallererst ist zu beachten, dass jede Gaußsche Ganzzahl auf der vertikalen Diagonale eines Diamanten platziert wird, wobei der PunktZ bei ( x , 3-√y) für eine ganze Zahlx , y .
In der Figur istWZ¯¯¯¯¯¯¯¯¯= 3-√ undWX¯¯¯¯¯¯¯¯¯¯= XY.¯¯¯¯¯¯¯¯= YZ¯¯¯¯¯¯¯= XV¯¯¯¯¯¯¯¯=YV¯¯¯¯¯¯¯¯= 13√
Nun bestimmen wir, welches der SegmenteWX¯¯¯¯¯¯¯¯¯¯, XY.¯¯¯¯¯¯¯¯, YZ¯¯¯¯¯¯¯ P gehört. Dafür können wir den Indikator berechnenw wie folgt:
Dann die Fällew = 0 , 1 , 2 entsprechen Y.Z¯¯¯¯¯¯¯, XY.¯¯¯¯¯¯¯¯, WX¯¯¯¯¯¯¯¯¯¯ beziehungsweise. Schließlich der nächste Eisensteiner Punkt vonP (das ist einer von Z , V , oder X ) kann berechnet werden als:
Verwendung der Identitäten fürh und w können wir weiter vereinfachen:
Wie es funktioniert: der Code
quelle
JavaScript (ES6), 112 Byte
ES7 kann offensichtlich 9 Bytes trimmen. Erklärung:
k
und stellenl
zunächst die Gleitkomma-Lösung dark+ωl=a+ib
. Die Koordinaten mussten jedoch durch euklidischen Abstand auf die nächste ganze Zahl gerundet werden. Ich nehme daher das Wortk
undl
führe dann einige Tests an den Bruchteilen durch, um festzustellen, ob deren Inkrementierung zu einem näheren Punkt führen würdea+ib
.quelle
MATL ,
393835 BytesDas Eingabeformat ist
6 + 14*1j
(Leerzeichen ist optional). Ausgabeformat ist14 16
.Probieren Sie es online!
Erläuterung
Der Code nimmt die Eingabe zunächst als komplexe Zahl entgegen. Dann erzeugt es ein ausreichend großes hexagonales Gitter in der komplexen Ebene, findet den Punkt, der der Eingabe am nächsten liegt, und gibt seine Eisenstein- "Koordinaten" zurück.
quelle
Haskell , 128 Bytes
Probieren Sie es online!
Für die Eingabe der Gaußschen Ganzzahl (a, b) konvertieren Sie diese in Eisenstein-Koordinaten, Floor und Ceil, um vier Kandidaten für die nächstgelegene Eisenstein-Ganzzahl zu erhalten. Suchen Sie diejenige mit minimalem Abstand und geben Sie sie zurück.
quelle
Tcl ,
124116106 BytesProbieren Sie es online!
Dies ist ein wenig inspiriert von dem dreijährigen Beitrag von @Neil
Die Floor-Funktion gibt die Ecke der Raute zurück, deren Kanten die Vektoren 1 und sindω . In Bezug auf diese Raute liegt die Gaußsche Ganzzahl auf dem senkrechten Bissektor von oben (wenn l gerade ist) oder unten (wenn l ungerade ist). Dies ist wichtig, da dies bedeutet, dass entweder die untere linke Ecke oder die obere rechte Ecke eine akzeptable Lösung darstellt. Ich berechne k für die untere linke Ecke und mache einen Test, um festzustellen, ob die Gaußsche Ganzzahl über oder unter der Diagonale liegt, die die beiden Ecken trennt. Ich addiere 1 zu k, wenn über der Diagonale, und ich tue ebenso für l.
Es wurden 10 Bytes gespeichert, indem das "Vorzeichen des Kreuzprodukts vxd der Diagonale d mit dem Vektor v, der die untere rechte Ecke und (a, b) verbindet" als Test verwendet wurde, für welche Seite der Diagonale der Punkt liegt.
quelle
Burlesque , 24 Bytes
Probieren Sie es online!
Ziemlich sicher, dass dies kürzer sein kann. Eingabe gelesen als
a b
quelle
05AB1E , 13 Bytes
Port of Bubbler APL Antwort
Probieren Sie es online!
Input und Output sind beide y first, x second.
quelle