PSI - Informatique - 2014-2015 3
On trouve alors 5.12 `a 10−2pr`es.
Exercice 2
1. (a) d(4) = [1,2,4] et d(10)=[1,2,5,10].
(b) d(n) renvoie la liste des diviseurs de n.
(c) Soit n∈N∗. Pour i∈[[ 0, n −1]], on note Lila liste Lapr`es le i-`eme passage dans la boucle.
Comme il y a n−1 passages de boucle, Ln−1est la liste renvoy´ee par d(n). On montre l’invariant de
boucle suivant :
Liest la liste des diviseurs de ninf´erieurs ou ´egaux `a i+ 1.
Pour i= 0, L0= [1] et on a bien 1 qui est l’unique diviseur de ninf´erieur ou ´egal `a 1. Soit i∈[[ 0, n −2
tel que Lisoit la liste des diviseurs de ninf´erieurs ou ´egaux `a i+ 1. Lors du i+ 1-`eme passage dans
la boucle, d(n) teste si i+ 2 le reste de la division euclidienne de npar i+ 2 est nul, i.e. si i+ 2 est un
diviseur de n. Si oui, Li+1 =Li+ [i+ 2] et si non, Li+1 =Li.Li+1 est donc bien la liste des diviseurs
de ninf´erieurs ou ´egaux `a i+ 2.
On a donc bien Ln−1qui est la liste des diviseurs inf´erieurs ou ´egaux `a n, comme tous les diviseurs
de nsont inf´erieurs ou ´egaux `a n,d(n) renvoie bien la liste des diviseurs de n.
2. Il suffit d’enlever 1 et n`a la liste des diviseurs.
def DNT(n):
l=d(n)
l.remove(1)
l.remove(n)
return(l)
ou
def DNT(n):
l=[]
for nombre in range(2,n):
if n% nombre ==0:
l.append(nombre)
return(l)
3. On accumule, en partant de 0 les carr´es des ´el´ements de la liste donn´ee par DNT.
def SommeCarreDNT(n):
s=0
for p in DNT(n):
s=s+p**2
return(s)
4. Il suffit de tester tous les entiers de 1 `a 1000 et de voir s’ils sont ´egaux `a la valeur renvoy´ee par def
SommeCarreDNT.
def Test():
l=[]
for j in range(2,1001):
if SommeCarreDNT(j)==j:
l.append(j)
return(l)
On obtient alors la liste :
[4,9,25,49,121,169,289,361,529,841,961].