Gauss đến Eisenstein


18

Cho một Gaussian nguyên a+bi nơi a , b là các số nguyên và i=exp(πi/2) là đơn vị ảo, trả lại gần (wrt để khoảng cách Euclide) Eisenstein số nguyên k+lω nơi k , l là số nguyên và ω=exp(2πi/3)=(1+i3)/2.

Lý lịch

Có lẽ khá rõ ràng rằng mọi số nguyên Gaussian có thể được viết duy nhất là a+bi với các số nguyên a , b . Nó không phải là quá rõ ràng nhưng dù sao đúng: Bất kỳ Eisenstein số nguyên duy nhất có thể được viết như k+lω với k , l số nguyên. Cả hai đều tạo thành một mô-đun Z trong các số phức và cả hai số nguyên cyclotomic p-th cho p=2 hoặc 3 tương ứng. Lưu ý rằng 3+2i3+2ω

Nguồn: commons.wik mega.org

Chi tiết

  • Trong trường hợp số phức đã cho có hai hoặc ba điểm gần nhất, bất kỳ điểm nào trong số đó có thể được trả về.

  • Số phức được đưa ra trong tọa độ vuông góc (cơ sở (1,i) ), nhưng khác hơn là ở bất kỳ định dạng thuận tiện như (A,B)hoặc A+Bihoặc A+B*1j, vv

  • Các Eisenstein số nguyên phải được trả lại như tọa độ của cơ sở (1,ω) nhưng khác hơn là ở bất kỳ định dạng thuận tiện như (K,L)hoặc K+Lωhoặc K+L*1ω, vv

Ví dụ

Tất cả các số nguyên thực sự rõ ràng nên được ánh xạ tới các số nguyên thực một lần nữa.

  6,14 -> 14,16
  7,16 -> 16,18
-18,-2 ->-19,-2
 -2, 2 -> -1, 2
 -1, 3 -> 1, 4

Thật tuyệt, tôi không nhớ đã nhìn thấy một lưới lục giác kể từ codegolf.stackexchange.com/q/70017/17602
Neil



Bạn cũng nên bao gồm các trường hợp thử nghiệm khi a và b có dấu hiệu trái ngược nhau.
SmileAndNod

@SmileAndNod Đã thêm một. Nhưng người ta cũng có thể chỉ sử dụng đối xứng với trục thực và chỉ cần thay thế (1,w)bằng (-1,1+w). Và tôi cũng đổi tên phần này thành Ví dụ để làm rõ rằng việc cung cấp kết quả đúng cho những trường hợp này là không đủ.
flawr

Câu trả lời:


7

APL (Dyalog Extended) , 16 byte SBCS

0+⌈3÷⍨1 2×⌊⎕×√3

Hãy thử trực tuyến!

Một chương trình đầy đủ mà mất ythì xtừ đầu vào tiêu chuẩn và in một vector 2 yếu tố của số nguyên.

Cách thức hoạt động: toán học

Trước hết, lưu ý rằng bất kỳ số nguyên Gaussian sẽ được đặt trên đường chéo dọc của một viên kim cương, với điểm Z đặt tại (x,3y)cho một số nguyênx,y.

      + W
     /|\
    / | \
   /  |  \
  /   + X \
 /    |    \
+-----|-----+V
 \    |    /
  \   + Y /
   \  |  /
    \ | /
     \|/
      + Z

Trong hình, WZ¯=3WX¯=XY¯=YZ¯=XV¯=YV¯=13 . Vì vậy, với vị trí thẳng đứng của một điểm, chúng ta có thể xác định điểm Eisenstein gần nhất như sau:

