รากเหง้าดั้งเดิมของความสามัคคี


11

อนุญาตzเป็นจำนวนเชิงซ้อน zเป็นที่ n รากดั้งเดิมของความสามัคคีถ้าเป็นจำนวนเต็มบวกบางและสำหรับจำนวนเต็มบวกใดn k < n

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่กำหนดให้เป็นจำนวนเต็มบวกnเป็นอินพุตเอาต์พุตทั้งหมดของรากดั้งเดิมดั้งเดิมของความสามัคคี คุณสามารถส่งออกมันในรูปแบบขั้วโลก ( e^θiหรือe^iθอาร์กิวเมนต์ควรเป็นทศนิยมอย่างน้อย 2 ตำแหน่งทศนิยม) หรือรูปสี่เหลี่ยมผืนผ้า ( a + biหรือรูปแบบที่คล้ายกันส่วนจริงและจินตภาพควรเป็นทศนิยม) และพวกเขาอาจถูกเอาท์พุทในรายการภาษาของคุณ รูปแบบอาร์เรย์ / หรือเป็นสตริงที่มีตัวเลขคั่นด้วยช่องว่างหรือบรรทัดใหม่ บิวด์อินที่คำนวณรูทที่ n ของความสามัคคีหรือ root ดั้งเดิมที่ n ของความสามัคคีไม่ได้รับอนุญาต

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างอินพุตและเอาต์พุต

6 -> e^1.05i, e^-1.05i # polar form
3 -> e^2.094395i, e^-2.094395i # any number of decimal places is OK as long as there are more than 2
8 -> 0.707 + 0.707i, 0.707 - 0.707i, -0.707 + 0.707i, -0.707 - 0.707i # rectangular form
1 -> 1 + 0i # this is OK
1 -> 1 # this is also OK
4 -> 0 + i, 0 - i # this is OK
4 -> i, -i # this is also OK

ดังนั้น + -i ไม่ใช่คำตอบของ z ^ 8 = 1?
RosLuP

คำตอบ:


9

เยลลี่, 11 9 ไบต์

ขอบคุณ @Dennis สำหรับ -2 ไบต์!

Rg=1O÷H-*

ฉันต้องการสร้างตัวเลข coprime ถึง N โดยการตั้งค่าความแตกต่างของรากเหง้าของความสามัคคีตั้งแต่ 1 ถึง N แต่ฉันไม่สามารถหาวิธีที่ฉันใช้วิธีการของ @ Dennis

Rg=1O÷H-*         Monadic chain:          6
R                 Range                   [1,2,3,4,5,6]
 g                Hook gcds with range    [1,2,3,2,1,6]
  =1              [gcds equal to one]     [1,0,0,0,1,0]
    O             Replicate indices       [1,5]
     ÷H           Divide by half of N     [1/3,5/3]
       -          Numeric literal: - by itself is -1.
        *         Take -1 to those powers [cis π/3,cis 5π/3]

ลองมันนี่ ใช้ได้ในเยลลี่เวอร์ชันนี้แต่อาจไม่เป็นเวอร์ชันหลังจากวันที่ 1 กุมภาพันธ์ 2559


4

เยลลี่ 14 ไบต์

Rg=1O°÷×ı360Æe

ลองออนไลน์!

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

Z = อี2tπiเป็นn THรากของ1และถ้าหากt = k / nสำหรับบางจำนวนเต็มk

zเป็นแบบดั้งเดิมถ้าหากkและnเป็น coprime

Rg=1O°÷×ı360Æe  Main link. Input: n

R               Yield [1, ..., n].
 g              Compute the GCDs of reach integer and n.
  =1            Compare the GCDs with 1.
    O           Get all indices of 1's.
                This computes all the list of all k in [1, ..., n] 
                such that k and n are coprime.
     °          Convert the integers to radians.
      ÷         Divide the results by n.
       ×ı360    Multiply the quotient by the imaginary number 360i.
            Æe  Map exp over the results.

2

จูเลีย 48 ไบต์

