Haciendo el primo!!!

Hoy os traigo un código, en python, claro, para generar números primos.

De entrada, el programa os pide un número tope y como respuesta genera todos los números primos menores o iguales que dicho tope.

Pinchad aquí: https://repl.it/FAOt/3

Si le pedimos que nos dé los números primos menores que 100, esto es lo que obtenemos:

Introduce el tope:  100
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Tiempo de ejecución:  0.0002932548522949219
Se pueden conseguir los primos hasta 10000 en un tiempo más que razonable, pero si buscamos los que hay hasta un millón la cosa se va a los siete segundos… Un día de estos le dedicaré un rato a mejorar el algoritmo.
Advertisements

Números de Lychrel

Me enteré de la existencia de estos números a través del blog El Aleph, alojado en el peródico El país.

Resulta que si eliges un número cualquiera y le sumas el número que se forma al invertir las cifras que lo componen, más tarde o más temprano (casi siempre) se obtiene un número que es palíndromo, que es la manera finolis de decir capicúa. Los números de Lychrel son precisamente aquellos con los que no se cumple esa circunstancia.

De todas formas, tengo que añadir que todavía no se ha probado la existencia de ninguno de estos, aunque sí hay algunos candidatos como, por ejemplo, el 196 que es el más pequeño de los posibles números de Lychrel. 

Veamos algún ejemplo: 324

324+423=747, capicúa a la primera!!!!

En muchas ocasiones se consigue un palíndromo a las primeras de cambio, como en el caso anterior, pero en otros la cosa no es tan fácil. Para conseguir un capicúa a partir del 89 tenemos que repetir el proceso 24 veces para obtener 8813200023188.

En el enlace que os adjunto más adelante tenéis un código en python que da el capicúa correspondiente al número que le metáis, siempre que sea posible, claro. Aquí tenéis el programilla:https://repl.it/GNpP/4

El programa da el capicúa de todos los números hasta el 1000, pero lo podéis modificar a vuestro gusto.

La función Lycrhel pide dos números. El primero es el número del que queremos hallar su capicúa y el segundo representa el tope de pasos antes de encontrar el palíndromo de marras, en el caso de que se deje encontrar, claro.

Veamos, como curiosidad, que conseguimos si metemos el número 592 con un tope de 1000 (print(Lychrel(592,1000))):

60793287784818478571665438705933128825709295175739056989
32713890921985726667904371799117832484816009389321028191
86752252856766066628422466118000002726468658295199740064
66086924099947193503049113014336548360549456323103120493
04391749990528790555699380015028657745283000007017731347
37551757649352148681829200248838017184832477218872734997
57627599019098426139897598376716820165278213395078454671
7587371858679328805

Está claro que no es palíndromo. ¿Será 592 un número de Lychrel?

Copos de nieve con ceros y unos.

Me enteré de la existencia de la secuencia de Thue-Morse a través del altísimamente recomendable blog Datagenetics.

Se empieza con el 0, se niega el 0 y se obtiene el 1, se niega ahora el 0 y el 1 y se obtiene el 0110. Si procedemos de la misma manera obtenemos 01101001. Y así sucesivamente.

En el siguiente enlace tenéis una implementación en Python:

https://repl.it/GB9s/5

De esta manera podemos comprobar que, por ejemplo, T(7) es igual a

01101001100101101001011001101001100101100110100101101001100101101001011001101001011010011001011001101001100101101001011001101001

La verdad es que no sé que utilidad puede tener esta curiosa secuencia de números, pero lo que me llamó la arención fue enterarme de que utilizando dicha secuencia se podía generar… ¡¡¡¡¡¡copos de nieve!!!!!!

En el blog antes nencionado, Datagenetics, se explica de la siguiente manera:

  If we encounter a zero, we turn 180°
  If we encounter a one, we step forward one space, then turn 60°

Perfecto para utilizar Python-Turtle. Aquí tenéis el código:

https://repl.it/GCMA/2

Este es el resultado si utilizamos una secuencia T(7):

2017-03-05-12-20-56