Given a point PWZ¯,{PWX¯the nearest point is WPXY¯the nearest point is VPYZ¯the nearest point is Z

Cho điểm Gaussian P , trước tiên chúng ta xác định kim cương P thuộc về loại nào, được đo bằng bao nhiêu viên kim cương (ký hiệu là h ) Z cách xa x -axis.

h=P.y÷3

Khi đó tọa độ Eisenstein của Z

Z.xE=P.x+h,Z.yE=2h

Bây giờ, chúng tôi xác định các phân đoạn WX¯,XY¯,YZ¯ P thuộc về. Đối với điều này, chúng ta có thể tính toán chỉ số w như sau:

w=P.y×3%3

Sau đó, các trường hợp w=0,1,2 tương ứng với YZ¯,XY¯,WX¯ tương ứng. Cuối cùng, điểm Eisenstein gần nhất của P (là một trong Z , V hoặc X ) có thể được tính như sau:

PE.xE=P.x+h+w2,PE.yE=2h+w

Sử dụng danh tính cho hw , chúng ta có thể đơn giản hóa hơn nữa để:

y=P.y×3,PE.xE=P.x+y÷3,PE.yE=2y÷3

Cách thức hoạt động: mã

0+⌈3÷⍨1 2×⌊⎕×√3
           ⌊⎕×√3   Take the first input (P.y) and calculate y'
   ⌈3÷⍨1 2×       ⍝ Calculate [ceil(y'/3), ceil(2y'/3)]
⎕0+  ⍝ Take the second input(P.x) and calculate [P.x+ceil(y'/3), ceil(2y'/3)]

2

JavaScript (ES6), 112 byte

(a,b,l=b/Math.pow(.75,.5),k=a+l/2,f=Math.floor,x=k-(k=f(k)),y=l-(l=f(l)),z=x+y>1)=>[k+(y+y+z>x+1),l+(x+x+z>y+1)]

ES7 rõ ràng có thể cắt 9 byte. Giải thích: klban đầu đại diện cho giải pháp dấu phẩy động tới k+ωl=a+ib. Tuy nhiên, tọa độ cần được làm tròn đến số nguyên gần nhất theo khoảng cách Euclide. Do đó, tôi lấy sàn kl, sau đó thực hiện một số thử nghiệm trên các phần phân số để xác định xem việc tăng chúng có dẫn đến điểm gần hơn không a+ib.


Tôi đoán các bài kiểm tra của bạn về các phần phân số đang lợi dụng sự thật rằng x luôn là 0,2887 hoặc 0,577 và y luôn là 0,1547 hoặc 0,55
SmileAndNod

@SmileAndNod 3 năm trước? Tôi thực sự không thể nhớ, nhưng tôi không nghĩ nó phức tạp đến thế, tôi chỉ đang tìm ra đó là góc gần nhất của viên kim cương.
Neil

2

MATL , 39 38 35 byte

t|Ekt_w&:2Z^tl2jYP3/*Zeh*!sbw6#YkY)

Định dạng đầu vào là 6 + 14*1j(không gian là tùy chọn). Định dạng đầu ra là 14 16.

Hãy thử trực tuyến!

Giải trình

Mã đầu tiên lấy đầu vào là một số phức. Sau đó, nó tạo ra một lưới lục giác đủ lớn trong mặt phẳng phức, tìm điểm gần nhất với đầu vào và trả về "tọa độ" Eisenstein của nó.

t         % Take input implicitly. This is the Gauss number, say A. Duplicate
|Ek       % Absolute value times two, rounded down
t_        % Duplicate and negate
w&:       % Range. This is one axis of Eisenstein coordinates. This will generate
          % the hexagonal grid big enough
2Z^       % Cartesian power with exponent 2. This gives 2-col 2D array, say B
t         % Duplicate
l         % Push 1
2jYP3/*   % Push 2*j*pi/3
Ze        % Exponential
h         % Concatenate. Gives [1, exp(2*j*pi/3)]
*         % Multiply by B, with broadcast.
!s        % Sum of each row. This is the hexagonal grid as a flattened array, say C
bw        % Bubble up, swap. Stack contains now, bottom to top: B, A, C
6#Yk      % Index of number in C that is closest to A
Y)        % Use as row index into B. Implicitly display

2

Haskell , 128 byte

i=fromIntegral;r=[floor,ceiling];a!k=(i a-k)**2;c(a,b)|l<-2*i b/sqrt 3,k<-i a+l/2=snd$minimum[(x k!k+y l!l,(x k,y l))|x<-r,y<-r]

Hãy thử trực tuyến!

Đối với số nguyên Gaussian đầu vào (a, b), chuyển đổi nó thành tọa độ Eisenstein, sàn và trần cả hai thành phần để có bốn ứng cử viên cho số nguyên Eisenstein gần nhất, tìm một số có khoảng cách tối thiểu và trả về nó.


1

Tcl , 124 116 106 byte

{{a b f\ int(floor(2*$b/3**.5)) {l "[expr $f+(1-$f%2<($b-$f)*3**.5)]"}} {subst [expr $l+$a-($f+1)/2]\ $l}}

Hãy thử trực tuyến!

Điều này phần nào lấy cảm hứng từ bài đăng ba năm từ @Neil

ω

Đã lưu 10 byte bằng cách sử dụng "dấu hiệu của vxd sản phẩm chéo của đường chéo d với vectơ v nối với góc dưới bên phải và (a, b)" làm phép thử cho cạnh bên của đường chéo nằm ở điểm nào.


1

Burlesque , 24 byte

pe@3r@2././J2./x/.+CL)R_

Hãy thử trực tuyến!

Khá chắc chắn rằng điều này có thể ngắn hơn. Đầu vào đọc làa b

pe      # Parse input to two ints
@3r@2./ # sqrt(3)/2
./      # Divide b by sqrt(3)/2
J2./    # Duplicate and divide by 2
x/.+    # swap stack around and add to a
CL      # Collect the stack to a list
)R_     # Round to ints

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.