Gauss - Eisenstein


18

Gauss tamsayısı , , tam sayıdır ve hayali birimdir, en yakın olanı (Öklid mesafesine wrt) Eisenstein tamsayı burada , tamsayıdır ve .a+biabi=exp(πi/2)k+lωklω=exp(2πi/3)=(1+i3)/2

Arka fon

Muhtemelen her Gauss tamsayı benzersiz olarak yazılabilir aşikardır ile , tamsayılar. O kadar bariz ama yine de doğru değildir: Herhangi Eisenstein tamsayı benzersiz olarak yazılabilir ile , tamsayılar. Her ikisi de karmaşık sayılar içinde bir modülü oluşturur ve her ikisi de sırasıyla veya için -th siklotomik tamsayılarıdır . olduğuna dikkat edina+biabk+lωklZp=233+2i3+2ω

Kaynak: commons.wikimedia.org

ayrıntılar

  • Verilen karmaşık sayının en yakın iki veya üç noktaya sahip olması durumunda bunlardan herhangi biri döndürülebilir.

  • Karmaşık sayı dikdörtgen koordinatları (bazında verilmiştir ), ancak bunun dışında, herhangi bir uygun biçimde gibi ya da ya da vs.(1,i)(A,B)A+BiA+B*1j

  • Eisenstein tamsayı esas koordinatları olarak döndürülecek olan gibi uygun olan herhangi bir biçimde daha ancak diğer ya da ya da vs.(1,ω)(K,L)K+LωK+L*1ω

Örnekler

Tüm gerçek tamsayıların açık bir şekilde gerçek tamsayılarla eşleştirilmesi gerekir.

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




Ayrıca, a ve b'nin zıt işaretlere sahip olduğu test vakalarını da eklemelisiniz.
SmileAndNod

@SmileAndNod Bir tane eklendi. Ama bir de, tıpkı gerçek eksenine göre simetri kullanmak ve sadece yerini alabilir (1,w)ile (-1,1+w). Ayrıca , bu durumlar için doğru sonuçları vermenin yeterli olmadığını açıkça belirtmek için bu bölümü Örnekler olarak yeniden adlandırdım .
flawr

Yanıtlar:


7

APL (Dyalog Genişletilmiş) , 16 bayt SBCS

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

Çevrimiçi deneyin!

Daha ysonra xstandart girişten alınan ve 2 elemanlı bir tamsayı vektörü basan tam bir program .

Nasıl çalışır: matematik

Her şeyden önce, herhangi bir Gauss tamsayısının bir elmasın dikey diyagonaline yerleştirileceğini ve noktasının tamsayı için yerleştirileceğini .Z(x,3y)x,y

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

Şekilde ve . Dolayısıyla, bir noktanın dikey konumu göz önüne alındığında, en yakın Eisenstein noktasını aşağıdaki gibi tanımlayabiliriz: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

Bir Gauss noktası verildiğinde , ilk önce hangi elmasın ait olduğunu belirleriz, kaç tane elmas ( ile gösterilir ) ekseninden uzakta olduğuna göre ölçülür .PPhZx

h=P.y÷3

Sonra Eisenstein koordinatları olanZ

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

Şimdi, segmentlerinden hangisine ait olduğunu belirliyoruz . Bunun için göstergesini aşağıdaki gibi hesaplayabiliriz:WX¯,XY¯,YZ¯ Pw

w=P.y×3%3

Daha sonra sırasıyla karşılık gelir. Son olarak, en yakın Eisenstein noktası ( , veya ) şu şekilde hesaplanabilir:w=0,1,2YZ¯,XY¯,WX¯PZVX

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

ve kimliklerini kullanarak şunları basitleştirebiliriz:hw

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

Nasıl çalışır: kod

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 bayt

(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 baytı açık bir şekilde kesebilir. Açıklama: kve lbaşlangıçta kayan nokta çözümünü temsil eder k+ωl=a+ib. Ancak, koordinatların Öklid mesafesi ile en yakın tam sayıya yuvarlanması gerekiyordu. Bu nedenle kürsüye kve ldaha sonra bunları artırma yakın bir yerde yol açacağı belirlemek için fraksiyonel kısımlarında bazı testler, a+ib.


Kesirli kısımlardaki testlerinizin x'in her zaman 0,2887 veya 0,577 olduğu ve y'nin her zaman 0,1547 veya .577
SmileAndNod

@SmileAndNod 3 yıl önce? Gerçekten hatırlayamıyorum, ama bunun bu kadar karmaşık olduğunu düşünmüyorum, sadece elmasın en yakın köşesi olan çalışıyorum.
Neil

2

MATL , 39 38 35 bayt

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

Giriş formatı 6 + 14*1j(boşluk isteğe bağlıdır). Çıktı biçimi 14 16.

Çevrimiçi deneyin!

açıklama

Kod önce girişi karmaşık bir sayı olarak alır. Daha sonra karmaşık düzlemde yeterince büyük bir altıgen ızgara oluşturur, girdiye en yakın noktayı bulur ve Eisenstein "koordinatlarını" döndürür.

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 bayt

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]

Çevrimiçi deneyin!

Giriş Gauss tamsayısı (a, b) için, Eisenstein koordinatlarına, zemine ve tavana dönüştürün, en yakın Eisenstein tamsayısı için dört aday almak, minimum mesafeli olanı bulmak ve iade etmek.


1

Tcl , 124 116106 bayt

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

Çevrimiçi deneyin!

Bu, @Neil'in üç yaşındaki postasından ilham aldı

Zemin işlevi, kenarları 1 ve vektörleri olan eşkenar dörtgenin köşesini döndürür . Bu eşkenar dörtgen ile ilgili olarak, Gauss tamsayısı, üst (l eşitse) veya altta (l tek ise) dik iki kesiminde yer alır. Bu önemlidir çünkü sol alt köşenin veya sağ üst köşenin kabul edilebilir bir çözüm olacağı anlamına gelir. Sol alt köşe için k hesaplıyorum ve Gauss tamsayısının iki köşeyi ayıran diyagonalin üstünde mi altında mı olduğunu görmek için bir test yapıyorum; Diyagonalin üstündeyken k'ye 1 eklerim ve aynı şekilde l için de yaparım.ω

Diyagonal d'nin çapraz ürün vxd'sinin işareti v vektörü sağ alt köşeye ve (a, b) işaretini kullanarak diyagonalin hangi tarafının bulunduğu test olarak 10 bayt kaydedildi.


1

Burlesque , 24 bayt

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

Çevrimiçi deneyin!

Bunun daha kısa olabileceğinden eminim. Giriş şu şekilde okunura 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.