Correction - Université Paris-Est Marne-la
Transcription
Correction - Université Paris-Est Marne-la
Université Paris xii – Val de Marne, ufr Sciences et Technologie, Module Libre Sciences l2/s3 Corrigé du TP1 2008–09 Mathématiques expérimentales 1. Exercice 1 La seule difficulté concerne l’énumération des facteurs premiers de n dont on ne connait pas le nombre, on ne peut donc pas introduire autant de variables que de facteurs premiers. Une solution possible est alors > restart: > with(numtheory): # package a charger pour pouvoir utiliser factorset > Euler:=proc(n) local m,i; m:=n; for i in factorset(n) do m:=m*(1-1/i); od; m; end; Ainsi, la variable “muette” i vaudra successivement tous les facteurs premiers de n. 2. Exercice 2 La seule difficulté concerne la construction du nuage de points (une liste de listes) à donner comme premier argument à la commande plot. Une solution possible est > plot([seq([n,Euler(n)],n=1..50)],style=point,symbol=POINT); > plot([seq([n,Euler(n)],n=1..2000)],style=point,symbol=POINT); 40 30 20 10 10 20 30 40 50 Le deuxième graphe met en évidence la tendance du nuage de points à se concentrer sur un certain nombre de droites. En particulier, la plus pentue, d’équation ϕ(n) = n − 1, correspond aux nombres premiers. 3. Exercice 3 Il y a deux difficultés (résolues dans l’écriture de la procédure pgcd) à comprendre. Tout d’abord, il n’est pas indispensable (mais possible si nécessaire) de retenir tous les restes rj (dont on ignore a priori le nombre), seuls le dernier (qui est nul) et l’avant dernier (le PGCD) comptent vraiment. Il suffit donc de retenir deux restes consécutifs dans les variables r0 et r1 en les remplaçant pas à pas. C’est ici que réside la deuxième difficulté, on voudrait que r1(nouveau) = reste de r0(ancien) divisé par r1(ancien) r0(nouveau) = r1(ancien), quel que soit l’ordre des affectations, c’est impossible à faire directement, d’où l’appel à la variable auxiliaire r qui permet de stocker l’ancienne valeur de r1, de calculer sa nouvelle valeur puis de réinjecter l’ancienne valeur dans r0. Ceci compris, la transformation de la procédure pour intégrer le calcul des u et des v de manière analogue aux r est assez directe : > pgcdBezout:=proc(a,b) local r0,r1,r,u0,u1,u,v0,v1,v,q; if a=0 then RETURN([b,0,1]) fi; r0:=a; r1:=b; u0:=1; u1:=0; v0:=0; v1:=1; while r1<>0 do r:=r1; q:=iquo(r0,r1); r1:=irem(r0,r1); r0:=r; u:=u1; v:=v1; u1:=u0-q*u1; v1:=v0-q*v1; u0:=u; v0:=v; od; [r0,u0,v0]; end; La dernière difficulté consistait dans l’emplacement du calcul du quotient q utilisé dans la formule des nouveaux u et v. Il doit apparaı̂tre avant que r0 et r1 aient changé, éventuellement on peut le placer après l’actualisation de r1 mais avant celle de r0 (sinon l’ancien r0 est perdu !) auquel cas il faut utiliser la variable r qui correspond bien à l’ancien r1. 4. Exercice 4 À partir de l’algorithme indiqué, on obtient facilement la procédure : > Brocot:=proc(m,n) local C,mg,md,ng,nd; C:=""; mg,md,ng,nd:=0,1,1,0; while m/n<>(mg+md)/(ng+nd) do if m/n<(mg+md)/(ng+nd) then md,nd:=mg+md,ng+nd; C:=cat(C,"G"); else mg,ng:=mg+md,ng+nd; C:=cat(C,"D"); fi; od; C,mg,md,ng,nd; end; Par exemple, l’invocation de Brocot(5,12); retourne "GGDDG",2,3,5,7 5 5 qui signifie que le dernier encadrement obtenu pour la fraction 12 est 25 < 12 < 37 et que le 5 chemin nécessaire pour atteindre 12 dans l’arbre de Stern-Brocot est GGDDG, en particulier on a 5 1 = . 12 2 + 2+1 1 1+1 De même, Brocot(12,5); retourne "DDGGD",7,5,3,2 en particulier on a 12 1 =2+ 1 . 5 2 + 1+1 5. Exercice 5 À la dernière étape de la construction, on a les trois fractions consécutives mg mg + md m md < < = ng ng + nd n nd donc les deux relations de Bezout pour (m, n) ng m − mg n = 1 = −nd m + md n obtenues à partir de mg , md , ng et nd . 6. Exercice 6 On cherche à résoudre 1999J + 365A = 903688 avec 1 6 J 6 365 et 0 6 A 6 1998. • On commence par raisonner modulo 365 i.e. à vouloir résoudre 1999J ≡ 903688 [365] > S:=903688 mod 365: • On détermine alors une relation de Bezout pour 1999 et 365 de la forme 1999U + 365V = 1 i.e. 1999U ≡ 1 [365] > U:=Brocot(1999,365)[4]: • On a alors J ≡ 1999U J ≡ 903688U [365] et 365A = 903688 − 1999J > J:=U*S mod 365; A:=(903688-1999*J)/365; Le résultat est donc J = 92 et A = 1972 autrement dit, la date de naissance recherchée est le 1er avril 1972 (tenir compte du fait que c’est une année bissextile). 7. Exercice 7 On va modifier la procédure Brocot précédente de façon à prendre en compte le fait que le développement peut être infini en limitant la longueur maximale du chemin produit (maxiter) et en utilisant une version décimale tronquée des nombres qu’on cherche à approcher (evalf) : > Brocotbis:=proc(x,maxiter) local C,i,mg,md,ng,nd; C:=""; mg,md,ng,nd:=0,1,1,0; for i from 1 to maxiter while x<>(mg+md)/(ng+nd) do if x<(mg+md)/(ng+nd) then md,nd:=mg+md,ng+nd; C:=cat(C,"G"); else mg,ng:=mg+md,ng+nd; C:=cat(C,"D"); fi; od; C; end; > Digits:=100: On a alors : • pour Brocotbis(evalf[100]((1+sqrt(5))/2),80); "DGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDGDG" • pour Brocotbis(evalf[100](sqrt(2)),80); "DGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGDDGGD" • pour Brocotbis(evalf[100](Pi),80); "DDDGGGGGGGDDDDDDDDDDDDDDDGDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" • pour Brocotbis(evalf[100](gamma),80); "GDGGDGGDGGGGDDDGGGGGGGGGGGGGDDDDDGDGGGGGGGGDGGDDDDGDGGGGGGGGGGGGGGGGGGGGGGGGGGGG" Les deux premiers nombres font apparaı̂tre une structure périodique (de période "DG" pour le premier et "DGGD" pour le second) liée au fait que ces deux nombres sont algébriques. Quant aux deux derniers, leur structure est beaucoup plus difficile à discerner et fait apparaı̂tre (de manière suprenante ? ! ?) de longues successions de la même lettre.