Dado un entero gaussiano donde , son enteros e es la unidad imaginaria, devuelve el entero más cercano (wrt a la distancia euclidiana) Eisenstein entero donde , son enteros y .
Antecedentes
Probablemente sea bastante obvio que cada entero gaussiano se puede escribir de forma única como con , enteros. No es tan obvio pero sí cierto: cualquier entero de Eisenstein puede escribirse únicamente como con , enteros. Ambos forman un módulo dentro de los números complejos, y ambos son números enteros ciclotómicos p-th para o respectivamente. Tenga en cuenta que
Fuente: commons.wikimedia.org
Detalles
En caso de que el número complejo dado tenga dos o tres puntos más cercanos, se puede devolver cualquiera de ellos.
El número complejo se da en coordenadas rectangulares (base ), pero aparte de eso en cualquier formato conveniente como
(A,B)
oA+Bi
oA+B*1j
etc.- El número entero Eisenstein tiene que ser devuelto como coordenadas de la base pero aparte de eso en cualquier formato conveniente como
(K,L)
oK+Lω
oK+L*1ω
etc.
Ejemplos
Obviamente, todos los enteros reales deberían asignarse a los enteros reales nuevamente.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
con(-1,1+w)
. Y también cambié el nombre de esta sección a Ejemplos para dejar en claro que no es suficiente proporcionar los resultados correctos para estos casos.Respuestas:
APL (Dyalog Extended) , SBCS de 16 bytes
Pruébalo en línea!
Un programa completo que se lleva a
y
continuaciónx
de la entrada estándar e imprime un vector de 2 elementos de números enteros.Cómo funciona: las matemáticas
En primer lugar, tenga en cuenta que cualquier número entero gaussiano se colocará en la diagonal vertical de un diamante, con el puntoZ colocado en (x,3–√y) para algún número enterox,y .
En la figura,WZ¯¯¯¯¯¯¯¯¯=3–√ yWX¯¯¯¯¯¯¯¯¯¯=XY¯¯¯¯¯¯¯¯=YZ¯¯¯¯¯¯¯=XV¯¯¯¯¯¯¯¯=YV¯¯¯¯¯¯¯¯=13√ . Entonces, dada la posición vertical de un punto, podemos identificar el punto de Eisenstein más cercano de la siguiente manera:
Then the Eisenstein coordinates ofZ are
Now, we determine which of the segmentsWX¯¯¯¯¯¯¯¯¯¯,XY¯¯¯¯¯¯¯¯,YZ¯¯¯¯¯¯¯ P belongs to. For this, we can calculate the indicator w as follows:
Then the casesw=0,1,2 correspond to YZ¯¯¯¯¯¯¯,XY¯¯¯¯¯¯¯¯,WX¯¯¯¯¯¯¯¯¯¯ respectively. Finally, the nearest Eisenstein point of P (which is one of Z , V , or X ) can be calculated as:
Using the identities forh and w , we can further simplify to:
How it works: the code
fuente
JavaScript (ES6), 112 bytes
ES7 can obviously trim 9 bytes. Explanation:
k
andl
initially represent the floating-point solution tok+ωl=a+ib
. However, the coordinates needed to be rounded to the nearest integer by Euclidean distance. I therefore take the floor ofk
andl
, then perform some tests on the fractional parts to determine whether incrementing them would result in a nearer point toa+ib
.fuente
MATL,
393835 bytesInput format is
6 + 14*1j
(space is optional). Output format is14 16
.Try it online!
Explanation
The code first takes the input as a complex number. It then generates a big enough hexagonal grid in the complex plane, finds the point that is closest to the input, and returns its Eisenstein "coordinates".
fuente
Haskell, 128 bytes
Try it online!
For input Gaussian integer (a,b), convert it into Eisenstein coordinates, floor and ceil both components to get four candidates for closest Eisenstein integer, find the one with minimal distance and return it.
fuente
Tcl,
124116106 bytesTry it online!
This is somewhat inspired by the three-year old post from @Neil
The floor function returns the corner of the rhombus whose edges are the vectors 1 andω . With respect to this rhombus, the Gaussian integer lies on the perpendicular bi-sector of either the top (if l is even) or bottom (if l is odd). This is important because it means that either the lower left corner or the upper right corner will be an acceptable solution. I compute k for the lower left corner, and do one test to see if the Gaussian integer lies above or below the diagonal separating the two corners; I add 1 to k when above the diagonal, and I do likewise for l.
Saved 10 bytes by using the "sign of the cross-product v x d of the diagonal d with the vector v joining the lower right corner and (a,b)" as the test for which side of the diagonal the point lies.
fuente
Burlesque, 24 bytes
Try it online!
Pretty sure this can be shorter. Input read as
a b
fuente
05AB1E, 13 bytes
Port of Bubbler's APL answer
Try it online!
Input and output are both y first, x second.
fuente