Quelques pistes d’algorithmes possibles au lycée
Calcul d’aire
Calcul d’aire Le problème. Le problème est de déterminer l’aire « sous la courbe » représentative d’une fonction convenable. Par exemples, calculer une valeur approchée de l’aire de : {M(x,y), 0 y x² , 0 x 1} (seconde, première) {M(x,y), 0 y 1/x – E(1/x) , 0 < x 1} (Terminale)
Calcul d’aire Première méthode: une grille régulière. On fabrique une grille régulière qui quadrille le carré en n² points. On admet que aire du carré * nb de points en dessous / n² est une valeur approchée de l’aire sous la courbe.
Calcul d’aire Première méthode: une grille régulière. Algorithme de calcul: Début Variable: n,x,y,s lire n x=0; s=0 répéter tant que x 1 x=x+1/n; y=0 répéter tant que y 1 y=y+1/n si y x² Alors s=s+1 fin répéter fin répéter afficher s/n² Fin algorithme
Calcul d’aire Deuxième méthode: Monte-Carlo. On choisis au hasard n points de ]0;1[² . De la même façon, on a: aire du carré * nb de points en dessous / n est une valeur approchée de l’aire sous la courbe.
Calcul d’aire Deuxième méthode: Monte-Carlo. Algorithme de calcul: Début Variable: k,n,x,y,s lire n k=0; s=0 répéter tant que k < n x= nb aléatoire dans ]0;1[ y= nb aléatoire dans ]0;1[ k = k+1 si y < x² alors s=s+1 fin répéter afficher s/n Fin algorithme
Calcul d’aire Comparaison des 2 méthodes.
Calcul d’aire Monte-Carlo: ce qu’il y a en-dessous sur cet exemple... X est la variable aléatoire qui, à chaque point M(x,y) du carré ]0;1[ associe 1 si le point M est sous la courbe (y<x²) et 0 sinon. X suit une loi de Bernouilli avec p=aire sous la courbe = 1/3 Quand on réalise n expériences indépendantes (on choisit au hasard n points M), la variable aléatoire Yn = somme (Xi) suit une loi binômiale B(n,p) d’espérance np =n/3, variance npq. Quand n « devient grand », B(n,p) est « proche» de la loi normale d’espérance np et variance npq. Pour: n=10000 et p=1/3 et n=20 et p=1/3
Calcul d’aire Si Zn = Yn / n, Z suit une loi très proche de la loi normale d’espérance np/n = p et de variance npq/n² = pq/n, d’écart type s=(p(1-p))/(n). Or (p(1-p)) 0,5 quand p est dans [0;1], on a donc s 0,5/n . Pour une loi normale, 95% de l’effectif est entre E-2 s et E+2 s , Donc ici, on a environ 95% de l’effectif entre p - 1/n et p+1/n Si on réalise 2500 échantillons de taille n=10000, on trouve que 95% des échantillons ont une moyenne qui est une valeur approchée de l’aire p à 0,01 près. Il en résulte que la méthode de Monte-Carlo, pour un calcul d’aire, donne (pour un nombre de points de 10 000) une valeur approchée de l’aire à 0,01 près avec un risque d’erreur de 5%.
Calcul d’aire Deuxième exemple: une fonction pathologique... F(x) = 1/x-E(1/x) sur ]0;1] est discontinue, n’admet pas de primitive sur ]0;1] Cette fonction est particulièrement pathologique au voisinage de 0. La méthode Monte-Carlo est plus efficace que la méthode par la grille.
Calcul d’aire Deuxième exemple: une fonction pathologique... Le problème est de savoir ce domaine {M(x,y), 0<x 1, 0 y < f(x)} est mesurable. Sur chaque intervalle ]1/(k+1) ; 1/k] (k entier > 0), l’aire sous la courbe est : Donc l’aire sous la courbe sur l’intervalle ]1/(n+1) ; 1] est: Or la série (1+1/2+1/3+… 1/n –ln(n)) converge vers g (constante d’Euler). Donc la série de terme général Sk converge vers 1- g L’aire sous la courbe est donc 1- g 0,422 784 335 098 468. La méthode Monte-Carlo a donné (pour n=108): 0,422 759
Nombres premiers: test probabiliste
Test probabiliste de primalité Le problème: La cryptologie RSA nécessite de très grands nombres premiers (de l’ordre de 108). L’algorithme le plus simple pour savoir si un nombre est premier est: début lire n 2 i tant que i < racine(n)+1 si n mod i = 0 alors retourner faux i+1i fin tant que retourner vrai Fin Mais cet algorithme est très gourmand en division : de l’ordre de n. Aussi a-t-on cherché d’autres algorithmes pour savoir si un nombre est premier ou non. En particulier l’algorithme de Miller-Rabin qui utilise un calcul faisant intervenir l’aléatoire…
Test probabiliste de primalité L’algorithme de Miller-Rabin: L’algorithme repose sur 2 propriétés: Si n est premier impair alors: Pour tout entier a de [2;n], a n-1 = 1 [n] Dans Z/nZ, 1 n’a que deux racines carrées triviales 1 et n-1. Si on trouve un entier a qui ne vérifie pas l’une ou l’autre des propriétés, alors a est un témoin de la non primalité de n. L’idée est donc de chercher au hasard k témoins de non primalité. Si on n’en trouve pas, il y a de très fortes chances que n soit premier… Il se trouve que, si n est composé, environ 3/4 des nombres < n sont des témoins de non primalité. La probabilité que n soit composé et que k entiers au hasard soient des témoins de primalité est supérieure à 1- 1/4k. Pour k=7, la probabilité qu’un entier n ayant passé le test soit premier est 0,99994. Si on réitère le test, cette probabilité passe à 1 - 4.10-9 . Le coût de cet algorithme est de l’ordre de k.ln(n) au lieu de n pour l’algorithme classique. Pour un entier n de l’ordre de 108: 7ln(108) 129 108 = 10 000
Test probabiliste de primalité L’algorithme de Miller-Rabin: Fonction temoin(a,n) ‘renvoie 0 si a est un témoin de non primalité, 1 sinon n-1m; 1 y; a x ‘ initialisation du calcul de a m = an-1 Répéter tant que m>0 ‘ Calcul de a m - méthode des puissances successives Si m [2] = 1 alors ‘cas m impair x*y [n] y; m-1 m sinon ‘cas m pair x b; x²[n] x;m/2 m Si (x=1 et b1 et b n-1) Alors retourner 0 ‘ cas où 1 admet une racine carrée non triviale fin de si donc n est composé fin répéter Si y=1 Alors retourner 1 ‘ cas où an-1 = 1: n est probablement premier sinon retourner 0 ‘ cas où an-1 1: n est composé fin si Fin de fonction Fonction millerrabin(n,k) ’ renvoie 0 si n est composé, 1 si n est très probablement premier Répéter k fois entier aléatoire de [2;n-1] a Si temoin(a,n) = 0 alors retourner 0 ‘ a est un témoin de non primalité: n est composé fin de répéter retourner 1 ‘ on n’a pas trouvé de témoin de non primalité: n est très probablement premier Fin de fonction
Test probabiliste de primalité L’algorithme de Miller-Rabin sur Xcas: Le calcul de primalité de 1234567891 par Miller Rabin est instantané, par l’algorithme classique cela dure 225 secondes (presque 4 minutes)
Dichotomie
Dichotomie Le problème: Il s’agit de trouver un encadrement de longueur donné e de la solution de f(x)=0 sur [a;b] où f est strictement croissante et f(a)<0 et f(b)>0. Algorithme non récursif Algorithme récursif
Dessin en logo
Flocon de Koch Un algorithme récursif: Flocon de Koch sur Xcas en logo
Dessins aléatoires
Dessins aléatoires sur Xcas: profil montagne Algorithme : On part d’un triangle : (-4,0), (0,4),(4,0) On déplace aléatoirement les milieux des 2 côtés non horizontaux. Puis on itère la méthode …
Dessins aléatoires sur Xcas: profil montagne Les n sommets du polygone sont des complexes mis dans une matrice (1 ligne, n colonnes) Au départ la matrice est [-4,4i,4]. La fonction mont : x est la matrice des n sommets; mont(x) est la même matrice augmentée des n-1 milieux déplacés de manière aléatoire en longueur (0,5*rand(0,1) = nb aléatoire entre 0 et 0,5) et en direction ( eit avec t aléatoire autour de p/2). La fonction récursive montagne(x,k) itère k fois la fonction mont. Les fonctions tracemontagne et tracemontagneremplie tracent le polygone vide ou rempli en noir. Dessins aléatoires sur Xcas: profil montagne
Dessins aléatoires sur Xcas: arbres Sans aléa Avec aléa
Fractales
L’ensemble de Mandelbrot: Dans le plan complexe, on considère la suite (zn) définie par zn+1 = zn²+ c et z0 = 0. L’ensemble de Mandelbrot est l’ensemble des c pour lesquels la suite converge (en module). S’il existe n pour lequel ∣ zn ∣>2 alors la suite diverge. Il est nécessaire que ∣c∣< 2 pour que la suite converge. Algorithme: On cherche pour chaque point d’un maillage d’une partie du plan, l’entier n (<255) à partir duquel ∣ zn ∣>2. La couleur de ce point sera n. Ainsi un point blanc (n=255) sera un c pour lequel la suite semble converger et plus un point est foncé, plus la suite diverge vite… un point noir (n=1) est un point c où la suite diverge immédiatement. L’intérêt de l’ensemble de Mandelbrot est sa frontière. Fractales sur scilab
x[-0,25 ; 0,05] , y[0,6 ; 0,9] x[-2 ; 1] , y[-1,5 ; 1,5]
Les ensembles de Julia: Dans le plan complexe, on considère la suite (zn) définie par zn+1 = zn²+ c. Cette fois-ci, c est fixé (complexe situé à la frontière de l’ensemble de Mendelbrot: il y a autant d’ensemble de Julia que l’on veut) et c’est z0 qui varie. Un ensemble de Julia est l’ensemble des z0 pour lesquels la suite converge (en module). S’il existe n pour lequel ∣ zn ∣>2 alors la suite diverge. Même algorithme que précédemment: Fractales sur scilab c = -0,414 -0.612 i , x[-1,3 ; 1,3] , y[-1 ; 1]
Les ensembles de Julia: Fractales sur scilab c = -0,414 -0.612 i , x[-1,3 ; 1,3] , y[-1,3 ; 1,3] x[-0,15 ; -0,075] , y[-1 ; -0,925]