PSI - Informatique - 2014-2015 1
DEVOIR LIBRE 1 Corrig´e
Exercice 1
1. On d´efinit la fonction gde la fa¸con suivante :
def g(x):
if 0<=x and x<1:
return x
else:
return 1
Pour sa courbe repr´esentative, on utilise la biblioth`eque matplotlib.pyplot.
import matplotlib.pyplot as plt
def Grapheg():
x=[t*10**(-2) for t in range(200)]
y=[g(t) for t in x]
plt.axis([0,2,0,2])
plt.plot(x,y)
plt.show()
2. On d´efinit ensuite fde la fa¸con suivante, on importe la biblioth`eque math afin d’avoir la fonction
racine carr´ee :
from math import *
def frec(x):
if 0<= x and x<2:
return(g(x))
PSI - Informatique - 2014-2015 2
else:
return(sqrt(x)*frec(x-2))
3. On montre par r´ecurrence sur nNle r´esultat suivant :
(Hn) Pour tout x[0,2n[, frec(x) termine et renvoie f(x).
n= 1. Soit x[0,2[, frec(x) termine et renvoie g(x), i.e. f(x).
Soit nNtel que (Hn) soit vraie. Montrons (Hn+1).
Soit x[0,2n+ 2[. Si x[0,2n[, alors on conclut par hypoth`ese de r´ecurrence.
Sinon, x[2n, 2n+ 2[, donc frec(x) appelle frec(x2) : or x2[0,2n[, donc frec(x2)
termine et renvoie f(x2), alors frec(x) termine et renvoie le produit de xpar la valeur
renvoy´ee par frec(x2), i.e. frec(x) termine et renvoie xf(x2), ou encore f(x).
4.
def Graphef():
x=[t*10**(-2) for t in range(600)]
y=[f(t) for t in x]
plt.axis([0,6,0,6])
plt.plot(x,y)
plt.show()
5. On parcourt les r´eels de 102en 102en partant de 0, pour trouver la premi`ere valeur α, `a 102
pr`es, telle que f(α)>4. Comme on ne sait pas en combien d’´etapes on va le trouver, on fait une
boucle while.
def alpha():
a=0
p=10**(-2)
while f(a)<=4:
a=a+p
return(a)
PSI - Informatique - 2014-2015 3
On trouve alors 5.12 `a 102pr`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 nN. Pour i[[ 0, n 1]], on note Lila liste Lapr`es le i-`eme passage dans la boucle.
Comme il y a n1 passages de boucle, Ln1est 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 Ln1qui 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].
PSI - Informatique - 2014-2015 4
On reconnaˆıt les carr´es des nombres premiers.
5. Montrons que les nombres entiers naturels ´egaux `a la somme des carr´es de leurs diviseurs non
triviaux sont les carr´es de nombres premiers.
Tout d’abord, si n=p2, avec ppremier, ses diviseurs sont 1, pet p2, donc il poss`ede un seul diviseur
non trivial : pet donc on a bien nqui est la somme des carr´es de ses diviseurs non triviaux.
R´eciproquement, soit nN, ´egal `a la somme des carr´es de ses diviseurs non triviaux. Soit pun
diviseur premier de n. On a alors n=pq avec qN,q6= 1, sinon, nest un nombre premier et la liste
de ses diviseurs non triviaux est vide. On a aussi qn1 car p2. pet qfont donc partie des
diviseurs non triviaux de net donc, si p6=q,p2+q2n(il y a peut-ˆetre d’autre(s) diviseur(s) non
trivial (triviaux) de n). Or, 2pq p2+q2, donc par transitivit´e, 2pq n, i.e. 2nn, ce qui n’est pas
possible car nN, et donc p=q, i.e. n=p2,nest le carr´e d’un nombre premier.
Exercice 3
1. On d´efinit d´ej`a la suite (un) en fonction de c, par r´ecursivit´e.
def Suite(c,n):
if n==0:
return(0)
else:
return(Suite(c,n-1)**2+c)
Comme on ne sait pas en combien d’it´erations on arrive `a ket si on y arrive, on utilise donc une
boucle while.
def f(c):
k=0
while k<=10 and abs(Suite(c,k))<=20:
k=k+1
return(k)
On peut am´eliorer cette fonction, car on recalcule `a chaque ´etape les premiers termes de la suite, ce
qui est maladroit.
def f(c):
k=0
u=0
while k<=10 and abs(u)<=20:
k=k+1
u=u**2+c
return(k)
2.
def Alluref():
LX=[-2+i*10**(-2)for i in range(401)]
LY=[f(x) for x in LX]
plt.axis([-2,2,0,12])
plt.plot(LX,LY)
plt.show()
PSI - Informatique - 2014-2015 5
3. Il s’agit de construire un tableau, on a donc besoin de la biblioth`eque numpy.
import numpy as np
x=[-2+k*2.5/100 for k in range(101)]
y=[-1.1+k*2.2/100 for k in range(101)]
a=np.array([[f(x[k]+y[l]*1j) for l in range(101)] for k in range(101)])
4.
plt.imshow(a)
plt.show()
On peut avoir une meilleure r´esolution en augmentant m,Mou le nombre de points dans le tableau.
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !