Étant donné un entier gaussien où , sont des entiers et est l'unité imaginaire, retournez l'entier d'Eisenstein le plus proche (wrt à la distance euclidienne) où , sont entiers et .
Contexte
Il est probablement assez évident que chaque entier gaussien peut uniquement être écrit comme avec , entiers. Ce n'est pas si évident, mais néanmoins vrai: tout entier d'Eisenstein peut uniquement être écrit comme avec , entiers. Ils forment tous les deux un module dans les nombres complexes et sont tous les deux des p-èmes nombres cyclotomiques pour ou respectivement. Notez que
Source: commons.wikimedia.org
Détails
Dans le cas où le nombre complexe donné a deux ou trois points les plus proches, n'importe lequel d'entre eux peut être retourné.
Le nombre complexe est donné en coordonnées rectangulaires (base ), mais autre que celui dans n'importe quel format pratique comme
(A,B)
ouA+Bi
ouA+B*1j
etc.- L'entier d'Eisenstein doit être retourné en tant que coordonnées de la base mais autre que celui dans n'importe quel format pratique comme
(K,L)
ouK+Lω
ouK+L*1ω
etc.
Exemples
Tous les entiers réels doivent évidemment être à nouveau mappés aux entiers réels.
6,14 -> 14,16
7,16 -> 16,18
-18,-2 ->-19,-2
-2, 2 -> -1, 2
-1, 3 -> 1, 4
(1,w)
par(-1,1+w)
. Et j'ai également renommé cette section en Exemples pour indiquer clairement qu'il ne suffit pas de fournir les bons résultats pour ces cas.Réponses:
APL (Dyalog Extended) , 16 octets SBCS
Essayez-le en ligne!
Un programme complet qui prend
y
ensuitex
de l'entrée standard et imprime un vecteur d'entiers à 2 éléments.Comment ça marche: les mathématiques
Tout d'abord, notez que tout entier gaussien sera placé sur la diagonale verticale d'un diamant, avec le pointZ placé à(x,3–√y) pour un entierx,y .
Sur la figure,WZ¯¯¯¯¯¯¯¯¯=3–√ etWX¯¯¯¯¯¯¯¯¯¯=XY¯¯¯¯¯¯¯¯=YZ¯¯¯¯¯¯¯=XV¯¯¯¯¯¯¯¯=YV¯¯¯¯¯¯¯¯=13√ . Donc, étant donné la position verticale d'un point, nous pouvons identifier le point d'Eisenstein le plus proche comme suit:
Using the identities forh and w , we can further simplify to:
How it works: the code
la source
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
.la source
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".
la source
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.
la source
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.
Enregistrement de 10 octets en utilisant le "signe du produit croisé vxd de la diagonale d avec le vecteur v joignant le coin inférieur droit et (a, b)" comme test pour quel côté de la diagonale se situe le point.
la source
Burlesque , 24 octets
Essayez-le en ligne!
Je suis sûr que cela peut être plus court. Entrée lue comme
a b
la source
05AB1E , 13 octets
Réponse APL du port de Bubbler
Essayez-le en ligne!
L'entrée et la sortie sont toutes les deux y d'abord, x secondes.
la source