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;

[2, 3, 5, 7, 
11, 13, 17, 19, 23, 29, 31, 37, 41, 43...
[2, 3, 5, 7, 
11, 13, 17, 19, 23, 29, 31, 37, 41, 43...
[2, 3, 5, 7, 
11, 13, 17, 19, 23, 29, 31, 37, 41, 43...
[2, 3, 5, 7, 
11, 13, 17, 19, 23, 29, 31, 37, 41, 43...

> restart;

Exercice V.4

> a:=2;b:=3;

a := 2

b := 3

> garage:=a:a:=b:b:=garage:'a'=a;'b'=b;

a = 3

b = 2

> restart;

Exercice V.5

> plot(tan(x)-x,x=3*Pi/2-1..3*Pi/2-1/10);

> f:=x->tan(x)-x;

f := proc (x) 
options operator, arrow; tan(x)-x end...

> a:=3*Pi/2-1;b:=3*Pi/2-1/10;

a := 3/2*Pi-1

b := 
3/2*Pi-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)];

[a, b] = 
[4.493408, 4.493415]

> 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;

n := 
1234567890

351

> 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;

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;

u6 = 
665857/470832

v6 = 
941664/665857

> u4=evalf(u,20);v4=evalf(v,20);

u4 = 
1.4142135623746899106

v4 = 
1.4142135623715001870

> 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);

1.4142135623730950488016887242096980785696718753772...

1.4142135623730950488016887242096980785696718753766...

>

> restart;

Exercice V.9

> sum(1/k,k=1..100);

14466636279520351160221518043104131447711/278881500...

> S:=0: for k to 100 do S:=S+1/k od: S;

14466636279520351160221518043104131447711/278881500...

> A:=5;

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.

83

> S:=0: for n while S<A do S:=S+1/n od: n-1;

83

>

> A:=7;

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.

616

> S:=0: for n while S<A do S:=S+1/n od: n-1;

616

>

> restart;

Exercice V.10

1. Calcul de Sn pour de grandes valeurs de n :

> Sn:=sum(1/k!,k=0..n);

Sn := 
exp(1)-(exp(1)*GAMMA(2+n)-(n+1)*exp(1)*GAMMA(...

> subs(n=100,Sn);

exp(1)-1/942594775983835942085162312448293674956231...
exp(1)-1/942594775983835942085162312448293674956231...
exp(1)-1/942594775983835942085162312448293674956231...
exp(1)-1/942594775983835942085162312448293674956231...

> evalf(%);

2.718281828

On fait la conjecture que la limite cherchée est e

2. Calcul direct de l'erreur :

> n:=100;d:=floor(log10(n!));

n := 100

d := 157

> Digits:=d+6;

Digits := 163

> A100:=evalf(exp(1)-sum(1/k!,k=0..100));

A100 := 
.107e-159

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);

.107e-159

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;

A1 := proc 
(n) local d, k; d := floor(log10(n!)); D...

> 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;

A2 := proc (n) 
local d, s, k; d := floor(log10(n!))...
A2 := proc (n) 
local d, s, k; d := floor(log10(n!))...
A2 := proc 
(n) local d, s, k; d := floor(log10(n!))...
A2 := proc 
(n) local d, s, k; d := floor(log10(n!))...
A2 := proc (n) 
local d, s, k; d := floor(log10(n!))...
A2 := proc 
(n) local d, s, k; d := floor(log10(n!))...
A2 := proc 
(n) local d, s, k; d := floor(log10(n!))...
A2 := proc (n) 
local d, s, k; d := floor(log10(n!))...

> A1(255);

.117e-506

> A2(255);

.117e-506

> time(A2(255));

.100

> time(A1(255));

.983

Pas le même temps de calcul.

>

>