커닝햄 체인 계산


14

소수는 항상 사람들을 매료 시켰습니다. 2300 년 전 Euclid는 그의 "요소"에 썼습니다.

소수는 단위로 측정되는 것입니다.

즉 소수는 1(또는 그 자체로) 나눌 수 있음을 의미합니다 .

사람들은 항상 소수 사이의 관계를 찾아 왔고, ( "흥미로운"과 같이) 아주 이상한 것들을 생각해 냈습니다.

예를 들어, 소피 제르맹 소수는 소수입니다 p있는 2*p+1도 소수.

안전 소수는 소수입니다 p있는 (p-1)/2정확하게 소피 제르맹 소수의 하위 상태이다, 또한 소수.

이것들은 우리가이 도전에서 찾고있는 것과 관련이 있습니다.

유형 ICunningham 체인 일련의 소수입니다. 여기서 마지막 요소를 제외한 모든 요소는 Sophie Germain 소수 이며 첫 번째 요소를 제외한 모든 요소는 안전한 소수 입니다. 이 체인 의 요소 수를 길이 라고합니다 .

이것은 우리가 소수로 시작 p하고 계산 한다는 것을 의미합니다 q=2*p+1. 경우 q도 소수, 우리는 유형의 Cunnigham 체인이 나는 길이 2. 그런 다음 우리가 테스트 2*q+1다음 생성 된 번호가 합성 될 때까지, 등등하고있다.

유형 II 의 Cunningham 체인은 거의 동일한 원리에 따라 구성되며, 유일한 차이점은 2*p-1각 단계에서 확인한다는 것 입니다.

Cunningham 체인의 길이는 1 일 수 있으며 , 이는 2 * p + 1 또는 2 * p-1이 소수가 아님을 의미합니다. 우리는 이것에 관심이 없습니다 .

Cunningham 체인의 일부 예

2길이가 5 인 I 형 체인을 시작합니다 .

2, 5, 11, 23, 47

다음으로 구성된 숫자는 95소수가 아닙니다.
이것은 또한 즉, 우리에게 알려줍니다 5, 11, 2347형의 체인을 시작하지 않는 I를 가 선행 요소가 때문에.

2또한 길이가 3 인 II 형 체인을 시작합니다 .

2, 3, 5

다음은 9입니다.

11유형 II를 시도해 보겠습니다 ( 이전 유형 I 에서 제외 ).
글쎄, 21다음이 될 것입니다. 소수는 아닙니다. 그래서 우리는이 "체인"에 대해 길이 1을 가질 것입니다.

도전

다수 주어진하는 프로그램이나 함수를 작성 n입력 쓰기 / 복귀로의 시작 번호 n 번째 의 커닝햄 체인 유형 I 또는 II최소 길이는 2 (체인의 형태 다음에 공백이, 시작할 I 또는 II ), 콜론, 해당 체인 유형의 길이가 뒤 따릅니다. 프라임이 두 가지 유형의 체인 (타입 I 타입 II)을 시작하는 경우 타입 I 의 체인이 먼저 계산됩니다.

예: 2 I:5

n유형은 이전에 시작된 모든 유형의 체인의 일부일 수 있으며,이 경우 해당 유형의 체인의 시작 번호 로 간주해서는 안됩니다 .

이것이 어떻게 시작되는지 봅시다

우리는로 시작합니다 2. 그것이 첫 번째 소수이기 때문에 우리는를 포함하는 하위 소수로 시작하는 체인이 없다는 것을 확신 할 수 있습니다 2.
유형 체인의 다음 번호는입니다 2*2+1 == 5. 5프라임이므로, 길이 2 이상의 체인이 이미 있습니다.
우리는 그것을 첫 번째 체인으로 간주합니다. 유형 II는 어떻습니까? 다음 숫자는입니다 2*2-1 == 3. 3소수이므로 유형 II의 경우 길이 2 이상의 체인도 중요합니다.
우리는 그것을 두 번째 체인으로 간주합니다. 그리고 우리는 끝났습니다 2.

