Si on importe isprime() de sympy il est inutile de programmer soi-même une fonction estPremier qui sera forcément moins performante, et de beaucoup.
on n'a pas parlé de la question "quelle est la durée de ce programme" parce que jusqu'à M31 = 2 milliards et quelque, ça s'exécute en une fraction ,de seconde, même avec ce estPremier() très naïf là (tester tous les entiers jusqu'à racine de M...
)
pour mesurer le temps de calcul on peut le faire avec la fonction
perf_counter() du module time :
from time import perf_counter # pour mesurer le temps d'exécution
# pour utilisation d'un test de primarité perso (et naif)
def premier(a):
if a < 2: # ni 0 ni 1 ne sont premiers
return False
d = 2
while d*d <= a:
if a%d == 0:
return False # divisible par d
d = d+1
return True # aucun diviseur
# nombres de Mersenne premiers < 2**65-1 = 36893488147419103231
# range(1,30) 2**30 - 1 est le plus petit nombre de Mersenne > 1 milliard
t0 = perf_counter()
for n in range(1,65): # range(1,30) pour l'exo
m = 2**n-1 # valeur pour ce n là
if premier(m):
print("au rang",n,": M =",m)
t1=perf_counter()
print("durée = ",t1-t0,"secondes")
résultat :
*** Console de processus distant Réinitialisée ***
au rang 2 : M = 3
au rang 3 : M = 7
au rang 5 : M = 31
au rang 7 : M = 127
au rang 13 : M = 8191
au rang 17 : M = 131071
au rang 19 : M = 524287
au rang 31 : M = 2147483647
au rang 61 : M = 2305843009213693951
durée = 784.3321676989999 secondes
c'est à dire environ un quart d'heure à tourner avant de terminer. !
et il est totalement impossible avec une telle durée d'exécution exponentiellement croissante d'aller au dela . (jusqu'au suivant M89)
si j'utilise un test de primarité efficace (à savoir la fonction isprime() de sympy à la place de premier(m) écrit soi même,
la durée d'exécution à la même taille devient en millièmes de seconde !!
durée = 0.0015395549999999147
et on peut aller plus loin en un temps raisonnable :
avec range(1, 100) pour aller jsuqu'à 2
99 - 1
au rang 2 : M = 3
au rang 3 : M = 7
...
au rang 19 : M = 524287
au rang 31 : M = 2147483647
au rang 61 : M = 2305843009213693951
au rang 89 : M = 618970019642690137449562111
durée = 0.005143326000000226 secondes
(4 millisecondes de calcul)
voire range(1,1000) permettant d'aller jusqu'à M607, un nombre de 183 chiffres, en moins d'une seconde de calcul !
...
au rang 607 : M = 531137992816767098689588206552468627329593117727031923199444138200
4035598608522427391625022652292856688893294862465010153465793376527072394095199
78766587351943831270835393219031728127
durée = 0.6881727639999997 secondes
pour aller encore plus loin , il faut utiliser un test de primarité spécialement conçu pour les nombres de Mersenne : le test de Lucas-Lehmer
(durée simplement proportionnelle au nombre de chiffres !)
tout ceci
y compris l'utilisation de listes et de mettre le programme principal lui-même dans une fonction retournant une liste, et de définir des fonction d'aide (disant ce que fait chaque fonction)
est totalement en dehors de ce qui est demandé (attendu) dans l'exo. !
c'est juste se faire plaisir en exhibant ce qu'on sait faire
edit : découpe en tranche ici de M607 pour éviter que ça dépasse de l'écran