首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一的原始根

统一的原始根
EN

Code Golf用户
提问于 2016-01-17 18:19:39
回答 6查看 583关注 0票数 11

z是一个复数。如果对于某个正整数z,则n是第n个本原根。

对于任何正整数k < n

挑战

编写一个完整的程序或函数,以正整数n作为输入,输出所有的单元原根。您可以以极形式输出它们(e^θie^iθ,参数应该是小数,至少小数点2位)或矩形形式(a + bi或类似的形式,实部和虚部也应该是小数),它们可以以语言的列表/数组格式输出,也可以以字符串的形式输出,用空格或换行符分隔数字。计算统一的第n根或统一的第n个原始根的内置是不允许的。

这是密码-高尔夫,所以以字节为单位的最短代码将获胜。

样本输入输出

代码语言:javascript
复制
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
EN

回答 6

Code Golf用户

发布于 2016-01-18 08:52:15

Julia,48字节

代码语言:javascript
复制
n->cis(360deg2rad(filter(k->gcd(k,n)<2,1:n))/n)

这是一个lambda函数,它接受一个整数并返回一个复杂浮点数数组。若要调用它,请将其赋值给变量。它使用的方法与丹尼斯的果冻答案相同。

未高尔夫球:

代码语言:javascript
复制
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
票数 3
EN

Code Golf用户

发布于 2016-01-18 15:17:21

马蒂尔,27字节

代码语言:javascript
复制
:1-tGYf1X-!\Xpg)2j*YP*G/Ze!

使用释放(9.3.1),它比此挑战更早。

在网上试试!

(在线编译器使用较新的版本,但代码在9.3.1版中运行,并给出了相同的结果)

解释

有三个主要步骤:

  1. 生成整数01,.,N-1,对应于所有根。
  2. 只保留与原根对应的整数。它们是用N的素因子分解来识别的。
  3. 用假想指数生成实际根。

代码:

代码语言:javascript
复制
: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
票数 2
EN

Code Golf用户

发布于 2016-01-18 15:24:09

Ruby,46字节

这是一个非“高尔夫语言”实现的郭炳泉's果冻答案。

代码语言:javascript
复制
->n{(1..n).map{|j|1i**(4.0*j/n)if j.gcd(n)<2}}

未高尔夫球:

代码语言:javascript
复制
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
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/69574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档