Es gibt eine große Anzahl von Funktionen zur Erzeugung von Primzahlen. Ziemlich alle von ihnen sind konstruiert und basieren auf dem Sieb von Eratosthenes, der Möbius-Funktion oder dem Wilson-Theorem und sind im Allgemeinen in der Praxis nicht berechenbar. Es gibt aber auch Generatoren, die einen sehr einfachen Aufbau haben und zufällig gefunden wurden.
Im Jahr 2003 untersuchte Stephen Wolfram eine Klasse verschachtelter Wiederholungsgleichungen in einem Live-Computerexperiment an der NKS Summer School. Eine Gruppe von Menschen um Matthew Frank hat daraufhin weitere Experimente durchgeführt und eine interessante Eigenschaft der einfachen Wiederholung entdeckt
a(n) = a(n-1) + gcd(n,a(n-1))
mit dem Startwert von a(1) = 7
. Der Unterschied a(n) - a(n-1) = gcd(n,a(n-1))
schien immer 1 oder eine Primzahl zu sein. Die ersten Unterschiede sind ( 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, ...
Wenn wir nur die Einsen weglassen, erhalten wir die folgende Sequenz ( 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 bewies einige Jahre später die Primität jedes Elements in dieser Liste. Wie Sie sehen können, sind die Primzahlen gemischt und einige von ihnen erscheinen mehrmals. Es wurde auch nachgewiesen, dass die Sequenz unendlich viele verschiedene Primzahlen enthält. Weiterhin wird vermutet, dass alle ungeraden Primzahlen auftreten.
Da dieser Primärgenerator nicht konstruiert wurde, sondern einfach zufällig gefunden wurde, wird der Primärgenerator als "natürlich vorkommend" bezeichnet. Beachten Sie jedoch, dass sich dieser Generator in der Praxis auch nicht berechnen lässt. Wie sich herausstellt, erscheint eine Primzahl p erst nach (p–3)/2
aufeinanderfolgenden Einsen. Trotzdem wird es Ihre Aufgabe sein, diesen Primärgenerator zu implementieren.
Herausforderung:
Schreiben Sie eine Funktion oder ein Programm, das die ersten n
Elemente der Sequenz druckt A137613
(die Sequenz ohne die Einsen). Sie können die Eingabenummer n >= 0
über STDIN, Befehlszeilenargument, Eingabeaufforderung oder Funktionsargument lesen . Geben Sie die ersten n
Elemente in einem beliebigen lesbaren Format an STDOUT aus oder geben Sie ein Array oder eine Liste mit diesen Werten zurück.
Das ist Code-Golf. Daher gewinnt der kürzeste Code.
Bestenliste:
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren. Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wobei N die Größe Ihrer Einreichung ist. Wenn Sie Ihre Punktzahl verbessern, können Sie alte Punkte in der Überschrift behalten, indem Sie sie durchstreichen. Zum Beispiel:
# 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>
a(n)-a(n-1)
n
null sein?//
) und erkläre es in deinem Beitrag. Wenn jemand mit Ihnen nicht einverstanden ist, können Sie Ihren Beitrag jederzeit bearbeiten.Antworten:
Pyth,
1413 BytesVerwendet,
a(n) = Lpf(6 - n + sum(a(i) for i in range(1, n))
wo derLpf
kleinste Primfaktor bedeutet.Probieren Sie es hier online.
quelle
Python 3.5.0b1 +,
9593 BytesLink zu Python 3.5.0b1 + Release
Eine direkte Implementierung der Wiederholung mit:
1%x
undmath.gcd
im Gegensatz zufractions.gcd
.quelle
1%x
das? Nebenfrage: Wo finde ich eine Dokumentation des Versionsverlaufs von Python, der Betas enthält? Edit: Nevermind, fand es am Ende der Revisionshistorie .x >= 1
, den1%x
Wert 0 zurück , wennx == 1
, 1 sonst (verwendet zu entscheiden , ob hinzufügenx
zur Liste)Julia, 110 Bytes
Ungolfed:
quelle
n<2
anstelle vonn==1
. Wenn Sie vorwärts statt rückwärts schauen, können Sie auchi=1
undx=a(i)-a(i+=1)
und dannprintln(-x)
und verwenden-x>1
, um die Negativität zu korrigieren, wodurch die Notwendigkeit eines separaten Inkrements von vermieden wirdi
. Und≥
ist drei Bytes, während>=
ist zwei ... aber dann können Sie verwenden,n<1||()
anstattn>=1&&()
... und doch ist es nicht einmal an erster Stelle erforderlich (löschen Sie die Bedingung, n wird nie kleiner als 1 sein). Sie brauchen auch nicht die äußersten Klammern, wenn Sie ein (n) definieren. Mit diesen Änderungen sollten Sie mindestens 97 Byte erreichen.PHP,
1019699987772 BytesVerwendung:
Rufen Sie das Skript mit einem Argument auf:
php -d error_reporting=0 script.php 30
Wenn Sie es testen möchten, müssen
;extension=php_gmp.dll
Sie das Kommentarzeichen in Ihrer php.ini entfernen->
extension=php_gmp.dll
Soll ich die Erweiterung zu meiner Byteanzahl hinzufügen? Irgendwelche Gedanken?
Protokoll:
Dank Ismael Miguel wurden 3 Bytes gespeichert.
26 Bytes dank primo gespart.
quelle
<?
und die Definition von entfernen$j
.<
in$j<=$argv[1]
(druckt eine zu viele) (-1). Nicht$e
initialisieren,$e+7
stattdessen (-3) verwenden. Verwenden Siefor(;;)
stattdessenwhile()
die Vor- und Nachausdrücke (-2). Ersetzenecho$t.' ';$j++
durch$j+=print"$t "
, lassen Sie die Halterungen (-3) fallen. Ersetzen Sieif($t>1)
mit2>$t||
(-2). Kombinieren Sie die Zuordnung zu$t
mit der Bedingung, schalten Sie||
füror
, lassen Sie die Klammern (-5) fallen. Bewegen Sie sich$argv[1]
zum$j
Inkrement und verschieben Sie den gesamten Ausdruck in diefor
Bedingung (-2). Wechseln Sie>=$j+=print
zu-=print
(-3). Schritt für Schritt: codepad.org/s6LNSPSM$e+7
mit$e+=$t
(-2). Nicht$i
initialisieren,~++$i
stattdessen (-3) verwenden. codepad.org/fDIImajpHaskell, 51 Bytes
Beachten Sie, dass dies
f
eine Funktion ist, die die ersten n Elemente zurückgibt.Anstatt
a(n)
die Unterschiede zu berechnen und dann zu berechnen, berechnen wir sied(n)
und addieren sie, um sie zu erhaltena(n)
. (Diejenigen, die mit Haskell nicht vertraut sind, mögen protestieren, dass wira(n)
zuerst brauchen, um es zu bekommend(n)
, aber eine faule Bewertung bringt uns natürlich um dieses Problem herum!)Ungolfed:
quelle
Pyth, 30 Bytes
Sehr schlecht golfen, kann erheblich reduziert werden. Definiert die rekursive Funktion im
.f
Vordergrund , filtert zuerst n und bildet dann den Unterschied ab.Probieren Sie es hier online .
quelle
n = 0
Julia,
6967 BytesDies ist eine einfache iterative Lösung des Problems.
x
ist der Unterschied (der ist dergcd
), und dann aktualisiere icha
durch Hinzufügenx
.quelle
JavaScript (ES6), 91
Rekursive gcd, iterative Hauptfunktion. Nicht so schnell.
Üblicher Hinweis: Testen Sie die Ausführung des Snippets in jedem EcmaScript 6-kompatiblen Browser (insbesondere nicht in Chrome und nicht in MSIE. Ich habe es in Firefox getestet, Safari 9 könnte funktionieren).
quelle
Haskell,
747166 BytesHabe den Trick hier benutzt: https://codegolf.stackexchange.com/a/39730/43318 , und ohne Punkt gemacht.
(Vorher: 71 Bytes)
Machen Sie zuerst die Sequenz von a und nehmen Sie dann die Unterschiede.
(Vorher: 74 Bytes)
Standardlistenfunktionen sowie die clevere Verwendung der Lambda-Funktion. Beachten Sie, dass dies 1 Byte kürzer ist als das offensichtlichere
Wenn wir die Importe nicht zählen, kann ich das auf 66 reduzieren.
quelle
PARI / GP, 60 Bytes
Mehr oder weniger direkt aus der Definition a (n) - a (n-1) = gcd (n, a (n-1))
Ausgabe für
a(20)
:quelle
C ++,
193182180172 BytesDanke @Jakube - 8 Bytes bei der Ausgabe gespart.
quelle
f
, die ein Array mit den Ergebnissen zurückgibt. Auf diese Weise können Sie das Include, den Scanf und den Druck entfernen.Mathematica, 59 Bytes
quelle