Rễ nguyên thủy của sự thống nhất


11

Hãy zlà một số phức. zlà một gốc nguyên thủy thứ n của sự thống nhất nếu cho một số nguyên dương nhất định n và cho bất kỳ số nguyên dương nào k < n .

Thử thách

Viết một chương trình hoặc hàm đầy đủ, với một số nguyên dương nlàm đầu vào, xuất ra tất cả các gốc nguyên thủy thứ n của sự thống nhất. Bạn có thể xuất chúng ở dạng cực ( e^θihoặc e^iθ, đối số phải là số thập phân có ít nhất 2 chữ số thập phân) hoặc dạng hình chữ nhật ( a + bihoặc dạng tương tự, phần thực và phần ảo cũng phải là số thập phân) và chúng có thể được xuất ra trong danh sách ngôn ngữ của bạn / định dạng mảng hoặc dưới dạng một chuỗi với các số được phân tách bằng dấu cách hoặc dòng mới. Không được phép xây dựng tính toán gốc thứ n của sự thống nhất hoặc gốc nguyên thủy thứ n của sự thống nhất.

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.

Đầu vào và đầu ra mẫu

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

Vậy + -i không phải là giải pháp của z ^ 8 = 1?
RosLuP

Câu trả lời:


9

Thạch, 11 9 byte

Cảm ơn @Dennis cho -2 byte!

Rg=1O÷H-*

Tôi muốn tạo ra các số tương ứng với N bằng cách gấp chênh lệch tập hợp trên tất cả các gốc của sự thống nhất từ ​​1 đến N, nhưng tôi không thể hiểu làm thế nào tôi sử dụng phương pháp của @ 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]

Hãy thử nó ở đây . Có hiệu lực trong phiên bản Jelly này, nhưng có thể không có trong các phiên bản sau ngày 1 tháng 2 năm 2016.


4

Thạch , 14 byte

Rg=1O°÷×ı360Æe

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

Làm thế nào nó hoạt động

z = e 2tπi là gốc thứ n của 1 khi và chỉ khi t = k / n với một số nguyên k .

znguyên thủy khi và chỉ khi kn là nguyên tố cùng nhau.

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

Julia, 48 byte

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

Đây là một hàm lambda chấp nhận một số nguyên và trả về một mảng các số float phức tạp. Để gọi nó, gán nó cho một biến. Nó sử dụng cách tiếp cận tương tự như câu trả lời của Dennis 'Jelly.

Ung dung:

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

Ruby, 46 byte

Đây là một triển khai "ngôn ngữ chơi gôn" không phải là câu trả lời Jelly của Thomas Kwa .

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

Ung dung:

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 byte

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

Sử dụng bản phát hành (9.3.1) , sớm hơn thử thách này.

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

(Trình biên dịch trực tuyến sử dụng bản phát hành mới hơn, nhưng mã chạy trong bản phát hành 9.3.1 và cho kết quả tương tự)

Giải trình

Có ba bước chính:

  1. Tạo số nguyên 0,, 1... N-1, tương ứng với tất cả các gốc.
  2. Chỉ giữ các số nguyên tương ứng với các gốc nguyên thủy. Chúng được xác định bằng cách sử dụng phân tách thừa số nguyên tố của N.
  3. Tạo các gốc thực tế với một số mũ tưởng tượng.

Mã số:

: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 byte

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

Không nhận được nhiệm vụ lần đầu tiên, nhưng bây giờ nó ở đây. Đầu ra như sau:

6
ans =
    0.5000 + 0.8660i   0.5000 - 0.8660i

3
Câu trả lời của bạn hiển thị tất cả các gốc rễ của sự thống nhất, không chỉ những người nguyên thủy .
flawr

@flawr cảm ơn vì nhận xét, lúc đầu tôi không nhận được nhiệm vụ. Tôi đã chỉnh sửa giải pháp
brainkz

1

ES6, 96 byte

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')

Dạng cực là đầu ra ngắn nhất.


1

PARI / GP, 41 byte

Khá đơn giản: tìm các số từ 1 đến n tương ứng với n, sau đó

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

Phải có một số cách ngắn hơn, nhưng đây là cách tốt nhất tôi có thể tìm thấy.

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.