Ejercicios

1.

Dada una lista de números enteros, construye un conjunto con los factores primos de todos los números de la lista.

Indicación: Usa list(k.factor()) para obtener los factores primos.

2. Histograma

Almacena en un diccionario los pares letra:frecuencia resultantes de hacer el análisis de frecuencias de una cadena de texto:

3. Frecuencias de palabras

El método split permite descomponer una cadena de caracteres en palabras:

cadena = 'El metodo split permite descomponer una cadena de caracteres usando un caracter como separador.'
cadena.split()
['El', 'metodo', 'split', 'permite', 'descomponer', 'una', 'cadena',
'de', 'caracteres', 'usando', 'un', 'caracter', 'como', 'separador.']
  • Crea una función que acepte como argumento una cadena de caracteres, y devuelva un diccionario cuyas claves sean las palabras de la cadena, y los valores sean las frecuencias de aparición de cada palabra.
  • Aprovecha el resultado de la función anterior para seleccionar las palabras que aparecen más de 3 veces.
sage: cadena = '''Los pitónidos o pitones (Pythonidae) son una familia de serpientes constrictoras. Otras fuentes consideran este grupo una subfamilia de la familia de las boas (Boidae) (subfamilia Pythoninae).[1] El género Python (género) fue descrito por Daudin en 1803. Las pitones se pueden distinguir de las boas en que tienen dientes en el premaxilar, un pequeño hueso en la parte frontal de la mandíbula superior. La mayoría de las boas dan a luz crías vivas, mientras que las pitones ponen huevos. A algunas especies de boas de arena (subfamila Ericinae) se les llama erróneamente pitones.'''

4. Conjuntos y el problema de Collatz.

La sucesión de Collatz, o del 3*n+1, que ya vimos, consiste en aplicar sucesivamente la siguiente regla:

  • Si un número es par, el siguiente número de la secuencia es n/2.
  • Si es impar, el siguiente número de la secuencia es 3n+1.

Se conjetura que una sucesión de Collatz siempre alcanza 1, independientemente del número en que comienza. El codigo siguiente comprueba que las sucesiones que comienzan con cualquier número menor que M alcanzan 1 de una forma poco eficiente:

sage: %time
sage: M = 500
sage: for k in range(2,M):
...       j = k
...       while j!=1:
...           if j%2==0:
...               j = j/2
...           else:
...               j =  3*j + 1
sage: #Si el calculo ha terminado, es que hemos verificado la conjetura
sage: print 'Verificada la conjetura para k<=%d'%M

Con el método anterior, calculamos la sucesión de Collatz completa partiendo de cada número, a pesar de que a menudo la sucesión partiendo de un número j engancha con la sucesión partiendo de un número anterior. Por ejemplo, la sucesión partiendo de 19 alcanza 11 después de 6 iteraciones, y a partir de allí obviamente coincide con la sucesión partiendo de 11, que ya sabíamos que acaba en 1.

11 : 34 17 52 26 13 40 20 10 5 16 8 4 2 1
19 : 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

Es fácil hacer una pequeña mejora al programa: en vez de dar la comprobación por buena cuando alcanzamos 1, terminamos en cuanto alcanzamos un número menor que el número con el que comenzamos:

sage: %time
sage: M = 500
sage: for k in range(2,M):
...       j = k
...       while j>=k:
...           if j%2==0:
...               j = j/2
...           else:
...               j =  3*j + 1
sage: #Si el calculo ha terminado, es que hemos verificado la conjetura
sage: print 'Verificada la conjetura para k<=%d'%M

Aún podemos hacer una mejora más. Observa las sucesiones que comienzan por 27 y 47:

27 : 82 41 124 62 31 94 47 142 71 214 107 322 161 484 242 121 364 182 91
274 137 412 206 103 310 155 466 233 700 350 175 526 263 790 395 1186 593
1780 890 445 1336 668 334 167 502 251 754 377 1132 566 283 850 425 1276
638 319 958 479 1438 719 2158 1079 3238 1619 4858 2429 7288 3644 1822
911 2734 1367 4102 2051 6154 3077 9232 4616 2308 1154 577 ...
47: 142 71 214 107 322 161

Observamos que el 47 ya apareció en la secuencia del 27, y por lo tanto ya no tenemos que hacer más cuentas para verificar el número 47. Sin embargo, el programa anterior perdió esta oportunidad de ahorrar tiempo.

Después de tanto preámbulo, tu objetivo es :

  • Calcular la sucesión de Collatz comenzando por 2,3,... hasta M.
  • Almacenar en un conjunto los valores de la sucesión que vas encontrando.
  • Si en algún momento de tu camino encuentras un valor conocido, abandona el cálculo de la sucesión del número actual y procede a calcular la sucesión que comienza por el número siguiente.

5. Conjetura de Goldbach

La conjetura de Goldbach afirma que todo número par se puede expresar como suma de dos números pares. Confirma la conjetura para todos los números pares menores que una cota K siguiendo la estrategia siguiente:

  • Crea un conjunto con todos los números pares menores que K
  • Crea un conjunto con todas las sumas de números primos menores que K
  • Calcula la diferencia de los conjuntos para ver si todo par se puede expresar como suma de dos primos

6. Dos dados

  • Crea un diccionario cuyas claves sean los números enteros entre 2 y 12, y su valor en el número k sea una lista de tuplas con todas las posibles formas de sumar k usando dos números enteros entre 1 y 6.
print dd[3]

[(1,2),(2,1)]

print dd[4]

[(1,3),(2,2),(3,1)]
  • Generaliza el resultado a dados con un rango mayor de valores, o a un número arbitrario de dados.

Contenidos

Tema anterior

Conjuntos y diccionarios

Próximo tema

Tiempo de ejecución y eficiencia de algoritmos

Esta página