Istnieje dość duża liczba funkcji generujących liczby pierwsze. Prawie wszystkie z nich są zbudowane i opierają się na sicie Eratostenesa, funkcji Möbiusa lub twierdzeniu Wilsona i są generalnie niemożliwe do obliczenia w praktyce. Ale są też generatory, które mają bardzo łatwą strukturę i zostały znalezione przypadkowo.
W 2003 roku Stephen Wolfram zbadał klasę zagnieżdżonych równań rekurencyjnych w eksperymencie komputerowym na żywo w NKS Summer School. Grupa ludzi wokół Matthew Franka przeprowadziła dodatkowe eksperymenty i odkryła interesującą właściwość tego prostego nawrotu
a(n) = a(n-1) + gcd(n,a(n-1))
z wartością początkową a(1) = 7. Różnica a(n) - a(n-1) = gcd(n,a(n-1))zawsze wydawała się 1 lub liczbą pierwszą. Pierwsze kilka różnic to ( 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, ...
Jeśli pominiemy tylko jedynki, otrzymamy następującą sekwencję ( 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, ...
Kilka lat później Eric S. Rowland udowodnił prymat każdego elementu z tej listy. Jak widać, liczby pierwsze są mieszane, a niektóre z nich pojawiają się wiele razy. Udowodniono również, że sekwencja zawiera nieskończenie wiele różnych liczb pierwszych. Ponadto przypuszcza się, że pojawiają się wszystkie nieparzyste liczby pierwsze.
Ponieważ ten główny generator nie został skonstruowany, ale po prostu został znaleziony przypadkowo, główny generator nazywany jest „naturalnie występującym”. Zauważ jednak, że w praktyce generator ten jest również bardzo trudny do obliczenia. Jak się okazuje, pierwsze p pojawia się dopiero po (p–3)/2kolejnych 1s. Niemniej jednak wdrożenie tego generatora będzie Twoim zadaniem.
Wyzwanie:
Napisz funkcję lub program, który drukuje pierwsze nelementy sekwencji A137613(sekwencja bez 1s). Numer wejściowy można odczytać za n >= 0pomocą STDIN, argumentu wiersza poleceń, monitu lub argumentu funkcji. Wypisz pierwsze nelementy w dowolnym czytelnym formacie do STDOUT lub zwróć tablicę lub listę z tymi wartościami.
To jest golf golfowy. Dlatego wygrywa najkrótszy kod.
Tabela liderów:
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N jest rozmiarem twojego zgłoszenia. Jeśli poprawisz swój wynik, możesz zachować stare wyniki w nagłówku, przekreślając je. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=55272;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>