윌슨 수 계산


14

양의 정수 n이 주어지면 n 번째 윌슨 수 W (n)을 계산합니다 .

윌슨 수 공식

E = 1이면 N은 시근 모듈러스 보유 N 달리 E = -1. 다시 말해, 1 < x < n-1x 2 = 1 mod n 인 정수 x 가 존재하지 않는 경우 n 은 기본 근을 갖습니다 .

  • 이것은 이므로 입력 정수 n에 대해 n 번째 윌슨 수를 계산하는 함수 또는 프로그램에 가장 짧은 코드를 작성하십시오. > 0에 .
  • 1 기반 또는 0 기반 색인을 사용할 수 있습니다. 첫 n 개의 윌슨 번호 를 출력하도록 선택할 수도 있습니다 .
  • 이것은 OEIS 시퀀스 A157249 입니다.

테스트 사례

n  W(n)
1  2
2  1
3  1
4  1
5  5
6  1
7  103
8  13
9  249
10 19
11 329891
12 32
13 36846277
14 1379
15 59793
16 126689
17 1230752346353
18 4727
19 336967037143579
20 436486
21 2252263619
22 56815333
23 48869596859895986087
24 1549256
25 1654529071288638505

또한, 이후, N에 의해 Oeis 분열
H.PWiz

@EriktheOutgolfer 나는 원시 루트를 갖는 것이 의미하는 것을 추가했습니다.
마일

1
우리는 n으로 나눌 예정입니까?
Leaky Nun

경우 지금까지 내가 알고 있어요로 k = 1하고 e = -1, 제품의 결과가 될 것이다 0. (죄송합니다. 많은 질문을했지만 답변을 명확히해야합니다 : p)
Outgolfer Erik

2
이 숫자를 윌슨 몫 이라고 합니다. ㅏ윌슨 번호 고르게 윌슨 지수 분할 정수이다. 예를 들어 1313 | 36846277 . 또한 W (n)은 일반적으로 분모를 제외합니다.
Dennis

답변:



6

껍질 , 11 바이트

S÷ȯ→Π§foε⌋ḣ

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

설명

          ḣ   Range from 1 to input
     §foε⌋    Keep only those whose gcd with the input is 1
    Π         Product
  ȯ→          Plus 1
S÷            Integer division with input

설명을 추가 하시겠습니까? 나는 당신이 거기에 멋진 알고 있다고 생각합니다 ...
Outgolfer Erik

3

수학, 91 바이트

If[(k=#)==1,2,(Times@@Select[Range@k,CoprimeQ[k,#]&]+If[IntegerQ@PrimitiveRoot@#,1,-1])/#]&

@BillSteihn 다른 사람의 답변을 직접 편집하지 마십시오 ( 관련 메타 토론 ). 당신이 골프 제안을 가지고 있다면, 대신 의견을 남겨주세요!
정환 민

@JungHwanMin 네, 그 편집 내용을 발견했습니다! 규칙을 새 사용자를 도와 주셔서 감사합니다
J42161217

3

Pyth , 11 바이트

/h*Ff>2iTQS

여기 사용해보십시오!


어떻게?

  • /h*Ff>2iTQS -전체 프로그램.

  • S-포괄 범위 생성 [1, 입력]

  • f -필터 유지 :

    • iTQ -입력 된 GCD.

    • >2 -2보다 작습니다 (다음 중 하나로 대체 가능). q1 , !t)

  • *F-곱셈을 반복해서 적용합니다. 즉, 목록의 곱입니다.

  • h -제품을 1 씩 증가시킵니다.

  • / -입력과 바닥 구분.

TL; DR : [1, input] 범위의 입력에 대한 모든 coprimes를 가져 와서 제품을 가져 와서 증가시키고 입력으로 나눕니다.



2

J, 33 바이트

3 :'<.%&y>:*/(#~1&=@(+.&y))1+i.y'

이것은 다른 것보다 개선을 요청하는 것입니다. 나는 암묵적인 해결책을 먼저 시도했지만 이것보다 길었습니다.

설명

이것은 Xcoder의 솔루션을 J로 간단하게 번역 한 것입니다.

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





2

자바 스크립트 (ES6), 72 70 68 바이트

f=(n,p=1,i=n,a=n,b=i)=>i?f(n,b|a-1?p:p*i,i-=!b,b||n,b?a%b:i):-~p/n|0
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>

정수 분할이 다시 시작됩니다. 편집 : @Shaggy 덕분에 2 바이트가 절약되었습니다. 훨씬 재귀 적으로 만들어서 2 바이트를 더 절약하여 이전보다 작은 값으로 실패 할 수 있습니다.


70 바이트 (아직 전체 테스트를 수행 할 기회는 없었지만) :f=(n,i=n,p=1,g=(a,b)=>b?g(b,a%b):a)=>--i?f(n,i,g(n,i)-1?p:p*i):-~p/n|0
Shaggy

대신 배열 매핑을 시도하고 70 바이트로 낮추기 전에 작업 중이었던 재귀 솔루션으로 돌아갔습니다. 약간 엉망이지만 솔루션을 70 이하로 낮추기 위해 무언가를 구할 수 있습니다.(n,x=n)=>(g=s=>--x?g(s*(h=(y,z)=>z?h(z,y%z):--y?1:x)(n,x)):++s)(1)/n|0
Shaggy

@Shaggy 글쎄, 나는 그것을 다시 볼 영감을 받았지만, 그것이 당신이 기대하는 것이 확실하지 않습니다 ...
Neil

2

하스켈 , 42 바이트

f n=div(product[x|x<-[1..n],gcd x n<2]+1)n

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

다른 모든 답변으로 정수 나누기 트릭을 사용합니다.
1 기반 인덱스를 사용합니다.

설명

f n=                                       -- function
    div                                  n -- integer division of next arg by n
       (product                            -- multiply all entries in the following list
               [x|                         -- return all x with ...
                  x<-[1..n],               -- ... 1 <= x <= n and ...
                            gcd x n<2]     -- ... gcd(x,n)==1
                                      +1)  -- fix e=1

1

Japt , 11 바이트

õ fjU ×Ä zU

시도 해봐


설명

정수의 묵시적 입력 U.

õ

1에서 사이의 정수 배열을 생성하십시오 U.

fjU

필터 ( f)의 공동 소수 U.

×

곱셈으로 줄입니다.

Ä

1을 더하십시오.

zU

로 나누고 U결과를 플로어로 내재적으로 출력합니다.


n = 25 인 경우 1654529071288638400을 반환하며 1654529071288638505 일 것이므로 잘못되었을 것입니다.
RosLuP

@RosLuP : 챌린지 작성자가 확인한대로 32 비트 이상의 숫자를 처리 할 필요가 없습니다.
Shaggy

1

공리, 121 바이트

f(n)==(e:=p:=1;for i in 1..n repeat(if gcd(i,n)=1 then p:=p*i;e=1 and i>1 and i<n-1 and(i*i)rem n=1=>(e:=-1));(p+e)quo n)

어떤 유형을 추가하고 ungolf 및 결과

w(n:PI):PI==
   e:INT:=p:=1
   for i in 1..n repeat
       if gcd(i,n)=1 then p:=p*i
       e=1 and i>1 and i<n-1 and (i*i)rem n=1=>(e:=-1)
   (p+e)quo n

(5) -> [[i,f(i)] for i in 1..25]
   (5)
   [[1,2], [2,1], [3,1], [4,1], [5,5], [6,1], [7,103], [8,13], [9,249],
    [10,19], [11,329891], [12,32], [13,36846277], [14,1379], [15,59793],
    [16,126689], [17,1230752346353], [18,4727], [19,336967037143579],
    [20,436486], [21,2252263619], [22,56815333], [23,48869596859895986087],
    [24,1549256], [25,1654529071288638505]]
                                                  Type: List List Integer

(8) -> f 101
   (8)
  9240219350885559671455370183788782226803561214295210046395342959922534652795_
   041149400144948134308741213237417903685520618929228803649900990099009900990_
   09901
                                                    Type: PositiveInteger

1

자바 스크립트 (ES6), 83 81 80 78 76 68 바이트

이것에 대한 첫 번째 통과는 Neil의 솔루션보다 몇 바이트 더 길었기 때문에 원래 아래 배열 축소 솔루션을 선호하여 버렸습니다. 그 이후로 Neil과 연결하기 위해 골프를 쳤습니다.

n=>(g=s=>--x?g(s*(h=(y,z)=>z?h(z,y%z):--y?1:x)(n,x)):++s)(1,x=n)/n|0

시도 해봐

o.innerText=(f=
n=>(g=s=>--x?g(s*(h=(y,z)=>z?h(z,y%z):--y?1:x)(n,x)):++s)(1,x=n)/n|0
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>


비 재귀, 76 바이트

비 재귀 솔루션에 예상대로 나쁘지 않은 방법이 있는지 알아 보려고했습니다.

n=>-~[...Array(x=n)].reduce(s=>s*(g=(y,z)=>z?g(z,y%z):y<2?x:1)(--x,n),1)/n|0

시도 해봐

o.innerText=(f=
n=>-~[...Array(x=n)].reduce(s=>s*(g=(y,z)=>z?g(z,y%z):y<2?x:1)(--x,n),1)/n|0
)(i.value=8);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>

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