ईसेनस्टीन को गॉस


18

गौसियन पूर्णांक को देखते हुए a जहां , पूर्णांक होते हैं और काल्पनिक इकाई है, निकटतम (यूक्लिडियन दूरी पर ) Esterstein पूर्णांक जहां , पूर्णांक और ।a+biabi=exp(πi/2)k+lωklω=exp(2πi/3)=(1+i3)/2

पृष्ठभूमि

यह शायद काफी स्पष्ट है कि प्रत्येक गाऊसी पूर्णांक को विशिष्ट रूप से , पूर्णांक के साथ रूप में लिखा जा सकता है । यह इतना स्पष्ट नहीं है, लेकिन फिर भी यह सच है: कोई भी ईसेनस्टीन पूर्णांक विशिष्ट रूप से , पूर्णांक के साथ रूप में लिखा जा सकता है । वे दोनों जटिल संख्या के भीतर एक -module बनाते हैं, और क्रमशः या लिए दोनों 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

अच्छा, मुझे याद नहीं है कि कोडगॉल्फ.स्टैकएक्सचेंज.com
नील



जब ए और बी विपरीत संकेत होते हैं तो आपको परीक्षण मामलों को भी शामिल करना चाहिए।
SmileAndNod

@SmileAndNod ने एक जोड़ा। लेकिन कोई भी वास्तविक अक्ष के संबंध में समरूपता का उपयोग कर सकता है और बस के (1,w)साथ बदल सकता है (-1,1+w)। और मैंने इस खंड का नाम बदलकर उदाहरण भी दिया कि यह स्पष्ट नहीं है कि इन मामलों के लिए केवल सही परिणाम प्रदान करना पर्याप्त नहीं है।
दोष

जवाबों:


7

एपीएल (Dyalog विस्तारित) , 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

फिर के Eisenstein निर्देशांक हैं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

जावास्क्रिप्ट (ईएस 6), 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 हमेशा .2887 या 0.577and y हमेशा या तो .1547 या .577 है
SmileAndNod

@SmileAndNod 3 साल पहले? मैं वास्तव में याद नहीं कर सकता, लेकिन मुझे नहीं लगता कि यह इतना जटिल है, मैं बस काम कर रहा हूं जो हीरे का सबसे निकटतम कोना है।
नील

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

हास्केल , 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]

इसे ऑनलाइन आज़माएं!

इनपुट गॉसियन पूर्णांक (ए, बी) के लिए, इसे ईसेनस्टीन निर्देशांक, मंजिल में परिवर्तित करें और दोनों घटकों को निकटतम ईसेनस्टीन पूर्णांक के लिए चार उम्मीदवार प्राप्त करने के लिए, न्यूनतम दूरी के साथ एक को ढूंढें और इसे वापस लौटाएं।


1

Tcl , 124 116 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 की तीन वर्षीय पोस्ट से प्रेरित है

ω

वेक्टर के साथ निचले दाएं कोने और (ए, बी) में शामिल होने के साथ विकर्ण डी के "क्रॉस-उत्पाद vxd के संकेत" का उपयोग करके सहेजे गए बिंदु के किस पक्ष के लिए परीक्षण निहित है।


1

बर्लेस्क , 24 बाइट्स

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

इसे ऑनलाइन आज़माएं!

बहुत यकीन है कि यह कम हो सकता है। इनपुट के रूप में पढ़ा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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.