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.