N까지 코 프리


51

다수 주어 n >= 2,보다 출력이 모두 양의 정수 n여기서, gcd(n, k) == 1(함께 k출력 번호 중 어느 하나 인). 이런 종류의 숫자는 서로 동일 합니다.

예 : 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]

우리는 또한 무한한 해결책이 있다고 확신하기 때문에 ncoprime 인 위의 숫자를 세지 않습니다 n.

또한 참고 : 서로 공통된 숫자는 상대적으로 소수이거나 서로 소수입니다.


별도의 문자열 (예 :)이 1\n3\n유효한 출력으로 계산됩니까?
devRicher

@devRicher 작동합니다.
Rɪᴋᴇʀ

n에 대해 coprime 인 n보다 많은 수의 숫자가 있다는 직관은 나에게 맞습니다. 소수는 무한히 많으며 소수는 그 아래의 모든 숫자와 동일합니다. 따라서 n보다 큰 모든 소수 (무한대가 많음)도 coprime 목록의 일부입니다.
Brian J

@BrianJ뿐만 아니라. 경우 CN은 coprimes이다 C는 KN +N 있고 모든 정수에 대해, coprimes K .
Dennis

1
재미있는 사실 : 이것을 totatives 라고 합니다 .
Wojowu

답변:


17

젤리 , 3 바이트

gÐṂ

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

어떻게 작동합니까?

gÐṂ-(Monadic) 전체 프로그램.

g-최대 공약수
 ÐṂ-링크 값을 최소로 유지하십시오 (예 : GCD == 1 인 요소)
       그러면 범위 [1, 입력] (포함)이 자동으로 생성됩니다.

유효성 증명

우리는 단지 coprimes을 추출 할 이후 가장 큰-공통 약수 목록의 최소값 1 에 대한 ÐṂ트릭이 작동합니다. 이를 두 가지 방법으로 증명해 보자.

  1. 내재적으로 생성 된 범위 에는 및 됩니다. 최대 공약수는 항상 양의 정수이므로 은 항상 발생하며 항상 최소값이됩니다.[1,input]1 1gcd(1,x)=1xZ1

  2. 두 개의 연속 양의 정수는 항상 coprime입니다. 고려 와 . 그런 다음 및 와 같은 또 다른 양의 정수 취 합니다. y = x + 1 k k x k yx,yZy=x+1kkxky

    이것은 이므로 이므로 입니다. 을 나누는 유일한 양의 정수 는 자체이므로 목록에 표시되며 항상 최소값이됩니다.k ( x + 1 x ) k 1 1 1k(yx)k(x+1x)k111


2
당신은 9 개월 후에 데니스를 모국어로 능가했습니다!
Adám

@ Adám 나는 당시에 ÐṂ존재 했는지 확실하지 않습니다 . 어쨌든 나는 이것에 상당히 만족합니다.
Mr. Xcoder

2
기록을 위해 DṂ존재했지만 모나드에서만 작동했습니다. 은 커밋 구현 Þ, ÐṂ, ÐṀ댓구를 위해 5 월 9 일 2017 일자
데니스

@Dennis 3 바이트 버전이없는 이유가 있다는 것을 알았습니다. 우리는 채팅에서도 그 점에 대해 궁금해 했으므로 유용한 정보에 감사드립니다!
Mr. Xcoder

56

파이썬 2 , 61 47 바이트

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

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

배경

고려하십시오 . 이 고리는 일반적으로 모듈로 잔류 물 클래스를 사용하여 정의되지만 , 집합으로 간주 될 수 있습니다 . 여기에서 더하기 및 곱하기 연산자는 및 , 여기서 는 일반적인 추가를 나타냅니다. 정수에 대한 곱셈과 모듈로 연산자.n Z n = { 0 , , n - 1 } a + n b = ( a + b )(Zn,+n,n)nZn={0,,n1}a n b = a ba+nb=(a+b)%n+ ,anb=ab%n+,, and %

두 요소 및 의 상호라고 곱셈 역관계 모듈로 경우 . 참고 마다 .b Z n n a n b = 1abZnn1anb=1%nn > 11%n=1n>1

수정 및하자 의 서로 소가 될 에서 . 경우 개의 요소에 대한 및 의 , 우리가 그 . 이것은 의미가 , 우리는 다음과 즉, 균등하게 나눕니다 . 이후 과 공유 아무 주요 약수 이 그 의미 . 마지막으로a n Z n a n x = a n y x y Z n a xn>1anZnanx=anyxyZna ( x y )ax%n=ay%nn a ( x y ) n a ( x y ) n a n x y n < x y < n x = y a n 0 , , a n ( n 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 a n b = 1Znanb=1

반대로, 수정 및하자 의 요소 수 되어 있지 에 서로 소 . 이 경우 및 과 같은 소수 있습니다. 경우 곱셈 역 모듈로 인정 (현실을 부르 자 , 우리가있는 것) , 의미가 , 따라서, 이므로 입니다. 이후 , 우리는 다음과a Z n n p p a p n a n b a n b = 1 a bn>1aZnnppapnanbanb=1( a b 1 )ab%n=1n a b 1 p a p a b p n p a b 1 p ( a b ) - ( a b 1 ) = 1 p(ab1)%n=ab%n1=0nab1papab . 반면에 이기 때문에 도 따릅니다 . 이 방법으로 이므로 가 소수 라는 가정과 모순 됩니다.pnpab1p(ab)(ab1)=1p

이는 때 다음 명령문이 동일 함을 증명합니다 .n>1

  • Na 와 은 coprime입니다.n

  • Na 곱하기 역 모듈로 인정합니다 .n

  • Na고유 한 곱셈 역 모듈로 인정합니다 .n

작동 원리

정수의 각 쌍 및 에 , 정수 고유; 실제로 와 는 몫이고 나머지를 으로 나눈 값 , 즉 가 주어지면 및 복구 할 수 있습니다 . 여기서 정수 나누기를 나타냅니다 . 마지막으로 이고 이므로 는 의 요소입니다 . 실제로 입니다.b Z n k : = a n + b a b k n k a = k / n b = kabZnk:=an+babknka=k/n/N - 1 ≤의 N - 1 K Z의 N 2 유전율 ( N - 1 ) N + ( N - 1 ) = N (2) - 1b=k%n/an1bn1kZn2k(n1)n+(n1)=n21

위에서 언급 한 바와 같이, 와 이 동일 프라임 인 경우 과 같은 고유 가있을 것입니다. 즉, 와 와 같은 고유 가있을 것입니다. , 이렇게 생성 된 목록에 포함 회만.n b a banbk k / n = a k / n kab%n=1kk/n=ak/nk%n=(k/n)(k%n)%n=1a

반대로, 와 이 동일 프라임 이 아닌 경우 은 모든 값에 대해 과 같이 거짓 이므로 생성 된 목록에 포함 되지 않습니다. .n k / n kank a = k / n ak/nk%n=1ka=k/na

이것은 람다 리턴이 Z_n에있는 의 모든 정확히 한 번 포함 할 것임을 증명합니다 .Z nnZn


26
"GCD? 우리가가는 곳에서는 GCD가 필요하지 않습니다."
Rɪᴋᴇʀ

1
우와 그게 내가 쓰고 싶은 전부 였지만 분명히 15자가 필요했습니다. 그래, 와아 잘 했어.
Eric Lagergren

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

1
3 바이트ÐṂ 를 얻기 위해 "최소 링크 값"quick ( ) 을 (ab) 사용했습니다 .
Mr. Xcoder

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합니까?
Conor O'Brien

2
@ ConorO'Brien "질문"같아요. 모든 의사 결정 문제 빌트인 같은 Q로 끝나는 EvenQ, PrimeQ또는 SubsetQ.
Martin Ender


10

파이썬, 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재귀 적으로 coprimes를 확인하고 두 번째 람다는 그것들을 생성합니다. 리스트를 출력합니다.


7

실제로 8 바이트

;╗R`╜┤`░

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

설명:

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

1
range(1, n)바이트를 절약 하면 할 수 있다고 생각합니다 .
ETHproductions

1
@ETHproductions 그렇지 않습니다. 두 가지 옵션은 R( range(1, n+1)) 및 r( range(n))입니다. 그것들은 동등하기 때문에 R(코드를 쓰는 동안 실수로 Caps Lock을 누르기 때문에) 선택했습니다 .
Mego

네, 제가 생각한 것입니다. 나는 증분에 전념하는 것으로 보인 지시를 보지 못했지만 어쨌든 하나가 있다고 생각했다
ETHproductions



6

자바 스크립트 (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

매개 변수 filter를받을 필요를 제거하기 위해 GCD 기능을로 이동할 수 있습니다 b....keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
user81655

@ user81655 감사합니다. :-)
ETHproductions

6

해파리 , 19 18 바이트

p
[#
`B
&~xr1
NnEi

이것은 범위의 모든 숫자의 소인수 분해를 계산하고 입력의 수와 교차하는지 여부를 확인하여 작동합니다 (Jellyfish는 아직 gcd가 내장되어 있지 않습니다). 골프 때문에 출력은 내림차순입니다. 온라인으로 사용해보십시오!

설명

먼저 i입력이 평가됩니다. 입력 10의 경우 i-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

#이 부울 목록과 관련된 범위를 필터링합니다 ( ). 에 의해 생성 된 함수 [는 인수를 #자체 인수로 사용하려고 하므로 인수 를 얻는 B것을 차단 #합니다. 그렇지 않으면 ~-cell 의 값이 큰 함수의 인수로 사용됩니다. 마지막으로 p결과를 인쇄합니다.


5

스택 된 비경쟁, 24 21 바이트

Borsunho의 ruby 에서 영감을 얻은 3 바이트를 절약했습니다 . ( 1 eq~ 2<)

{!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.

이것이 경쟁이 아닌 이유는 무엇입니까?
Zacharý

@ ZacharyT는 주로 keep잘 작동하지 않았습니다.
Conor O'Brien

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과 같은 것을 찾고 있었다. 나는 그것을 찾지 못해서 기쁘다. ;) 그러나 그것은 미래의 도전에 매우 유용해야합니다.
Martin Ender


4

Brachylog , 16 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.)

공통 요인 (이미 출력의 주요 요인으로 알려져 있음)이 입력 의 주요 요인 인지 확인해야 할 이유가 없다는 사실을 인식하여 3 자로 제한했습니다 . 우리는 이미 그것이 프라임임을 알고 있으므로 그것이 요인인지 확인할 수 있습니다. 나는 유쾌하게 그 여기에 놀랐어요 :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

그렇습니다. 코드 골프 지향 언어가 아닌 거의 모든 언어가 철거됩니다. :).
Zacharý

왜 "권장"만 작동합니까?
Rɪᴋᴇʀ

나는 그것이 효과가 있다고 가정 할 것입니다.
Zacharý

@ZacharyT 왜 테스트 할 수 없습니까? try-apl.org에 붙여 넣을 때 잘못된 토큰으로 오류가 발생합니다.
Rɪᴋᴇʀ

4

Japt -f , 9 8 5 2 바이트

jN

시도 해봐

  • ETH 덕분에 뇌실을 지적하여 2 바이트가 절약 되어 다른 바이트가 절약되었습니다.

당신은 할 수o f_jU
ETHproductions

감사합니다, @ETHproductions. 내가 여기서 무슨 생각을했는지 모르겠다! 내가 잊었을 때 (많은) 순간 중 하나 였을 것입니다. j두 숫자가 공동 프라임인지 테스트하는 데 사용할 수도 있습니다.
Shaggy

3

Mathematica, 33 바이트

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

U + F4A1 포함


인쇄 할 수없는 것은 무엇입니까?
Rɪᴋᴇʀ

3
@EasterlyIrk는 명명 된 인수를 가진 명명되지 않은 함수를 소개합니다. Mma에서 화살표로 렌더링됩니다.
Martin Ender

@MartinEnder 아, 멋지다.
Rɪᴋᴇʀ

U + F4A1은 개인용 문자입니다. Martin이 말했듯이 Mathematica에서 화살표로 렌더링됩니다.
Zacharý



3

memes , 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

}다음 입력 항목에 액세스하지만 마지막 입력이 주어지면 반복되므로 STDIN과 6같이 입력 하면 6 6 6 6 6 ...하나에서 두 개의 출력을 읽을 수 있습니다.


오늘이 언어를 만들었습니까? 도전 전에 이루어지면 경쟁이 아니어야합니다.
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 바이트가 절약되었습니다.


주위에 괄호를 제거하여 2 바이트를 줄일 수 있습니다.(n)
Conor O'Brien

2

파이썬 3 , 60 바이트

새 람다를 작성하는 대신 gcd를 가져옵니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

import math
lambda c:[i for i in range(c)if math.gcd(c,i)<2]

나는 당신 이 이것을 더 골프 있다고 생각하지 않습니다 . gcd를 직접 가져 오거나 m을 수학으로 가져 오면 바이트가 추가됩니다.
Rɪᴋᴇʀ

2

줄리아, 30 바이트

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

익명의 기능. filter함수에 따라 사실이 아닌 요소를 목록에서 제거합니다.

이 경우 함수는 x->(gcd(n,x)<2)(입력의 gcd와 list 요소가 2보다 작 으면 참)입니다. 목록은 범위 1:n입니다.


2

PARI / GP , 27 바이트

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

버전 2.6.0 (2013)에 도입 된 집합 표기법을 사용합니다. 이전 버전에서는 4 바이트가 더 필요했습니다.

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를 참조하거나 검색에 설명되어 있습니다 <-).
Charles



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.