互素高达N


51

给定一个数字n >= 2,输出小于nwhere的所有正整数gcd(n, k) == 1k输出数字中的任何一个)。这类数字互为互质

示例:10给出输出[1, 3, 7, 9](只要您喜欢的任何形式,只要数字明确地分开并以某种形式列出即可)。该列表不能有重复的条目,也不必进行排序。

更多测试用例:

2 -> [1]
3 -> [1, 2]
6 -> [1, 5]
10 -> [1, 3, 7, 9]
20 -> [1, 3, 7, 9, 11, 13, 17, 19]
25 -> [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24]
30 -> [1, 7, 11, 13, 17, 19, 23, 29]

我们也不在n此之上算数n,因为我可以肯定地确定有无限的解决方案。

另请注意:互互质数也被称为互质数或互质数。


单独的字符串(例如1\n3\n)是否算作有效输出?
devRicher

当然可以使用@devRicher。
Rɪᴋᴇʀ

在n之上有无穷多个与n互质的数字的直觉对我来说是正确的。素数无限多,素数与它下面的每个素数都是互质的。因此,每个大于n的质数(其中有无限多个)也属于共质数列表。
布赖恩·J

@BrianJ不仅如此。如果cn是互质数,则对于所有整数kc + knn也是互质
丹尼斯

1
有趣的事实:这些被称为totative
Wojowu

Answers:


17

果冻,3 个字节

gÐṂ

在线尝试!

这是如何运作的?

gÐṂ-(单声道)完整程序。

g-最大公约数。
 ÐṂ-保持链接值最小的元素(即,GCD == 1的元素)
       请注意,这会自动创建范围[1,输入](含)。

有效性证明

因为我们只想提取的coprimes,最大-共除数列表的最小值1ÐṂ伎俩工作。让我们证明一下(用两种不同的方法):

  1. 隐式生成的范围包含和。最大公约数始终是严格的正整数,因此保证出现且始终为最小值。1 gcd 1 x = 1[1,input]1gcd(1,x)=1xZ1

  2. 两个连续的正整数始终是互质的。考虑,其中。然后我们取另一个正整数,使和。 Ŷ = X + 1 ķ ķ | X ķ | ÿx,yZy=x+1kkxky

    这意味着,所以,因此。除以的唯一正整数本身就是,因此可以保证它出现在列表中,并且始终是最小值。k x + 1 x k 1 1 1k(yx)k(x+1x)k111


2
9个月后,您用他的母语超越了丹尼斯!
亚当

@Adám我不确定ÐṂ当时是否存在,无论如何我都对此感到满意。
Xcoder先生17年

2
根据记录,DṂ确实存在,但仅适用于monad。提交实施ÞÐṂÐṀ对于二元体系是5月9日,2017年
丹尼斯

@Dennis我知道您没有3字节版本的理由很充分。我们也在聊天中对此感到疑惑,非常感谢您提供有用的信息!
Xcoder先生17年

56

Python 2中61个 47字节

lambda n:[k/n for k in range(n*n)if k/n*k%n==1]

在线尝试!

背景

考虑 。尽管通常使用残基类定义此环,但也可以将其视为,其中加法和乘法运算符由定义。和,其中表示通常的加法,整数的乘法和模运算符。ñ Ž Ñ = { 0 ... ñ - 1 } 一个+ Ñ b = 一个+ b (Zn,+n,n)nZn={0,,n1}一个Ñ b = 一个ba+nb=(a+b)%n+ anb=ab%n+,, and %

如果,则两个元素和称为乘逆。请注意,只要。b ž Ñ Ñ一个Ñ b = 1abZnn1anb=1%nn > 11%n=1n>1

固定,并让是的互质在。如果为两个元素和的,我们有。这意味着,我们遵循,即将均分。由于不与共享素数,这意味着。最后,因为一个Ñ ž ñ一个Ñ X = 一个Ñ ý X ý ž Ñ一个Xn>1anZnanx=anyxyZn一个X - Ý ax%n=ay%nÑ | 一个X - Ý ñ 一个X - Ý ñ 一个ñ | X - ý - Ñ < X - ý < Ñ X = ý 一个Ñ 0 ... 一个ÑÑ 1 Z n Z n n 1 b Za(xy)%n=ax%nay%n=0na(xy)na(xy)nanxyn<xy<n,我们得出结论。这表明乘积都是不同元素。由于正好具有元素,因此这些乘积中的一个(正好一个)必须等于,即存在唯一的,使得。x=yan0,,an(n1)ZnZnn1 b一个Ñ b = 1Znanb=1

