def g(x

publicité
PSI - Informatique - 2014-2015
1
DEVOIR LIBRE 1 Corrigé
Exercice 1
1. On définit la fonction g de la façon suivante :
def g(x):
if 0<=x and x<1:
return x
else:
return 1
Pour sa courbe représentative, on utilise la bibliothèque 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.0
1.5
1.0
0.5
0.00.0
0.5
1.0
1.5
2.0
2. On définit ensuite f de la façon suivante, on importe la bibliothèque math afin d’avoir la fonction
racine carrée :
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écurrence sur n ∈ N∗ le résultat 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 n ∈ N∗ tel que (Hn ) soit vraie. Montrons (Hn+1 ).
Soit x ∈ [0, 2n + 2[. Si x ∈ [0, 2n[, alors on conclut par hypothèse de récurrence.
Sinon, x ∈ [2n, 2n + 2[, donc frec(x) appelle frec(x − 2) : or x − 2 ∈ [0, 2n[, donc frec(x − 2)
√
termine et renvoie f (x − 2), alors frec(x) termine et renvoie le produit de x par la valeur
√
renvoyée par frec(x − 2), i.e. frec(x) termine et renvoie xf (x − 2), 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()
6
5
4
3
2
1
00
1
2
3
4
5
6
5. On parcourt les réels de 10−2 en 10−2 en partant de 0, pour trouver la première valeur α, à 10−2
près, telle que f (α) > 4. Comme on ne sait pas en combien d’étapes 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 à 10−2 près.
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 Li la liste L après le i-ème passage dans la boucle.
Comme il y a n − 1 passages de boucle, Ln−1 est la liste renvoyée par d(n). On montre l’invariant de
boucle suivant :
Li est la liste des diviseurs de n inférieurs ou égaux à i + 1.
Pour i = 0, L0 = [1] et on a bien 1 qui est l’unique diviseur de n inférieur ou égal à 1. Soit i ∈ [[ 0, n − 2
tel que Li soit la liste des diviseurs de n inférieurs ou égaux à i + 1. Lors du i + 1-ème passage dans
la boucle, d(n) teste si i + 2 le reste de la division euclidienne de n par 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 n inférieurs ou égaux à i + 2.
On a donc bien Ln−1 qui est la liste des diviseurs inférieurs ou égaux à n, comme tous les diviseurs
de n sont inférieurs ou égaux à n, d(n) renvoie bien la liste des diviseurs de n.
2. Il suffit d’enlever 1 et n à 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és des éléments de la liste donnée 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 à 1000 et de voir s’ils sont égaux à la valeur renvoyée 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és des nombres premiers.
5. Montrons que les nombres entiers naturels égaux à la somme des carrés de leurs diviseurs non
triviaux sont les carrés de nombres premiers.
Tout d’abord, si n = p2 , avec p premier, ses diviseurs sont 1, p et p2 , donc il possède un seul diviseur
non trivial : p et donc on a bien n qui est la somme des carrés de ses diviseurs non triviaux.
Réciproquement, soit n ∈ N∗ , égal à la somme des carrés de ses diviseurs non triviaux. Soit p un
diviseur premier de n. On a alors n = pq avec q ∈ N, q 6= 1, sinon, n est un nombre premier et la liste
de ses diviseurs non triviaux est vide. On a aussi q ≤ n − 1 car p ≥ 2. p et q font donc partie des
diviseurs non triviaux de n et donc, si p 6= q, p2 + q 2 ≤ n (il y a peut-être d’autre(s) diviseur(s) non
trivial (triviaux) de n). Or, 2pq ≤ p2 + q 2 , donc par transitivité, 2pq ≤ n, i.e. 2n ≤ n, ce qui n’est pas
possible car n ∈ N∗ , et donc p = q, i.e. n = p2 , n est le carré d’un nombre premier.
Exercice 3
1. On définit déjà la suite (un ) en fonction de c, par récursivité.
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érations on arrive à k et 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éliorer cette fonction, car on recalcule à chaque étape 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
12
10
8
6
4
2
02.0
1.5
1.0
0.5
0.0
0.5
1.0
1.5
2.0
3. Il s’agit de construire un tableau, on a donc besoin de la bibliothèque 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()
0
100
200
300
400
5000
100
200
300
400
500
On peut avoir une meilleure résolution en augmentant m, M ou le nombre de points dans le tableau.
Téléchargement