다음은 3입니다. 여기에서 낮은 프라임이 시작된 체인에 있는지 확인해야합니다.
유형 I를 확인하십시오 (3-1)/2 == 1. 1소수가 아니므로 3은 I 형 체인의 시작점이 될 수 있습니다
. 확인하겠습니다. 다음은 3*2+1 == 7. 7소수입니다. 그래서 우리는 적어도 길이 2의 타입 I의 체인을가집니다. 우리는 이것을 세 번째 체인으로 간주합니다.
이제 3낮은 프라임이 시작된 II 형 체인에 나타나는지 확인합니다 . (3+1)/2 == 2. 2소수이므로 3 은 유형 II 체인의 시작 번호 로 간주 할 수 없습니다 . 따라서이 3체인 이후의 다음 숫자가 계산 되더라도 계산되지 않습니다.5, 프라임입니다. (물론 우리는 이미 그것을 알고 있었고, 당신은 물론 이러한 검사를 수행하는 방법에 대한 자신의 방법에 대해 생각할 수 있고 생각해야합니다.)

그리고 우리가에 확인하므로 5, 7, 11우리는 적어도 길이 2의 n 번째 커닝햄 체인을 찾을 때까지 그렇게 계산에.

그런 다음 (또는 어쩌면 조금 전에 ;)) 찾은 체인의 전체 길이를 결정하고 이전에 언급 한 형식으로 결과를 인쇄해야합니다.

그건 그렇고 : 내 테스트 2에서 길이가 2보다 큰 두 유형의 체인을 시작한 것 외에는 소수를 발견하지 못했습니다 1.

입력 / 출력 예

입력

1

산출

2 I:5


입력

10

산출

79 II:3


입력

99

산출

2129 I:2


입력에 대한 출력 1..20

2 I : 5
2 II : 3
3 I : 2
7 II : 2
19 II : 3
29 I : 2
31 II : 2
41 I : 3
53 I : 2
79 II : 3
89 I : 6
97 II : 2
113 I : 2
131 I : 2
139 II : 2
173 I : 2
191 I : 2
199 II : 2
211 II : 2
229 II : 2

처음 5000 개의 출력 목록은 여기 에서 찾을 수 있습니다 .

이것은 코드 골프입니다. 출력에는 임의의 공백이 허용되지만 예제에서 볼 수 있듯이 단일 공백과 콜론으로 유형과 숫자를 구분해야합니다. 허점을 사용하는 것은 허용되지 않습니다. 특히 웹에서 결과를 얻는 것은 허용 되지 않습니다.

행운을 빕니다 :)


3
샌드 박스에서 얘기를 깜빡 했네요 : 그것은 쉬운 것을 증명 2하고 3있는 유일한 소수입니다 p모두있는 2p-12p+1소수이다, 그래서 2하는 유일한 소수 시작하는 두 종류의 비 사소한 커닝햄 체인.
피터 테일러

괜찮아. 도와 주셔서 감사합니다:)
Cabbie407

3
(대답에서 변환 된 의견.) 이중 체인 길이가 1보다 큰 프라임 은 없습니다2 . 다음은 제거 증명입니다.
pbeentje

다시 자세히 지적 해 주셔서 감사합니다. 당신은 그 말을하고 싶었습니까, 아니면 이것 때문에 도전을 어떻게 바꿔야한다고 생각하십니까?
Cabbie407

말만. 어떤 경우에도 도전이 바뀌지 않으며 골프에 도움이 될 수 있다고 생각합니다. 하나의 체인이 발견되면 다른 체인을 확인할 필요가 없습니다.
pbeentje

답변:


2

자바 스크립트, 236208 바이트

28 바이트 저장 :

p=(n,i=n)=>n%--i?p(n,i):i==1;f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:`+eval(`for(j=1;p(k=2*k+l);j++);j`))}

에 저장된 9 바이트 p와 기능 : 기능에 의해 대체되었다 에서 직접 문 기능.p=(n,i=n)=>n%--i?p(n,i):i==1
teval(...)f


이전 솔루션 :

p=n=>{for(i=n;n%--i&&i;);return 1==i};t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j};f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

예: f(6)

산출: 29 I:2

설명
나는 3 개 기능을 사용하고 있습니다

1 p : n 이 소수 인지 알기 : p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t : 1 또는 -1 인 m 매개 변수 에 따라 n 또는 I 유형의 n 으로 시작하는 Cunningham 체인의 길이를 알아야합니다 . t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f : 체인을 계산하고 ( for 루프 ) 결과를 표시합니다

f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

for loop : 각 숫자에 대해 Cunningham 체인 (필요한 경우 II, II)은 다음과 같은 경우에 유효합니다.

  • 숫자는 소수입니다
  • 전임자는 소수가 아니다
  • 후임자가 중요하다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.