통일의 근원


11

z복소수로 하자 . 특정 양의 정수 및 임의의 양의 정수인 경우 단일성z 의 n 번째 기본 루트입니다 .n k < n

도전

양의 정수 n를 입력으로 주어 전체 n 번째 기본 근음을 출력 하는 전체 프로그램 또는 함수를 작성하십시오 . 극좌표 형식 ( e^θi또는 e^iθ, 인수는 소수점 이하 2 자리 이상의 소수 여야 함) 또는 직사각형 형식 ( a + bi또는 유사한 형식, 실수 및 가상 부분도 소수 여야 함)으로 출력 할 수 있으며 언어 목록에 출력 될 수 있습니다. / array 형식 또는 공백이나 개행 문자로 구분 된 숫자가있는 문자열 단위의 n 번째 근 또는 단위의 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 21

답변:


9

젤리, 11 9 바이트

-2 바이트의 @Dennis에게 감사드립니다!

Rg=1O÷H-*

나는 1에서 N으로의 모든 근의 뿌리에 대한 집합 차이를 접음으로써 N에 대한 숫자 coprime을 생성하고 싶었지만 어떻게 @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]

여기서 사용해보십시오 . Jelly 버전 에서는 유효 하지만 2016 년 2 월 1 일 이후 버전에는 없을 수 있습니다.


4

젤리 , 14 바이트

Rg=1O°÷×ı360Æe

온라인으로 사용해보십시오!

작동 원리

z = e 2tπi 는 정수 k에 대해 t = k / n 인 경우에만 1n 번째 근입니다 .

kn 이 동일 프라임 경우에만 z원시적 입니다.

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)

정수를 받아들이고 복잡한 부동 소수점 배열을 반환하는 람다 함수입니다. 호출하려면 변수에 지정하십시오. Dennis 'Jelly 답변과 동일한 접근 방식을 사용합니다.

언 골프 드 :

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 바이트

이것은 Thomas Kwa 의 Jelly 답변을 "골프 언어"로 구현 한 것입니다.

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

언 골프 드 :

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

@ 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까지의 숫자를 찾아서 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.