Hay una gran cantidad de funciones generadoras principales. Casi todos están construidos y se basan en el tamiz de Eratóstenes, la función de Möbius o el teorema de Wilson y, en general, no son factibles de calcular en la práctica. Pero también hay generadores, que tienen una estructura muy fácil y se encontraron por accidente.
En 2003, Stephen Wolfram exploró una clase de ecuaciones de recurrencia anidadas en un experimento de computadora en vivo en la Escuela de Verano de NKS. Un grupo de personas alrededor de Matthew Frank siguió con experimentos adicionales y descubrió una propiedad interesante de la simple recurrencia.
a(n) = a(n-1) + gcd(n,a(n-1))
con el valor inicial de a(1) = 7
. La diferencia a(n) - a(n-1) = gcd(n,a(n-1))
siempre parecía ser 1 o primo. Las primeras diferencias son ( 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 solo omitimos los 1s, obtenemos la siguiente secuencia ( 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 demostró la importancia de cada elemento en esta lista unos años más tarde. Como puede ver, los números primos se mezclan y algunos de ellos aparecen varias veces. También se ha demostrado que la secuencia incluye infinitos primos distintos. Además, se conjetura que aparecen todos los números primos impares.
Debido a que este generador principal no se construyó sino que simplemente se encontró por accidente, el generador principal se llama "natural". Pero tenga en cuenta que en la práctica este generador también es bastante inviable de calcular. Como resultado, un p principal aparece solo después de (p–3)/2
1s consecutivos. Sin embargo, implementar este generador principal será su tarea.
Reto:
Escriba una función o un programa que imprima los primeros n
elementos de la secuencia A137613
(la secuencia sin los 1). Puede leer el número de entrada a n >= 0
través de STDIN, argumento de línea de comandos, indicador de solicitud o argumento de función. Envíe los primeros n
elementos en cualquier formato legible a STDOUT, o devuelva una matriz o una lista con estos valores.
Este es el código de golf. Por lo tanto, el código más corto gana.
Tabla de clasificación:
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma. Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
donde N es el tamaño de su envío. Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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
ser cero?//
) y explíquelo en su envío. Si alguien no está de acuerdo contigo, siempre puedes editar tu publicación.Respuestas:
Pyth,
1413 bytesUsos
a(n) = Lpf(6 - n + sum(a(i) for i in range(1, n))
dondeLpf
significa menos factor primo.Pruébalo aquí en línea.
fuente
Python 3.5.0b1 +,
9593 bytesEnlace a Python 3.5.0b1 + versión
Una implementación directa de la recurrencia, que incluye:
1%x
ymath.gcd
, a diferencia defractions.gcd
.fuente
1%x
hacer? Pregunta secundaria: ¿dónde encuentro documentación del historial de revisiones de Python que incluye betas? Editar: No importa, lo encontré al final del historial de revisiones .x >= 1
,1%x
devuelve 0 six == 1
, 1 de lo contrario (se usa para decidir si se agregax
a la lista)Julia, 110 bytes
Sin golf:
fuente
n<2
lugar den==1
. Además, si mira hacia adelante en lugar de hacia atrás, puede usari=1
yx=a(i)-a(i+=1)
, y luegoprintln(-x)
y-x>1
para corregir la negatividad, evitando así la necesidad de un incremento separado dei
. Y≥
es tres bytes, mientras que>=
es dos ... pero luego, puede usar enn<1||()
lugar den>=1&&()
... y, sin embargo, ni siquiera es necesario en primer lugar (descarte el condicional, n nunca será menor que 1). Tampoco necesita los corchetes más externos al definir un (n). Con estos cambios, al menos debería bajar a 97 bytes.PHP,
1019699987772 bytesUso:
llame a la secuencia de comandos con un argumento:
php -d error_reporting=0 script.php 30
si desea probarlo, debe descomentarlo
;extension=php_gmp.dll
en su php.ini->
extension=php_gmp.dll
¿Debo agregar la extensión a mi recuento de bytes? ¿Alguna idea?
Registro:
Guardado 3 bytes gracias a Ismael Miguel.
Guardado 26 bytes gracias a primo.
fuente
<?
y eliminar la definición de$j
.<
en$j<=$argv[1]
(imprime demasiadas) (-1). Deje sin$e
inicializar, use$e+7
en su lugar (-3). Use enfor(;;)
lugar dewhile()
, haciendo uso de las expresiones pre y post (-2). Reemplaceecho$t.' ';$j++
con$j+=print"$t "
, suelte los soportes (-3). Reemplazarif($t>1)
con2>$t||
(-2). Combine la asignación a$t
con el condicional, cambie||
poror
, suelte los corchetes (-5). Muévase$argv[1]
al$j
incremento, mueva toda la expresión alfor
condicional (-2). Cambiar>=$j+=print
a-=print
(-3). Paso a paso: codepad.org/s6LNSPSM$e+7
con$e+=$t
(-2). Deje sin$i
inicializar, use~++$i
en su lugar (-3). codepad.org/fDIImajpHaskell, 51 bytes
Tenga en cuenta que
f
es una función que devolverá los primeros n elementos.En lugar de calcular
a(n)
y luego resolver las diferencias, calculamos las diferenciasd(n)
y las sumamos para obtenera(n)
. (Aquellos que no estén familiarizados con Haskell pueden protestar que necesitamosa(n)
primero para llegard(n)
, ¡pero, por supuesto, la evaluación perezosa nos ayuda a resolver este problema!Sin golf:
fuente
Pyth, 30 bytes
Muy mal golf, se puede reducir considerablemente. Define la función recursiva en la parte delantera, filtra
.f
primero y luego asigna la diferencia.Pruébalo aquí en línea .
fuente
n = 0
Julia,
6967 bytesEsta es una solución iterativa simple al problema.
x
es la diferencia (que es elgcd
), y luego actualizoa
agregandox
.fuente
JavaScript (ES6), 91
MCD recursivo, función principal iterativa. No tan rapido.
Nota habitual: pruebe ejecutar el fragmento en cualquier navegador compatible con EcmaScript 6 (en particular, no Chrome ni MSIE. Probé en Firefox, Safari 9 podría funcionar)
fuente
Haskell,
747166 bytesUsé el truco aquí: https://codegolf.stackexchange.com/a/39730/43318 , y se hizo sin puntos.
(Anterior: 71 bytes)
Primero haga la secuencia de a, y luego tome las diferencias.
(Anterior: 74 bytes)
Funciones de lista estándar, más el uso inteligente de la función lambda. Tenga en cuenta que esto es 1 byte más corto que el más obvio
Si no contamos las importaciones, puedo reducir esto a 66.
fuente
PARI / GP, 60 bytes
Tomado más o menos directamente de la definición a (n) - a (n-1) = mcd (n, a (n-1))
Salida para
a(20)
:fuente
C ++,
193182180172 bytesGracias @Jakube: ahorré 8 bytes en la salida.
fuente
f
, que devuelve una matriz con los resultados. De esta forma, puede eliminar la inclusión, el scanf y la impresión.Mathematica, 59 bytes
fuente