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.
Almacena en un diccionario los pares letra:frecuencia resultantes de hacer el análisis de frecuencias de una cadena de texto:
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.'''
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.
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:
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.
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
- 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.