Il existe un assez grand nombre de fonctions génératrices principales. La plupart d'entre elles sont construites et sont basées sur le tamis d'Eratosthène, la fonction de Möbius ou le théorème de Wilson et sont généralement impossibles à calculer en pratique. Mais il y a aussi des générateurs, qui ont une structure très facile et qui ont été trouvés par accident.
En 2003, Stephen Wolfram a exploré une classe d’équations de récurrence imbriquée dans le cadre d’une expérience informatique en direct à l’Université d’été NKS. Un groupe de personnes autour de Matthew Frank a poursuivi avec d'autres expériences et a découvert une propriété intéressante de la simple récurrence
a(n) = a(n-1) + gcd(n,a(n-1))
avec la valeur de départ de a(1) = 7
. La différence a(n) - a(n-1) = gcd(n,a(n-1))
semblait toujours être 1 ou un prime. Les premières différences sont les suivantes ( 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, ...
Si nous omettons uniquement les 1, nous obtenons la séquence suivante ( 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 a prouvé la primauté de chaque élément de cette liste quelques années plus tard. Comme vous pouvez le constater, les nombres premiers sont mélangés et certains d’entre eux apparaissent plusieurs fois. Il a également été prouvé que la séquence comprenait une infinité de nombres premiers distincts. De plus, on suppose que tous les nombres premiers impairs apparaissent.
Parce que ce générateur principal n'a pas été construit mais simplement trouvé par accident, le générateur principal s'appelle "se produisant naturellement" Mais notez que, dans la pratique, ce générateur est également très difficile à calculer. Il se trouve que le nombre premier p apparaît uniquement après (p–3)/2
des 1 consécutifs. Néanmoins, l'implémentation de ce premier générateur sera votre tâche.
Défi:
Ecrivez une fonction ou un programme qui affiche les premiers n
éléments de la séquence A137613
(la séquence sans les 1). Vous pouvez lire le numéro d'entrée n >= 0
via STDIN, un argument de ligne de commande, une invite ou un argument de fonction. Exportez les premiers n
éléments dans n'importe quel format lisible vers STDOUT ou renvoyez un tableau ou une liste avec ces valeurs.
C'est du code-golf. Par conséquent, le code le plus court gagne.
Classement:
Voici un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue. Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# 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
être zéro?//
) et l'expliquer dans votre soumission. Si quelqu'un n'est pas d'accord avec vous, vous pouvez toujours modifier votre message.Réponses:
Pyth,
14 à13 octetsUtilisations
a(n) = Lpf(6 - n + sum(a(i) for i in range(1, n))
oùLpf
signifie le moins facteur premier.Essayez-le ici en ligne.
la source
Python 3.5.0b1 +,
9593 octetsLien vers Python 3.5.0b1 + release
Une implémentation directe de la récurrence, comprenant:
1%x
, etmath.gcd
, par opposition àfractions.gcd
.la source
1%x
-il? Question annexe: où se trouve la documentation de l'historique des révisions de Python incluant les bêtas? Edit: Nevermind, trouvé au bas de l' historique de révision .x >= 1
,1%x
retourne 0 six == 1
, 1 sinon (utilisé pour décider d'ajouter ou nonx
à la liste)Julia, 110 octets
Ungolfed:
la source
n<2
au lieu den==1
. De plus, si vous regardez en avant au lieu d’arrière, vous pouvez utiliseri=1
etx=a(i)-a(i+=1)
, puis,println(-x)
et-x>1
pour corriger de la négativité, évitant ainsi l’incrément dei
. Et≥
est trois octets, alors que>=
est deux ... mais alors, vous pouvez utilisern<1||()
plutôt quen>=1&&()
... et pourtant, il n'est même pas nécessaire en premier lieu (supprimez le conditionnel, n ne sera jamais inférieur à 1). Vous n'avez également pas besoin des crochets les plus à l'extérieur pour définir un (n). Avec ces modifications, vous devriez au moins descendre à 97 octets.PHP,
1019699987772 octetsUtilisation:
Appelez le script avec un argument:
php -d error_reporting=0 script.php 30
Si vous voulez le tester, vous devez supprimer le commentaire
;extension=php_gmp.dll
dans votre php.ini->
extension=php_gmp.dll
Devrais-je ajouter l'extension à mon nombre d'octets? Des pensées?
Journal:
3 octets enregistrés grâce à Ismael Miguel.
Sauvegardé 26 octets grâce à primo.
la source
<?
et supprimer la définition de$j
.<
dans$j<=$argv[1]
(en imprimer un de trop) (-1). Laissez$e
non initialisé, utilisez$e+7
plutôt (-3). Utilisezfor(;;)
au lieu dewhile()
, en utilisant les expressions avant et après (-2). Remplacerecho$t.' ';$j++
par$j+=print"$t "
, lâcher les crochets (-3). Remplacezif($t>1)
par2>$t||
(-2). Combinez l’affectation de$t
avec le conditionnel, changez||
pouror
, supprimez les crochets (-5). Déplacer$argv[1]
vers l'$j
incrément, déplace l'intégralité de l'expression vers lefor
conditionnel (-2). Changer>=$j+=print
en-=print
(-3). Étape par étape: codepad.org/s6LNSPSM$e+7
avec$e+=$t
(-2). Laissez$i
non initialisé, utilisez~++$i
plutôt (-3). codepad.org/fDIImajpHaskell, 51 octets
Notez que
f
c'est une fonction qui retournera les n premiers éléments.Plutôt que de
a(n)
calculer les différencesd(n)
puis de les calculer, nous les calculons et les additionnons pour les obtenira(n)
. (Ceux qui ne sont pas familiers avec Haskell peuvent protester contre le fait que nous avons besoin d’a(n)
abord pour obtenird(n)
, mais bien sûr, une évaluation paresseuse nous aide à résoudre ce problème!)Ungolfed:
la source
Pyth, 30 octets
Très mal joué au golf, peut être considérablement réduit. Définit la fonction récursive au premier plan, filtre le
.f
premier-n, puis mappe la différence.Essayez-le ici en ligne .
la source
n = 0
Julia,
6967 octetsC'est une solution simple et itérative au problème.
x
est la différence (qui est legcd
), puis je mets à joura
en ajoutantx
.la source
JavaScript (ES6), 91
Gcd récursif, fonction principale itérative. Pas si vite.
Note habituelle: testez l’exécution de l’extrait de code sur n’importe quel navigateur conforme à EcmaScript 6 (notamment pas Chrome ni MSIE. J’ai testé sur Firefox, Safari 9 pourrait fonctionner)
la source
Haskell,
747166 octetsUtilisé le truc ici: https://codegolf.stackexchange.com/a/39730/43318 , et rendu sans point.
(Previous: 71 bytes)
Commencez par faire la séquence de a, puis prenez les différences.
(Précédent: 74 octets)
Fonctions de liste standard, plus utilisation intelligente de la fonction lambda. Notez que c'est un octet plus court que le plus évident
Si nous ne comptons pas les importations, je peux le réduire à 66.
la source
PARI / GP, 60 octets
Tiré plus ou moins directement de la définition a - (n) - a (n-1) = gcd (n, a (n-1))
Sortie pour
a(20)
:la source
C ++,
193182180172 octetsMerci @Jakube - 8 octets enregistrés en sortie.
la source
f
, qui renvoie un tableau avec les résultats. De cette façon, vous pouvez supprimer l'include, le scanf et l'impression.Mathematica, 59 octets
la source