相反,将固定,并让为与互素的元素。在这种情况下,存在素数使得和。如果被接受的乘法逆模(我们称其为),我们将有,这意味着,因此,所以。由于,我们遵循一个Ž Ñ Ñ p p | 一个p | Ñ 一个Ñ b 一个Ñ b = 1 一个bn>1aZnnppapnanbanb=1一个b - 1 ab%n=1Ñ | 一个b - 1个p | 一个p | 一个b p | Ñ p | 一个b - 1个p | 一个b - b - 1 = 1 p(ab1)%n=ab%n1=0nab1papab。另一方面,由于,我们也遵循。这样,,这与是素数的假设相矛盾。pnpab1p(ab)(ab1)=1p

这证明当时,以下语句是等效的。n>1

  • ña和是互质的。n

  • ña一个乘积逆模。n

  • ña接受唯一的乘法逆模。n

这个怎么运作

对于每一对整数和在,整数是唯一的; 实际上,和是商,并且余除以,即给定,我们可以恢复和,其中表示整数除法。最后,由于和,因此是的元素;实际上,。b ž Ñ ķ = 一个Ñ + b 一个b ķ Ñ ķ 一个= ķ / Ñ b = ķabZnk:=an+babknka=k/n/一个ñ - 1 b ñ - 1个ķ Ž Ñ 2 ķ ñ - 1 ñ + ñ - 1 = ñ 2 - 1b=k%n/an1bn1kZn2k(n1)n+(n1)=n21

如上所述,如果和是互质的,则将有一个唯一的,使得,即,将有一个唯一的,使得和,所以所生成的列表将包含正好一次。Ñ b 一个&CenterDot; banbķ ķ / Ñ = 一个ķ / Ñ ķab%n=1kk/n=ak/nk%n=(k/n)(k%n)%n=1a

相反,如果和是互为素,条件会出现假用于的所有值使得,所以所生成的列表将包含。Ñ ķ / Ñ ķank a = k / n ak/nk%n=1ka=k/na

这证明了lambda返回的列表将只包含一次所有的互质数。ž ñnZn


26
“ GCD?我们要去的地方,我们不需要GCD。”
Rɪᴋᴇʀ

1
哇。那就是我想要写的,但是显然我需要15个字符。仍然,哇。很好。
埃里克·拉格伦

24

果冻,4字节

gRỊT

在线尝试!

这个怎么运作

gRỊT  Main link. Argument: n

 R    Range; yield [1, ..., n].
g     Compute the GCD of n and each k in [1, ..., n].
  Ị   Insignificant; return 1 for GCDs less or equal to 1.
   T  Truth; yield the indices of all truthy elements.

33
用这种语言编码需要一些时间gRỊT
ETHproductions 2016年

1
我设法(ab)使用“最小链接值” quick(ÐṂ)以获得3个字节
Xcoder先生17年

14

Mathematica,25个字节

Range@#~GCD~#~Position~1&

有点奇怪的输出格式,其中每个结果都包装在单独的列表中,例如{{1}, {3}, {7}, {9}}。如果那还不行,那么我有两个30字节的解决方案:

Select[Range[x=#],#~GCD~x<2&]&
#&@@@Range@#~GCD~#~Position~1&

Mathematica实际上有,CoprimeQ但是那太长了。


1
是什么Q意思CoprimeQ
科纳·奥布赖恩

2
@ ConorO'Brien“问题”,我猜。所有的决策问题的内置插件的Q结束一样EvenQPrimeQSubsetQ
马丁·恩德

10

2sable,4个字节

码:

ƒN¿–

说明:

ƒ       # For N in the range [0, input]..
 N¿     #   Compute the GCD of N and the input
   –    #   If 1, print N with a newline

使用CP-1252编码。在线尝试!


做得好(几乎)击败丹尼斯。(不过延迟了几分钟)。
扎卡里

10

Python,93 82 74字节

f=lambda a,b:f(b,a%b)if b else a<2
lambda c:[i for i in range(c)if f(i,c)]

f递归检查互素,第二个lambda生成它们。输出列表。


7

实际上,8个字节

;╗R`╜┤`░

在线尝试!

说明:

;╗R`╜┤`░
  R`  `░  elements of range(1, n+1) where
;╗  ╜     n and the element
     ┤    are coprime

1
我相信您可以range(1, n)节省任何字节。
ETHproductions 2016年

1
@ETHproductions不是。这两个选项是Rrange(1, n+1))和rrange(n))。由于它们是等效的,因此我选择了R(因为在编写代码时意外地按下了大写锁定)。
Mego