Desgraciadamente (bueno, tampoco hay que exagerar) si se intenta con secuencias mayores que T(7), el programa da error, pero algo es algo.

Ecuaciones diofánticas

El motivo de esta entrada consiste simplemente en mostrar un sencillo código en Python para resolver ecuaciones ( ‘encontrar soluciones’ sería,creo, una descripción más adecuada) diofánticas del tipo x^n+y^n=z^p.

Se puede acceder al código aquí: https://repl.it/For0/2, pero de todas formas lo voy a copiar para explicarlo un poco:

#Función para resolver ecuaciones diofánticas de la forma x^n+y^n=z^p

#Se introducen los exponentes n y p como parámetros de la función.
def diofan(n,p,num_it):

listado = []

for x in range(1,num_it):

for y in range(1,x+1):

if (x**n+y**n)**(1/p)==int((x**n+y**n)**(1/p)):

listado.append([x,y,(x**n+y**n)**(1/p)])

return listado

print(diofan(3,4,1000))

Como podéis comprobar, la función diofan pide tres argumentos que son, por este orden, los exponentes n y p y el número de iteraciones.

La función devuelve una lista formada, a su vez, de listas de longitud tres, consistentes en las soluciones x, y, z de la ecuación.

Si ejecuto el programa copiado más arriba se obtiene:

[[2, 2, 2.0], [18, 9, 9.0], [32, 32, 16.0], [84, 28, 28.0], [105, 70, 35.0], 
[162, 162, 54.0], [260, 65, 65.0], [288, 144, 72.0], [364, 273, 91.0], 
[512, 512, 128.0], [603, 469, 134.0], [630, 126, 126.0], [665, 266, 133.0], 
[760, 456, 152.0], [854, 793, 183.0], [945, 756, 189.0]]

Con lo cual descubrimos que, por ejemplo, 603^3+469^3=134^4, que es algo de lo cual yo no tenía la más mínima idea.

 

 

Secuencias de Ducci

Me encontré con estos números de casualidad, no recuerdo dónde. Se trata de elegir una secuencia de números como por ejemplo: 34,12,87,688 y calcular, a partir de de ella, la secuencia de los valores absolutos de las diferencias sucesivas: 22, 75, 601, 654. Resulta que si iteramos el proceso, siempre se alcanza la secuencia 0,0,0,0, en el caso de que la cantidad de números de la secuencia inicial sea potencia de 2, o se entra en un ciclo periódico en caso contrario.

Me pareció una oportunidad para practicar mi lenguaje de programación favorito, ¡Python! Aquí tenéis el código:

https://repl.it/F7hv/7

Cuando ejecutáis el programa, este os pregunta cuántos números tiene la secuencia original. Luego introducimos dichos números y ya está. Este es un ejemplo:

Dime la cantidad de números:  5
Número:  12
Número:  87
Número:  567
Número:  7
Número:  908
 
[12, 87, 567, 7, 908]
[75, 480, 560, 901, 896]
[405, 80, 341, 5, 821]
[325, 261, 336, 816, 416]
[64, 75, 480, 400, 91]
[11, 405, 80, 309, 27]
[394, 325, 229, 282, 16]
[69, 96, 53, 266, 378]
[27, 43, 213, 112, 309]
[16, 170, 101, 197, 282]
[154, 69, 96, 85, 266]
[85, 27, 11, 181, 112]
[58, 16, 170, 69, 27]
[42, 154, 101, 42, 31]
[112, 53, 59, 11, 11]
[59, 6, 48, 0, 101]
[53, 42, 48, 101, 42]
[11, 6, 53, 59, 11]
[5, 47, 6, 48, 0]
[42, 41, 42, 48, 5]
[1, 1, 6, 43, 37]
[0, 5, 37, 6, 36]
[5, 32, 31, 30, 36]
[27, 1, 1, 6, 31]
[26, 0, 5, 25, 4]
[26, 5, 20, 21, 22]
[21, 15, 1, 1, 4]
[6, 14, 0, 3, 17]
[8, 14, 3, 14, 11]
[6, 11, 11, 3, 3]
[5, 0, 8, 0, 3]
[5, 8, 8, 3, 2]
[3, 0, 5, 1, 3]
[3, 5, 4, 2, 0]
[2, 1, 2, 2, 3]
[1, 1, 0, 1, 1]
[0, 1, 1, 0, 0]
[1, 0, 1, 0, 0]
[1, 1, 1, 0, 1]
[0, 0, 1, 1, 0]
[0, 1, 0, 1, 0]
[1, 1, 1, 1, 0]
[0, 0, 0, 1, 1]
[0, 0, 1, 0, 1]
[0, 1, 1, 1, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 1, 0]
[1, 0, 1, 1, 1]
[1, 1, 0, 0, 0]
[0, 1, 0, 0, 1]
[1, 1, 0, 1, 1]

