团结的原始根源


11

z一个复数。如果对于某个正整数和任何正整数,z是第n个本原的根n k < n

挑战

编写一个完整的程序或函数,给定一个正整数n作为输入,该程序或函数将输出所有n个原始单位根。您可以将它们输出为极性形式(e^θie^iθ,参数应为至少两个小数位的小数)或矩形形式(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

Answers:


9

果冻,11 9个字节

感谢@Dennis提供-2个字节!

Rg=1O÷H-*

我想通过将所有单位根的集合差从1折叠到N来将数字互质生成为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]

在这里尝试。在此版本的Jelly中有效,但在2016年2月1日之后的版本中可能无效。


4

果冻,14 字节

Rg=1O°÷×ı360Æe

在线尝试!

这个怎么运作

Z =Ë 2tπiÑ 的根1当且仅当T = K / N为整数ķ

当且仅当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)

这是一个lambda函数,它接受整数并返回复杂浮点数的数组。要调用它,请将其分配给变量。它使用与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

Ruby,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感谢您的发言,我最初没有得到任务。我编辑了解决方案
brainkz '16

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]

必须有一些更短的方法,但这是我能找到的最好的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.