是的,这就是我的想法。我没有看到,似乎专门为递增的指令,但我认为有可能是一个无论如何
ETHproductions



6

JavaScript(ES6),64 61字节

@ user81655节省了3个字节

n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

测试片段

f=n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

for(var i = 2; i < 50; i++) console.log(i + ":", `[${ f(i) }]`);


你能不能换a==a<2
Rɪᴋᴇʀ

@EasterlyIrk不确定,有时a可能为0。我得检查一下
ETHproductions 2016年

您可以将GCD函数移至中,filter以消除接收b参数的需要:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
user81655 '16

@ user81655太好了,谢谢!:-)
ETHproductions

6

水母19 18字节

p
[#
`B
&~xr1
NnEi

通过计算范围中每个数字的质数分解并检查它是否与输入的质数相交(水母还没有内置gcd),可以起作用。由于打高尔夫球的原因,输出按降序排列。 在线尝试!

说明

首先,i是评估输入;对于输入10i-cell的值为10

r1
i

这里r(范围)应用于输入和1。由于输入大于1,因此范围按降序排列;对于输入10,这给[9 8 7 6 5 4 3 2 1]

[#
`B
&~x
Nn

这部分是一个很大的功能,i在上面和上面的范围内进行评估。

~x
n

n主因子(x)的交集()。

&~x
Nn

是空的吗?(N

`
&~x
Nn

转到级别0,测试范围内的每个元素。

[#
`B
&~x
Nn

过滤(#)关于此布尔值列表的范围。[要产生的函数要使用参数#作为自己的参数,因此我们将a设置B为禁止#获取任何参数。否则,~-cell 的值将用作big函数的参数。最后,p打印结果。


5

堆叠式非竞争,24 21字节

Borsunho的红宝石启发,保存了3个字节。(1 eq2<

{!n:>1+:n gcd 2<keep}

在这里尝试!

这是一个n-lambda,它接受单个参数并产生数组。

{!n:>1+:n gcd 2<keep}
{!                  }  n-lambda
  n                    push n
   :>                  range [0, n)
     1+                range [1, n]
       :               duplicate
        n gcd          element-wise gcd with n
              2<       element-wise equality with 1
                       this yields the range [1, n] and a boolean mask of coprime numbers
                keep   then, we simply apply the mask to the range and keep coprimes.

为什么这种不竞争?
扎卡里

@ZacharyT主要keep不是很好。
科纳·奥布莱恩

5

CJam,14个字节

{:X{Xmff%:*},}

在线尝试!

说明

我们并不需要检查所有可能的除数a,并b测试它们是否是互质。看看是否存在任何主要的b分割因素就足够了a

:X     e# Store the input in X.
{      e# Filter the list [0 1 ... X-1] by the results of this block...
  Xmf  e#   Get the prime factors of X.
  f%   e#   Take the current value modulo each of those prime factors.
  :*   e#   Multiply the results. Iff any of them divide the current
       e#   value, there's a 0 in the list, and the result of the product
       e#   is also 0, dropping the value from the resulting list.
},

5

Mathematica,26个字节

Pick[r=Range@#,r~GCD~#,1]&

1
哦,我一直在寻找类似Pick的东西。我想现在很高兴我没有找到它。;)但是对于将来的挑战应该非常有用。
马丁·恩德


4

Brachylog16 13字节

>.$p'(e:A*?),

此函数以N为输入,并生成所有小于并对其互质的整数。

在线尝试!与Brachylog中的情况一样,此代码中添加了额外的代码,以使该功能成为完整的程序。如果Brachylog的解释器具有功能而不是完整的程序,它将运行该解释器,但不输出输出,这意味着您无法真正观察其工作情况。

说明:

Brachylog程序是约束链。通常,一个约束的LHS是下一个约束的RHS。

>.$p'(e:A*?),
>              The input is greater than
 .             the output, whose
  $p           prime factorisation does
    '(     )   not obey the following constraint:
      e        it has an element which
       :A*     can be multiplied by something to
          ?    produce the input.
            ,  (This comma turns off an unwanted implicit constraint.)

通过意识到没有理由检查是否有公因数(已知为输出的素数)是否是输入的素数,可以细分三个字符。我们已经知道它是主要的,因此我们可以检查它是否是一个因素。我惊喜在这里,:A*?不发送解释陷入无限循环并且不允许非整数值一个,但作为解释我想要做什么,我会接受它。


4

Dyalog APL,10 个字节

0~⍨⍳×1=⊢∨⍳

说明(输入n):

0~⍨⍳×1=⊢∨⍳
         ⍳ - 1 ... n (Thus, ⎕IO is 1)
       ⊢∨  - Each GCD'd by n
     1=    - Test equality with 1 on each element
   ⍳×      - multiplied by its index
0~⍨        - without 0.

3
我喜欢APL代码看起来像您在阅读时的表情。
DJMcMayhem

是的,它几乎摧毁了所有非面向代码高尔夫的语言。:)。
扎卡里

为什么只有“力量”起作用?
Rɪᴋᴇʀ

我只是假设它可行。
扎卡里

@ZacharyT为什么不能测试呢?当我将其粘贴到try-apl.org中时,使用无效令牌会出错。
Rɪᴋᴇʀ

4

Japt -f9 8 5 2个字节

jN

试试吧

  • 由于ETH指出了Brainfart,因此节省了2个字节,从而节省了另一个字节。

您可以做o f_jU
ETHproductions

谢谢@ETHproductions。不知道我在想什么!一定是那些(很多)我忘记的时刻之一,j也可以用来检验两个数字是否互质。
粗野的

3

Mathematica,33个字节

xSelect[Range@x,x~CoprimeQ~#&]

包含U + F4A1


无法打印的是什么?
Rɪᴋᴇʀ

3
@EasterlyIrk引入了带有命名参数的未命名函数。它在Mma中显示为箭头。
马丁·恩德

@MartinEnder哦,太酷了。
Rɪᴋᴇʀ

U + F4A1是私人使用的字符。正如马丁所说,它在Mathematica中被渲染为箭头。
扎卡里



3

模因,11字节无竞争过时

非竞争性的STDIN迭代是新的。 使用UTF-8编码。

d`}}]i=1?ip

说明:

d     Set program to not output result
`}    Loop next input-times
}]i   GCD of input and loop index
=1?   Is it equal to 1? If yes,
ip    Print out loop index

}访问下一个输入项,但是如果给定最后一个输入,6则将其循环通过,因此输入的结果将6 6 6 6 6 ...与STDIN相同,从而可以从一个输入中读取两个输出。


