sábado, 9 de diciembre de 2017

LOS NÚMEROS PRIMOS DE MERSENNE y II PARTE

En un post anterior ya se habló de los primos de Mersenne os os dejo el enlace:

Mersenne planteó la idea de generar números primos mediante la expresión 2^n-1, es decir elevando el número 2 a una potencia y restando 1.


Ahora quedaba demostrar que el número generado era primo, intuyó que para que la expresión generase un número primo, n ha de ser primo, pero era condición necesaria pero no suficiente, ya que había valores de n primos que no generaba con la expresión 2^n-1, un número primo.

Con esta base, supuso que con valores 2,3,5,7,13,19,31,67,127,257, grupo de primos no mayores de 257 que generarían un numero de Mersenne primo.

Para la generación de los números de Mersenne os dejo el siguiente código en Python

# scrip para calcular los n primeros numeros de mersenne

n_mersennne=int(input('Números de Mersenne a Calcular '))
for n in range(0, n_mersennne+1):
    mersenne = 2 ** n - 1
    print('El numero {0} de Mersenne es {1}'.format(n, mersenne)
)


# colocamos un input para que no se cierre la ventana del sistema operativo
print("pulsa intro para terminar")
tecla = input()# colocamos un input para que no se cierre la ventana del sistema operativo


En el script no de diferencian los que son primos de los que no lo son
 

Evidentemente a mayor n, mayor el número de cifras y mayor el tiempo para comprobar si el número es primo o no.

En 1876, Édouard Lucas (mencionado en el post anterior a este), ideó un método para verificar si un determinado número de Mersenne era o no primo, descubrió que Mersenne no había incluido los n  61,89,107 y además el número para n= 67, no era primo.

El método fue posteriormente perfeccionado por Lehmer hijo, el criterio es el siguiente:

Un número de Mersenne es primo si divide a otro número denominado número de Lucas-Lehmer, dichos números forman una sucesión de la forma Ln=(Ln-1)^2-2, para n mayores o iguales de 3.




 Para calcular los primeros números de Lucas-Lehmer os dejo otro programa en Python

# scrip para calcular los n primeros numeros de Lucas_Lehmer

lucas = 14 # primer número de Lucas-Lehmer
for n in range(3, 22):
    print("El numero  ", n, "de Lucas_Lehmer=", lucas)
    lucas = lucas ** 2 - 2

# colocamos un input para que no se cierre la ventana del sistema operativo
print("pulsa intro para terminar")
tecla = input()# colocamos un input para que no se cierre la ventana del sistema operativo
 

Importante no introducir n muy grandes, por lo del desbordamiento

 Nos queda pues comprobar por este método la primalidad de los números de Mersenne mediante el método, evidentemente mediante otro código:

# scrip para calcular los n primeros numeros de mersenne

lucas = 14
for n in range(3, 30):
    nmersenne = 2 ** n - 1
    if (lucas % nmersenne) == 0:
        print("El numero  2^", n, "-1=", nmersenne, " es Primo")
    lucas = lucas ** 2 - 2
 

como podeis comprobar se usa el método de la fuerta bruta, los n no son primos, si no una secuencia de los valores de n entre 3 y 29.

 






No hay comentarios:

Publicar un comentario