자연스럽게 발생하는 주요 발전기


42

많은 주요 생성 함수가 있습니다. 그것들의 대부분은 에라토스테네스의 체, 뫼비우스 함수 또는 윌슨의 정리에 기반을두고 있으며 일반적으로 실제로 계산하기가 불가능합니다. 그러나 매우 쉬운 구조를 가지고 우연히 발견 된 발전기도 있습니다.

2003 년 Stephen Wolfram은 NKS Summer School의 라이브 컴퓨터 실험에서 중첩 된 재귀 방정식을 탐색했습니다. Matthew Frank 주변의 사람들이 추가 실험을 수행하고 단순히 재발의 흥미로운 속성을 발견했습니다.

a(n) = a(n-1) + gcd(n,a(n-1))

시작 값이입니다 a(1) = 7. 그 차이는 a(n) - a(n-1) = gcd(n,a(n-1))항상 1 또는 소수 인 것처럼 보였다. 처음 몇 가지 차이점은 ( OEIS A132199 )입니다.

1, 1, 1, 5, 3, 1, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 3, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 3, 1, 5, 3, ...

1 만 생략하면 다음과 같은 순서를 얻습니다 ( OEIS A137613 ).

5, 3, 11, 3, 23, 3, 47, 3, 5, 3, 101, 3, 7, 11, 3, 13, 233, 3, 467, 3, 5, 3, 
941, 3, 7, 1889, 3, 3779, 3, 7559, 3, 13, 15131, 3, 53, 3, 7, 30323, 3, ...

Eric S. Rowland 는 몇 년 후이 목록의 각 요소의 중요성을 입증했습니다. 보시다시피, 소수는 혼합되어 있으며 일부는 여러 번 나타납니다. 또한이 시퀀스에는 무한히 많은 고유 한 소수가 포함되어 있음이 입증되었습니다. 또한 모든 홀수 소수가 나타나는 것으로 추측됩니다.

이 주요 발전기는 건설 된 것이 아니라 우연히 발견 되었기 때문에 "자연 발생"이라고합니다. 그러나 실제로이 생성기는 계산하기가 매우 불가능합니다. 결과적으로 소수는 (p–3)/2연속 1 초 후에 만 나타납니다 . 그럼에도 불구하고이 주요 생성기를 구현하는 것이 당신의 임무입니다.

도전:

n시퀀스 의 첫 번째 요소 A137613(1이없는 시퀀스) 를 인쇄하는 함수 또는 프로그램을 작성하십시오 . n >= 0STDIN, 명령 행 인수, 프롬프트 또는 함수 인수를 통해 입력 번호 를 읽을 수 있습니다 . n읽을 수있는 형식 의 첫 번째 요소를 STDOUT에 출력하거나 이러한 값을 가진 배열 또는 목록을 리턴하십시오.

이것은 코드 골프입니다. 따라서 가장 짧은 코드가 승리합니다.

리더 보드 :

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다. 답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

여기서 N은 제출 크기입니다. 점수를 높이면 헤드 라인을 쳐서 오래된 점수를 유지할 수 있습니다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes


1
주요 생성기가 구성되지 않은 동안 재귀를 사용하여 시험 분할을 효과적으로 구현하고 있습니다.
orlp

a (1) = 7 인 경우 시퀀스가 ​​7로 시작하지 않는 이유는 무엇입니까?
feersum

3
@feersum 우리가 걱정하는 순서는a(n)-a(n-1)
Maltysen

n0이 될 수 있습니까 ?
Sp3000

