เกาส์กับไอเซนสไตน์


18

กำหนด Gaussian จำนวนเต็มที่,เป็นจำนวนเต็มและเป็นหน่วยจินตภาพกลับมาที่ใกล้เคียงที่สุด (WRT กับระยะทางแบบยุคลิด) Eisenstein จำนวนเต็มที่ ,เป็นจำนวนเต็มและ 2a+biabi=exp(πi/2)k+lωklω=exp(2πi/3)=(1+i3)/2

พื้นหลัง

อาจเป็นที่ชัดเจนว่าจำนวนเต็มแบบเกาส์ทั้งหมดสามารถเขียนเป็นด้วย ,จำนวนเต็มได้ มันไม่ชัดเจนนัก แต่จริงอยู่: จำนวนเต็ม Eisenstein ใด ๆ สามารถเขียนเป็นด้วยจำนวนเต็ม ,พวกเขาทั้งสองรูปแบบโมดูลภายในจำนวนเชิงซ้อนและเป็นทั้งจำนวนเต็มที่ cyclotomic p-th สำหรับหรือตามลำดับ โปรดทราบว่าa+biabk+lωklZp=233+2i3+2ω

ที่มา: commons.wikimedia.org

รายละเอียด

  • ในกรณีที่จำนวนเชิงซ้อนที่กำหนดมีจุดที่ใกล้เคียงที่สุดสองหรือสามจุดใด ๆ เหล่านั้นสามารถส่งคืนได้

  • จำนวนที่ซับซ้อนจะได้รับในพิกัดฉาก (พื้นฐาน ) แต่กว่าที่อื่น ๆ ในรูปแบบที่สะดวกใด ๆ เช่นหรือหรือฯลฯ(1,i)(A,B)A+BiA+B*1j

  • Eisenstein จำนวนเต็มจะต้องมีการกลับมาเป็นพิกัดของพื้นฐานแต่นอกเหนือจากที่อยู่ในรูปแบบที่สะดวกใด ๆ เช่นหรือหรือฯลฯ(1,ω)(K,L)K+LωK+L*1ω

ตัวอย่าง

จำนวนเต็มจริงทั้งหมดควรถูกแมปกับจำนวนจริงอย่างชัดเจนอีกครั้ง

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

ดีฉันจำการเห็นตารางหกเหลี่ยมไม่ได้ตั้งแต่codegolf.stackexchange.com/q/70017/17602
Neil



คุณควรรวมกรณีทดสอบเมื่อ a และ b มีเครื่องหมายตรงกันข้าม
SmileAndNod

@SmileAndNod เพิ่มแล้ว แต่สิ่งหนึ่งที่ยังสามารถใช้เพียงสมมาตรด้วยความเคารพกับแกนจริงและเพียงแทนที่ด้วย(1,w) (-1,1+w)และฉันยังเปลี่ยนชื่อส่วนนี้เป็นตัวอย่างเพื่อให้ชัดเจนว่าไม่เพียงพอที่จะให้ผลลัพธ์ที่ถูกต้องสำหรับกรณีเหล่านี้
ข้อผิดพลาด

คำตอบ:


7

APL (Dyalog Extended) , 16 ไบต์SBCS

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

ลองออนไลน์!

โปรแกรมเต็มรูปแบบที่ใช้yแล้วxจากอินพุตมาตรฐานและพิมพ์เวกเตอร์ 2 องค์ประกอบของจำนวนเต็ม

มันทำงานอย่างไร: คณิตศาสตร์

ก่อนอื่นให้สังเกตว่าจำนวนเต็มแบบเกาส์ใด ๆ จะวางบนเส้นทแยงมุมแนวตั้งของเพชรโดยมีจุดZ(x,3y)x,y

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

WZ¯=3WX¯=XY¯=YZ¯=XV¯=YV¯=13

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

PPhZx

h=P.y÷3

Z

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

WX¯,XY¯,YZ¯ Pw

w=P.y×3%3

w=0,1,2YZ¯,XY¯,WX¯PZVX

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

hw

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

มันทำงานอย่างไร: รหัส

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 ไบต์

(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 สามารถเล็มได้ 9 ไบต์อย่างเห็นได้ชัด คำอธิบาย: kและในขั้นต้นเป็นตัวแทนของการแก้ปัญหาจุดลอยไปl k+ωl=a+ibอย่างไรก็ตามพิกัดที่จำเป็นต้องถูกปัดเศษเป็นจำนวนเต็มที่ใกล้ที่สุดด้วยระยะทางแบบยุคลิด ดังนั้นฉันจึงใช้พื้นkและlจากนั้นทำการทดสอบบางอย่างกับส่วนที่เป็นเศษส่วนเพื่อพิจารณาว่าการเพิ่มขึ้นของพวกมันจะส่งผลให้เกิดจุดที่ใกล้กว่าa+ibหรือไม่


ฉันเดาว่าการทดสอบของคุณในส่วนที่เป็นเศษส่วนนั้นใช้ประโยชน์จากข้อเท็จจริงที่ว่า x อยู่เสมอ 0.2887 หรือ 0.577 และ y จะเท่ากับ 0.1547 หรือ. 577 เสมอ
SmileAndNod

@SmileAndNod 3 ปีที่แล้ว? ฉันจำไม่ได้จริงๆ แต่ฉันไม่คิดว่ามันซับซ้อนขนาดนั้นฉันแค่ออกกำลังกายซึ่งเป็นมุมที่ใกล้ที่สุดของเพชร
Neil

2

MATL , 39 38 35 ไบต์

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

รูปแบบอินพุตคือ6 + 14*1j(เว้นวรรคเป็นทางเลือก) 14 16รูปแบบการออกเป็น

ลองออนไลน์!

คำอธิบาย

รหัสแรกรับอินพุตเป็นจำนวนเชิงซ้อน จากนั้นจะสร้างกริดหกเหลี่ยมที่ใหญ่พอในระนาบเชิงซ้อนค้นหาจุดที่อยู่ใกล้กับอินพุตมากที่สุดและส่งกลับ "พิกัด" ของไอเซนสไตน์

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 ไบต์

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]

ลองออนไลน์!

สำหรับอินพุต Gaussian integer (a, b) ให้แปลงเป็น Eisenstein พิกัดพื้นและเพดานทั้งสองส่วนประกอบเพื่อรับ 4 ตัวเลือกสำหรับจำนวนเต็ม Eisenstein ที่ใกล้เคียงที่สุดหาค่าที่มีระยะทางน้อยที่สุดและส่งกลับมา


1

Tcl , 124 116 106 106 ไบต์

{{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}}

ลองออนไลน์!

นี่เป็นแรงบันดาลใจจากโพสต์สามปีจาก @Neil

ω

บันทึก 10 ไบต์โดยใช้ "เครื่องหมายของผลิตภัณฑ์กากบาท vxd ของเส้นทแยงมุม d กับเวกเตอร์ v ที่มุมล่างขวาและ (a, b)" เป็นการทดสอบว่าจุดใดอยู่ในแนวทแยงมุม



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.