n->cis(360deg2rad(filter(k->gcd(k,n)<2,1:n))/n)

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

Ungolfed:

function f(n::Int)
    # Get the set of all k < n : gcd(k,n) = 1
    K = filter(k -> gcd(k,n) < 2, 1:n)

    # Convert these to radian measures
    θ = deg2rad(K)

    # Multiply by 360, divide by n
    θ = 360 * θ / n

    # Compute e^iz for all elements z of θ
    return cis(θ)
end

2

ทับทิมขนาด 46 ไบต์

นี่คือการดำเนินการที่ไม่ใช่ "ภาษากอล์ฟ" ของคำตอบ Jelly ของThomas Kwa

->n{(1..n).map{|j|1i**(4.0*j/n)if j.gcd(n)<2}}

Ungolfed:

def r(n)
  (1..n).each do |j|
    if j.gcd(n) == 1    # if j is coprime with n, then this will be a primitive root of unity
      p 1i**(4.0*j/n)   # print the fourth power of i**(j/n), i.e. the root of unity
    end
  end
end

2

MATL , 27 ไบต์

:1-tGYf1X-!\Xpg)2j*YP*G/Ze!

ใช้รีลีส (9.3.1)ซึ่งเร็วกว่าความท้าทายนี้

ลองออนไลน์!

(คอมไพเลอร์ออนไลน์ใช้รีลีสที่ใหม่กว่า แต่โค้ดรันในรีลีส 9.3.1 และให้ผลลัพธ์เหมือนกัน)

คำอธิบาย

มีสามขั้นตอนหลัก:

  1. สร้างจำนวนเต็ม0, 1, ... , N-1สอดคล้องกับรากทั้งหมด
  2. เก็บจำนวนเต็มเท่านั้นที่สอดคล้องกับรากดั้งเดิม Nเหล่านี้จะมีการระบุโดยใช้การสลายตัวปัจจัยที่สำคัญของ
  3. สร้างรากที่แท้จริงด้วยเลขชี้กำลังจำนวนจินตภาพ

รหัส:

:1-           % 1. Implicit input "N". Produce vector [0,1,...,N-1]
t             %    duplicate
GYf           % 2. Prime factors of N
1X-           %    remove factor "1" if present (only if N==1)
!\            %    all combinations of [0,1,...,N-1] modulo prime factors of N
Xpg           %    logical "and" along the prime-factor dimension
)             %    index into original vector [0,1,...,N-1] to keep only primitive roots
2j*YP*G/Ze    % 3. Imaginary exponential to produce those roots
!             %    transpose for better output format

1

Matlab 49 ไบต์

n=input('');q=0:n-1;exp(i*2*pi/n.*q(gcd(n,q)==1))

ไม่ได้รับงานในครั้งแรก แต่ตอนนี้ที่นี่เป็น ผลลัพธ์ดังต่อไปนี้:

6
ans =
    0.5000 + 0.8660i   0.5000 - 0.8660i

3
คำตอบของคุณจะแสดงทุกรากของความสามัคคีไม่เพียง แต่ดั้งเดิมคน
ข้อบกพร่อง

@ flawr ขอบคุณสำหรับคำพูดฉันไม่ได้รับงานในตอนแรก ฉันแก้ไขวิธีแก้ปัญหา
brainkz

1

ES6, 96 ไบต์

n=>[...Array(n).keys()].filter(i=>g(i,n)<2,g=(a,b)=>a?g(b%a,a):b).map(i=>'e^'+Math.PI*2*i/n+'i')

รูปแบบโพลาร์เป็นเอาต์พุตที่สั้นที่สุด


1

PARI / GP, 41 ไบต์

ตรงไปตรงมาสวยหาตัวเลขจาก 1 ถึง n ซึ่งเป็น coprime ถึง n แล้ว

n->[exp(2*Pi*I*m/n)|m<-[1..n],gcd(n,m)<2]

จะต้องมีวิธีที่สั้นกว่านี้ แต่นี่เป็นสิ่งที่ดีที่สุดที่ฉันสามารถหาได้

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