Chapitre V
> restart;
Exercice V.3
>
L:=[]:
for i while nops(L)<100
do
if isprime(i) then L:=[op(L),i] fi:
od:
L;
> restart;
Exercice V.4
> a:=2;b:=3;
> garage:=a:a:=b:b:=garage:'a'=a;'b'=b;
> restart;
Exercice V.5
> plot(tan(x)-x,x=3*Pi/2-1..3*Pi/2-1/10);
> f:=x->tan(x)-x;
> a:=3*Pi/2-1;b:=3*Pi/2-1/10;
Le principe est le suivant : On sait que la racine est entre a et b. On regarde le signe de l'image du milieu de [a,b], ce qui permet de localiser la racine entre a et ce milieu ou b et ce milieu. On recommence alors en remplaçant a et b par les valeurs obtenues, jusqu'à obtenir un intervalle d'amplitude plus petite que l'erreur souhaitée.
>
while ((b-a)>10^(-5))
do
milieu:=(a+b)/2:
if is(f(a)*f(milieu)<0) # i.e. Si la racine est entre a et milieu
then b:=milieu:
else a:=milieu:
fi:
od:
['a','b']=[evalf(a,7),evalf(b,7)];
> restart;
Exercice V.6
>
n:=496:
somme:=0: # Variable affectée de la somme des diviseurs de n
for j from 1 to n-1
do
if irem(n,j)=0 then somme:=somme+j:
fi:
od:
if (somme=n)
then ""|| n || " est parfait";
else ""|| n || " n'est pas parfait";
fi;
> restart;
Exercice V.7
>
n:=1234567890;
for k from 1 while n<>1 # Petite prière pour que l'algorithme se
termine bien...
do
if irem(n,2)=0 then n:=n/2
else n:=3*n+1
fi;
od;
k-1;
> restart;
Exercice V.8
1. Il s'agit de deux suites adjacentes.
2.
> a:=1:b:=2:
On note u la variable affectée de u(k) au rang k, et
u' la variable affectée de u(k+1) au rang k.
De même, on note v et v'.
Ainsi, pour n=0, on a u=a v=b et u'=(u+v)/2 v'=2uv/(u+v)
Pour n=1; on a u=(le u' du rang précédent) v=(le v' du rang précédent) et
u'=(u+v)/2 v'=2uv/(u+v).
On itère ceci tous les indices de 0 à n.
> u:=a:v:=b: `u'`:=(u+v)/2: `v'`:=2*u*v/(u+v):# Initialisation
> n:=4;
>
for k from 1 to n
do
u:=`u'`;
v:=`v'`;
`u'`:=(u+v)/2;
`v'`:=2*u*v/(u+v);
od:
> u6=u;v6=v;
> u4=evalf(u,20);v4=evalf(v,20);
> u:=a:v:=b:`u'`:=(u+v)/2: `v'`:=2*u*v/(u+v):
>
while abs(v-u)>10^(-40)
do
u:=`u'`;
v:=`v'`;
`u'`:=(u+v)/2;
`v'`:=2*u*v/(u+v);
od:
> evalf(u,70);evalf(v,70);
>
> restart;
Exercice V.9
> sum(1/k,k=1..100);
> S:=0: for k to 100 do S:=S+1/k od: S;
> A:=5;
> for n while (sum(1/'k','k'=1..n)<A) do od; n; # Mauvaise méthode. À chaque étape, on recalcule toute la somme, alors qu'à chaque étape il suffit d'ajouter 1/k.
> S:=0: for n while S<A do S:=S+1/n od: n-1;
>
> A:=7;
>
for n while (sum(1/'k','k'=1..n)<A) do od; n;
# Mauvaise méthode. À chaque étape, on recalcule toute la somme, alors
qu'à chaque étape il suffit d'ajouter 1/k.
> S:=0: for n while S<A do S:=S+1/n od: n-1;
>
> restart;
Exercice V.10
1. Calcul de Sn pour de grandes valeurs de n :
> Sn:=sum(1/k!,k=0..n);
> subs(n=100,Sn);
> evalf(%);
On fait la conjecture que la limite cherchée est e
2. Calcul direct de l'erreur :
> n:=100;d:=floor(log10(n!));
> Digits:=d+6;
> A100:=evalf(exp(1)-sum(1/k!,k=0..100));
3. Calcul de l'erreur par une méthode itérative :
> s:=1: for k from 100 to 1 by -1 do s:=1+(1/k)*s od:
> evalf(exp(1)-s);
4. Comparaison des deux méthodes :
>
A1:=proc(n) local d,k;
d:=floor(log10(n!)); Digits:=d+6;
evalf(exp(1)-sum(1/k!,k=0..n));
end;
>
A2:=proc(n) local d,s,k;
d:=floor(log10(n!)); Digits:=d+6;
s:=1:
for k from n to 1 by -1 do s:=1+(1/k)*s od:
evalf(exp(1)-s);
end;
> A1(255);
> A2(255);
> time(A2(255));
> time(A1(255));
Pas le même temps de calcul.
>
>