Creo que no me explique bien, mi código funciona e imprime la lista de números menores que el limit que tu introduces. El problema es que al probar la función en el terminal si le metes un limit muy alto tarda mucho en sacarte la lista y tengo que conseguir que no tarde tanto.
No puedo utilizar módulos es todo a base de funciones. Por ello me he creado una función donde te dice si un número es primo o no.
Ah, bien. No obstante, tienes que tener en cuenta eso que te decía geómetracat, no todos los \( 2**p-1 \) con p primo son primos, por tanto, no todos los \( 2**p-1 \) son primos de Mersenne.
La función que has hecho es ineficiente, es verdad.
Una de las cosas más básicas para comprobar la primalidad de un número es fijarse en esto; te lo explico con un ejemplo para que veas el funcionamiento:
1,2,3,4,5,6,7,8,9,10,12,13,14,15, 16, 17
Los no primos que hay hasta 17 (por tomar un número cualquiera) no pueden ser mayores que \( 4*4 \), por tanto, todos los compuestos serán múltiplos de algún primo menor que 4 (5*5, por ejemplo, es un compuesto que no cabe ahí, es mayor). Es decir, 3*5 ó 2*7... sí tiene un primo mayor que 4, pero la cuestión es que no dejan de tener como factor un primo más pequeño, el 3; todo los compuestos tiene alguno de estos factores 2 ó 3 con toda seguridad.
Así pues, si tú vas a comprobar si un “n” es primo, basta que tomes los números desde la parte entera de la raíz cuadrada de “n” hacia abajo, hacia 1, y dividas a “n” por éstos y compruebes el resto con la función %. Así ahorrarás bastante.
No obstante, el Python tiene funciones estándar (sin usar módulo) muy útiles que pueden agilizar esto, como la función set que te decía; pero tampoco sé si te permiten usar cualquier función aunque sea estándar. Si puedes usar cualquiera, me lo dices e intento hacer un programa; a ver si no tarda mucho.
Saludos.