
TP PYTHON - 02 - CORRECTION 4
def liste_parfaits(nmax):
for n in range(1, nmax + 1):
if parfait(n):
print(n)
>>> liste_parfaits(10**4)
6
28
496
8128
4. Nombres premiers,parfaits,amicaux
[Qu. 9] Crible d’Eratosthène, permière version :
def crible(n):
# On démarre avec la liste des entiers de 2 à n
primes_list = [k for k in range(2, n + 1)]
i=0
while i < len(primes_list) - 1:
# L est la liste des multiples stricts du primes_list[i]
L = [k for k in primes_list[i+1:] if k % primes_list[i] == 0]
# on supprime de primes_list[] chaque terme de L
for k in L:
primes_list.remove(k)
i += 1
return primes_list
[Qu. 10] Si n<P,il existe des entiers a,b>1 tels que n=ab.L’hypothèse a>√net b>√n
entraînerait ab >n,et c’est absurde. Donc l’un au moins des entiers aou best compris entre 2 et j√nk.
[Qu. 11] On voit par récurrence qu’à l’issue de chaque tour de boucle, les entiers cochés sont des
nombres premiers consécutifs. C’est le cas au début, puisque 2 est le plus petit nombre premier. Si
cette propriété est vraie à l’issue d’un certain tour de boucle, alors le plus petit entier non coché est
premier, sans quoi il serait multiple d’un nombre premier plus petit que lui et donc aurait été coché
auparavant. En cochant cet entier et en supprimant ses multiples stricts, on préserve donc la propriété
un cran plus loin.
Lorsque tous les nombres premiers inférieurs ou égaux à j√nkont été cochés , il devient inutile de
poursuivre car les entiers non cochés qui restent sont tous premiers (et donc la liste des nombres
premiers inférieurs ou égaux à nest établie). En effet, un entier qnon coché ne possède aucun diviseur
entre 2 et j√nket donc aucun diviseur entre 2 et j√qk: il est premier d’après le point précédent.
Deuxième version du crible d’Eratosthène :
def crible(n):
primes_list = [k for k in range(2, n + 1)]
i=0
while primes_list[i] ** 2 <= n:
L = [k for k in primes_list[i+1:] if k % primes_list[i] == 0]
for k in L:
primes_list.remove(k)
i += 1
return primes_list