Biorąc pod uwagę liczbę całkowitą Gaussa gdzie , są liczbami całkowitymi, a jest jednostką urojoną, zwraca najbliższą (wrt na odległość euklidesową) liczbę całkowitą Eisensteina gdzie , są liczbami całkowitymi, a .
tło
Jest prawdopodobnie całkiem oczywiste, że każdą liczbę całkowitą Gaussa można jednoznacznie zapisać jako z liczbami całkowitymi , . Nie jest to tak oczywiste, ale mimo to prawdziwe: każda liczba całkowita Eisensteina może być jednoznacznie zapisana jako z liczbami całkowitymi , . Oba tworzą moduł w obrębie liczb zespolonych i oba są p-tymi cyklotomicznymi liczbami całkowitymi odpowiednio dla lub . Zauważ, że
Źródło: commons.wikimedia.org
Detale
W przypadku, gdy podana liczba zespolona ma dwa lub trzy najbliższe punkty, dowolny z nich można zwrócić.
Kompleks numer znajduje się w układzie współrzędnych prostokątnych (podstawa ), ale poza tym w dowolnej dogodnej postaci, jak i albo itp
(A,B)
A+Bi
A+B*1j
- Eisenstein całkowitą musi być zwrócony w współrzędnych podstawy , ale poza tym w każdej dogodnej postaci, jak i albo itp
(K,L)
K+Lω
K+L*1ω
Przykłady
Wszystkie prawdziwe liczby całkowite powinny oczywiście zostać ponownie zmapowane na rzeczywiste liczby całkowite.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
ją(-1,1+w)
. Zmieniłem też nazwę tej sekcji na Przykłady, aby wyjaśnić, że nie wystarczy podać właściwe wyniki dla tych przypadków.Odpowiedzi:
APL (Dyalog Extended) , 16 bajtów SBCS
Wypróbuj online!
Pełny program, który pobiera
y
następniex
ze standardowego wejścia i drukuje 2-elementowy wektor liczb całkowitych.Jak to działa: matematyka
Jak to działa: kod
źródło
JavaScript (ES6), 112 bajtów
ES7 może oczywiście przyciąć 9 bajtów. Objaśnienie:
k
il
początkowo reprezentuje rozwiązanie zmiennoprzecinkowe dlak+ωl=a+ib
. Jednak współrzędne musiały zostać zaokrąglone do najbliższej liczby całkowitej o odległość euklidesową. I w związku z tym podjąć podłogęk
il
, a następnie wykonać kilka testów na częściach ułamkowych do określenia, czy je zwiększając doprowadziłoby do punktu bliżeja+ib
.źródło
MATL ,
393835 bajtówFormat wejściowy to
6 + 14*1j
(spacja jest opcjonalna). Format wyjściowy to14 16
.Wypróbuj online!
Wyjaśnienie
Kod najpierw przyjmuje dane wejściowe jako liczbę zespoloną. Następnie generuje wystarczająco dużą siatkę heksagonalną w złożonej płaszczyźnie, znajduje punkt najbliższy wejściowi i zwraca „współrzędne” Eisensteina.
źródło
Haskell , 128 bajtów
Wypróbuj online!
Aby wprowadzić liczbę całkowitą Gaussa (a, b), przekonwertuj ją na współrzędne Eisensteina, podłogę i sufit obu komponentów, aby uzyskać czterech kandydatów na najbliższą liczbę całkowitą Eisensteina, znajdź tę z minimalną odległością i zwróć ją.
źródło
Tcl ,
124116106 bajtówWypróbuj online!
Jest to nieco inspirowane trzyletnim postem z @Neil
Zaoszczędzono 10 bajtów, używając „znaku iloczynu krzyżowego vxd przekątnej d z wektorem v łączącym prawy dolny róg i (a, b)” jako testu, po której stronie przekątnej leży punkt.
źródło
Burleska , 24 bajty
Wypróbuj online!
Jestem pewien, że może to być krótsze. Dane wejściowe czytane jako
a b
źródło
05AB1E , 13 bajtów
Odpowiedź APL Portu Bubblera
Wypróbuj online!
Wejścia i wyjścia są zarówno y y, x sekunda.
źródło