1
@jrenk 확실하지 않습니다. 어쩌면 2 자로 계산하고 (2자를 제거 //하기 때문에) 제출시 설명하십시오. 다른 사람이 나와 동의하지 않으면 언제든지 게시물을 편집 할 수 있습니다.
Jakube

답변:



7

파이썬 3.5.0b1 +, 95 93 바이트

링크 파이썬 3.5.0b1 + 출시

import math
def f(k,n=2,a=7,L=[]):x=math.gcd(n,a);return k and f(k-1%x,n+1,a+x,L+1%x*[x])or L

다음을 특징으로하는 재발의 직접적인 구현 :

  • 우리의 좋은 친구 1%x, 그리고
  • math.gcd와는 반대로 fractions.gcd.

무엇을 1%x합니까? 사이드 질문 : 베타를 포함하는 Python의 개정 내역에 대한 문서는 어디서 찾을 수 있습니까? 편집 : 신경 쓰지 마라, 개정 내역 하단에서 찾았습니다 .
mbomb007

@ mbomb007 이후 x >= 1이면 1%x0을 반환하고 x == 1그렇지 않으면 1을 반환합니다 ( x목록 에 추가할지 여부를 결정하는 데 사용 )
Sp3000

5

줄리아, 110 바이트

n->(a(n)=(n1&&(n==1?7:a(n-1)+gcd(n,a(n-1))));i=2;j=0;while j<n x=a(i)-a(i-1);x>1&&(j+=1;println(x));i+=1end)

언 골프 드 :

function a(n::Int)
    n  1 && (n == 1 ? 7 : a(n-1) + gcd(n, a(n-1)))
end

function f(n::Int)
    i = 2;
    j = 0;
    while j < n
        x = a(i) - a(i-1)
        if x > 1
            j += 1
            println(x)
        end
        i += 1
    end
end

와우, 완벽한 8k, 멋진 : D
Beta Decay

1
n<2대신에 사용하십시오 n==1. 당신이 뒤로 대신 앞으로 보면 또한, 당신은 사용할 수 있습니다 i=1x=a(i)-a(i+=1)다음 println(-x)-x>1하여 별도의 증가에 대한 필요성을 방지, 해결하기 위해 negativeness에 대한 i. 그리고 3 바이트 >=이지만 2는 ...하지만 ... n<1||()대신 사용할 수 있지만 n>=1&&()처음에는 필요하지 않습니다 (조건부 삭제, n은 절대로 1보다 작지 않습니다). a (n)을 정의 할 때 가장 바깥 쪽 대괄호도 필요하지 않습니다. 이러한 변경으로 최소한 97 바이트로 내려 가야합니다.
Glen O

5

PHP, 101 96 99 98 77 72 바이트

<?for(;2>$t=gmp_strval(gmp_gcd(~++$i,7+$e+=$t))or$argv[1]-=print"$t ";);


사용법 :
인수와 함께 스크립트를 호출하십시오 : php -d error_reporting=0 script.php 30
당신이 그것을 테스트하려면 ;extension=php_gmp.dllphp.ini에서 주석을 제거해야합니다
-> extension=php_gmp.dll
내 바이트 수에 확장자를 추가해야합니까? 이견있는 사람?


로그 :
Ismael Miguel 덕분에 3 바이트가 절약되었습니다.
primo 덕분에 26 바이트를 절약했습니다.


1
여는 태그를 줄이고 <?의 정의를 제거 할 수 있습니다 $j.
Ismael Miguel

1
그렇습니다. 그러나 그 개행을 제거 할 수 있습니다. 코드 크기를 세는 방법에 따라 1-2 바이트를 절약합니다.
Ismael Miguel

1
마이너 개선 : 사용 <$j<=$argv[1](인쇄 너무 많은 일) (-1). 남겨 $e초기화되지 않은, 사용 $e+7대신 (-3). 사전 표현 및 사후 표현 (-2)을 사용하여 for(;;)대신에 사용하십시오 while(). 교체 echo$t.' ';$j++$j+=print"$t "브래킷을 드롭 (-3). 교체 if($t>1)2>$t||(-2). 에 할당을 결합 $t조건, 스위치 ||에 대한 or브래킷을 드롭 (-5). 이동 $argv[1]받는 사람 $j, 증가받는 전체 표현식을 이동 for조건 (-2). 변경 >=$j+=print에 대한 -=print(-3). 단계별 : codepad.org/s6LNSPSM
primo

1
좋은 설명을 주셔서 감사합니다! 내가 그 모든 것을 할 수 있는지 몰랐습니다.
jrenk

1
몇 가지 더 : (-2) $e+7와 결합하십시오 $e+=$t. 남겨 $i초기화되지 않은, 사용 ~++$i대신 (-3). codepad.org/fDIImajp
primo

4

하스켈, 51 바이트

d=zipWith gcd[2..]$scanl(+)7d
f=($filter(>1)d).take

참고 f제 반환하는 함수이며 , N의 원소.

를 계산 한 a(n)다음 차이점을 해결하는 대신 차이점을 계산 d(n)하고 합산하여 얻을 수 a(n)있습니다. (하스켈에 익숙하지 않은 사람들은 a(n)먼저 우리가 필요하다는 항의를 할 수도 d(n)있지만, 게으른 평가는이 문제를 해결합니다!)

언 골프 드 :

a = scanl (+) 7 d        -- yielding a(n) = 7 + d(1) + d(2) + ... + d(n-1)
d = zipWith gcd [2..] a  -- yielding d(n) = gcd(n+1, a(n))

f n = take n $ filter (> 1) d -- get rid of 1s and take the first n

4

Pyth, 30 바이트

골프가 매우 나쁘면 상당히 줄일 수 있습니다. 앞에서 재귀 함수를 정의하고 .first-n을 필터링 한 다음 차이를 매핑합니다.

L?tb+KytbibK7m-yhdyd.ft-yhZyZQ

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


이에 대한 잘못된 출력을 제공n = 0
SP3000

2
Pyth의 버그 인 @ Sp3000. 풀 요청을하겠습니다.
Maltysen

버그 발견 및 수정-github가 DDoS를 중지하면 패치가 구현됩니다.
isaacg

1
다음은 meta.codegolf.stackexchange.com/questions/5318/… 입니다. 개인적으로 저는 프로그래밍 언어의 버그 수정을 해답으로 생각합니다
Thomas Weller

2
@ThomasWeller 그것은 일종의 언어 전체를 달성했습니다 ...
isaacg 2

4

줄리아, 69 67 바이트

n->(i=1;a=7;while n>0 x=gcd(i+=1,a);a+=x;x>1&&(n-=1;println(x))end)

이것은 문제에 대한 간단한 반복 솔루션입니다. x차이점 ( gcd) a이며을 추가하여 업데이트 합니다 x.


나는 그것이 A231900 인쇄한다고 생각합니다 .
alephalpha

@ alephalpha-오류가 있다고 생각합니다. 쉽게 고정됩니다. 이 과정에서 2 바이트를 줄였습니다.
Glen O

3

자바 스크립트 (ES6), 91

재귀 gcd, 반복적 인 주요 기능. 그렇게 빠르지 않습니다.

일반적인 참고 사항 : EcmaScript 6 호환 브라우저에서 스 니펫 실행 테스트 (특히 MSIE가 아닌 Chrome이 아닙니다. Firefox에서 테스트 한 경우 Safari 9로 이동 가능)

F=m=>{
  for(G=(a,b)=>b?G(b,a%b):a,o=[],p=7,n=1;m;d>1&&(o.push(d),--m))
    p+=d=G(++n,p);
  return o
}

O.innerHTML=F(+I.value)
<input id=I value=10><button onclick='O.innerHTML=F(+I.value)'>-></button>
<pre id=O></pre>


3

하스켈, 74 71 66 바이트

f=($filter(>1)$tail>>=zipWith(-)$scanl(\x->(x+).gcd x)7[2..]).take

여기 트릭을 사용했습니다 : https://codegolf.stackexchange.com/a/39730/43318 , 포인트가 없습니다.

(이전 : 71 바이트)

a=scanl(\x->(x+).gcd x)7[2..]
f m=take m$filter(>1)$zipWith(-)(tail a)a

먼저 a의 순서를 만든 다음 차이점을 고려하십시오.

(이전 : 74 바이트)

f m=take m$filter(>1)$map snd$scanl(\(x,d)->(\y->(x+y,y)).gcd x)(7,1)[2..]

표준 목록 기능 및 람다 기능의 영리한 사용. 이것은 명백한 것보다 1 바이트 짧습니다.

g m=take m$filter(>1)$map snd$scanl(\(x,d)n->(x+gcd x n,gcd x n))(7,1)[2..]

수입을 세지 않으면 66으로 줄일 수 있습니다.

import Data.List
h m=take m$filter(>1)$snd$mapAccumL(\x->(\y->(x+y,y)).gcd x)7[2..]

3

PARI / GP, 60 바이트

a(n)=a=7;i=1;while(n,if(1<d=gcd(i+=1,a),n-=1;print(d));a+=d)

정의 a (n)-a (n-1) = gcd (n, a (n-1)) 에서 다소 직선적으로 가져옴

에 대한 출력 a(20):

5
3
11
3
23
3
47
3
5
3
101
3
7
11
3
13
233
3
467
3

2

C ++, 193 182 180 172 바이트

감사합니다 @Jakube-출력에 8 바이트가 저장되었습니다.

int g(int a,int b){return a==b?a:a>b?g(b,a-b):g(a,b-a);}void f(int *r,int n){int m=1,i=0,a=7,b;while(i<n){b=g(a,++m);if(b>1){r[i]=b;++i;}a+=b;}}int main(){int r[6];f(r,6);}

함수를 정의하여 몇 바이트를 절약 할 수 f있으며, 결과와 함께 배열을 반환합니다. 이렇게하면 포함, 스캔 및 인쇄를 제거 할 수 있습니다.
Jakube

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