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.