Extinción

Otro problema interesante de Riddler. Aquí va el enunciado:

At the beginning of time, there is a single microorganism. Each day, every member of this species either splits into two copies of itself or dies. If the probability of multiplication is p, what are the chances that this species goes extinct?

2017-01-29-19-21-00

El esquema anterior es bastante cutre, lo sé, pero creo que se entiende bastante bien: el primer microorganismo se multiplica por dos con una probabilidad 1-p y desaparece, por tanto, con probabilidad p. La probabilidad de extinción en la segunda generación es { \left( 1-p \right)  }^{ 2 }{ p }^{ 2 } ya que para que se produzca la extición se han de dar lo sucesos independientes consistentes en: no extinción en la primera generación seguido de extinción de los dos microorganismos resultantes. De la misma manera se deduce que la probabilidad de extinción en la tercera generación es { \left( 1-p \right)  }^{ 8 }{ p }^{ 4 } así que parece que la sucesión de probabilidades parece ser: p,{ \left( \left( 1-p \right) p \right)  }^{ 2 },{ \left( { \left( 1-p \right)  }^{ 2 }p \right)  }^{ 4 },...,{ \left( { \left( 1-p \right)  }^{ k }p \right)  }^{ { 2 }^{ k } },.... Con lo cual, todo consiste en calcular la bonita y simpática suma: p+\sum _{ k=1 }^{ \infty  }{ { \left( { \left( 1-p \right)  }^{ k }p \right)  }^{ { 2 }^{ k } } } .

Intimida un poco, ¿no? Lo que sí es cierto es que Wolfram no nos sirve de mucha ayuda en este caso.

¿Qué hacer, pues, en este caso? ¡Pues claro, Python!

Aquí podéis echarle un vistazo al código: https://repl.it/FY1p/0

Esto que copio a continuación es la probabilidad de extinción para cada p, de 0 a 1, centésima a centésima:

0.01 -> 0.010098019227447023
0.02 -> 0.02038429612209938
0.03 -> 0.030847444832437
0.04 -> 0.04147640675978251
0.05 -> 0.052260396389101384
0.06 -> 0.06318886005148681
0.07 -> 0.07425144566026255
0.08 -> 0.08543798167183572
0.09 -> 0.09673846371598158
0.1 -> 0.10814304751866444
0.11 -> 0.11964204690438476
0.12 -> 0.13122593581508257
0.13 -> 0.1428853534196001
0.14 -> 0.15461111151242618
0.15 -> 0.16639420351372522
0.16 -> 0.17822581448527652
0.17 -> 0.19009733166965387
0.18 -> 0.2020003551434409
0.19 -> 0.2139267082501383
0.2 -> 0.22586844754525823
0.21 -> 0.23781787204547072
0.22 -> 0.24976753162607718
0.23 -> 0.26171023445703323
0.24 -> 0.27363905340769856
0.25 -> 0.2855473313849072
0.26 -> 0.297428685598266
0.27 -> 0.30927701077123293
0.28 -> 0.3210864813368936
0.29 -> 0.33285155267385275
0.3 -> 0.3445669614506446
0.31 -> 0.3562277251569089
0.32 -> 0.36782914090661034
0.33 -> 0.3793667836031102
0.34 -> 0.39083650355823973
0.35 -> 0.4022344236579371
0.36 -> 0.41355693616576816
0.37 -> 0.4248006992529864
0.38 -> 0.4359626333399276
0.39 -> 0.44703991732868253
0.4 -> 0.4580299848013456
0.41 -> 0.468930520251858
0.42 -> 0.4797394554127326
0.43 -> 0.49045496573089087
0.44 -> 0.5010754670396077
0.45 -> 0.5115996124662616
0.46 -> 0.522026289608337
0.47 -> 0.5323546180030165
0.48 -> 0.5425839469088287
0.49 -> 0.5527138534112326
0.5 -> 0.5627441408578306
0.51 -> 0.5726748376231062
0.52 -> 0.5825061961972771
0.53 -> 0.5922386925890436
0.54 -> 0.6018730260277301
0.55 -> 0.6114101189465885
0.56 -> 0.6208511172258637
0.57 -> 0.6301973906716112
0.58 -> 0.6394505337042122
0.59 -> 0.6486123662290345
0.6 -> 0.6576849346607276
0.61 -> 0.66667051307219
0.62 -> 0.6755716044392911
0.63 -> 0.6843909419529263
0.64 -> 0.6931314903709092
0.65 -> 0.7017964473835087
0.66 -> 0.7103892449681009
0.67 -> 0.7189135507103546
0.68 -> 0.7273732690715906
0.69 -> 0.7357725425843773
0.7 -> 0.7441157529610163
0.71 -> 0.7524075221022756
0.72 -> 0.7606527129965036
0.73 -> 0.7688564305020443
0.74 -> 0.7770240220086436
0.75 -> 0.7851610779762271
0.76 -> 0.793273432352005
0.77 -> 0.8013671628692765
0.78 -> 0.8094485912335321
0.79 -> 0.8175242832034358
0.8 -> 0.825601048576
0.81 -> 0.8336859410866998
0.82 -> 0.8417862582363971
0.83 -> 0.8499095410577359
0.84 -> 0.8580635738341209
0.85 -> 0.8662563837844924
0.86 -> 0.8744962407268656
0.87 -> 0.8827916567330181
0.88 -> 0.8911513857858028
0.89 -> 0.8995844234493566
0.9 -> 0.908100006561
0.91 -> 0.9167076129519273
0.92 -> 0.925416961201908
0.93 -> 0.9342380104312371
0.94 -> 0.9431809601311358
0.95 -> 0.9522562500318166
0.96 -> 0.9614745600055662
0.97 -> 0.9708468100005808
0.98 -> 0.9803841600000236
0.99 -> 0.9900980100000001
1.0 -> 1.0

Ahora os dejo una gráfica de la función de probabilidad comparada con la recta identidad y=x. Aquí tenéis la dirección del archivo de desmos.

extincion

Hasta otra!!!!!

Actualización: pues resulta que no. Parece que en este caso no he dado con la respuesta correcta. Y el caso es que la solución era bastante sencilla. En fin …

 

 

Más monedas

El riddler de este viernes, en su modalidad express, viene con un interesante problema de probabilidad:

You and I find ourselves indoors one rainy afternoon, with nothing but some loose change in the couch cushions to entertain us. We decide that we’ll take turns flipping a coin, and that the winner will be whoever flips 10 heads first. The winner gets to keep all the change in the couch! Predictably, an enormous argument erupts: We both want to be the one to go first.

What is the first flipper’s advantage? In other words, what percentage of the time does the first flipper win this game?

Como viene siendo habitual últimamente lo he resuelto con python. Aquí os dejo el enlace: https://repl.it/FQol/5

Como podéis comprobar, la probabilidad es algo así como 0.53.

De todas formas creo que debería intentar resolver este problema analíticamente. Me estoy volviendo un poco perezoso con esto de la programación!!!

Si se me ocurre algo lo colgaré en el blog.

Sólo( ya sé que ahora no se le pone tilde, pero a mí ne gusta así) una cosa más: las soluciones de los anteriores riddler son las que yo di aquí.

SÍÍÍÍÍÍÍÍÍ!