您今天刚刚创建了这个lang吗?如果是在挑战之前制造的,则必须是非竞争性的。
Rɪᴋᴇʀ

@EasterlyIrk这是3天前制作的,即时消息我一直在不断努力。另外,我假定你的意思
devRicher

是的,错别字谢谢。没关系,只要答案中使用的功能早于挑战即可。
Rɪᴋᴇʀ

我看到了@EasterlyIrk,在这种情况下,我必须编辑我的答案。
devRicher

是的,对不起。:/
Rɪᴋᴇʀ


2

红宝石,36 34

->n{n.times{|i|p i if i.gcd(n)<2}}

诚然,这不是一个很有启发性的答案。

感谢Conor O'Brien,节省了2个字节。


您可以通过删除圆括号来删除两个字节(n)
Conor O'Brien


2

朱莉娅,30个字节

n->filter(x->(gcd(n,x)<2),1:n)

匿名函数。filter根据函数从列表中删除不真实的元素。

在这种情况下,函数为x->(gcd(n,x)<2)(如果输入和列表元素的gcd小于2 ,则为true)。该列表是范围1:n


2

PARI / GP,27字节

n->[k|k<-[1..n],gcd(k,n)<2]

这使用版本2.6.0(2013)中引入的设置符号。在早期版本中,还需要四个字节:

n->select(k->gcd(k,n)<2,[1..n])

将需要。


这是如何运作的?
Rɪᴋᴇʀ

1
@EasterlyIrk与大多数提交内容相同-范围从1到n([1..n]),检查gcd是否为1(gcd(n,k)<2),并返回带有此属性的数字。的->是函数/闭合符号,通过比正常功能语法2个字节短,[...|...<-...,...]是一组符号中的答案(参见用户手册第2.3.14,或查询解释<-)。
查尔斯



1

Pyth,5个字节

x1iLQ

在线尝试!

这个怎么运作

请注意,Pyth使用0索引。

x1iLQ   Q = eval(input())

x1iLQQ  implicit Q at the end
  iLQQ  [gcd(Q,0), gcd(Q,1), ..., gcd(Q,Q-1)]
x1      all occurences of 1 in the above list (return their indices)
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.