tpagm.mw

TP 8 : La moyenne arithmético-géométrique et les séries hypergéométriques 

I. La moyenne arithmético-géométrique 

Q1. Une équation fonctionnelle 

> a[0]:=1+x;b[0]:=1-x;a[1]:=(a[0]+b[0])/2;b[1]:=sqrt(a[0]*b[0]);
 

 

 

 

`+`(1, x)
`+`(1, `-`(x))
1
`*`(`^`(`*`(`+`(1, x), `*`(`+`(1, `-`(x)))), `/`(1, 2)))
 

> eq:=a[0]*M(1,b[0]/a[0])=M(a[1],b[1]);
 

`*`(`+`(1, x), `*`(M(1, `/`(`*`(`+`(1, `-`(x))), `*`(`+`(1, x)))))) = M(1, `*`(`^`(`*`(`+`(1, x), `*`(`+`(1, `-`(x)))), `/`(1, 2))))
 

Q2. Les premiers coefficients de A(x) 

> eval(eq,M=proc(toto,u) 1/A(1-u^2) end);
 

`/`(`*`(`+`(1, x)), `*`(A(`+`(1, `-`(`/`(`*`(`^`(`+`(1, `-`(x)), 2)), `*`(`^`(`+`(1, x), 2)))))))) = `/`(1, `*`(A(`+`(1, `-`(`*`(`+`(1, x), `*`(`+`(1, `-`(x)))))))))
 

> map(x->1/x,%);
 

`/`(`*`(A(`+`(1, `-`(`/`(`*`(`^`(`+`(1, `-`(x)), 2)), `*`(`^`(`+`(1, x), 2))))))), `*`(`+`(1, x))) = A(`+`(1, `-`(`*`(`+`(1, x), `*`(`+`(1, `-`(x)))))))
 

> eqA:=op(1,%)-op(2,%);
 

`+`(`/`(`*`(A(`+`(1, `-`(`/`(`*`(`^`(`+`(1, `-`(x)), 2)), `*`(`^`(`+`(1, x), 2))))))), `*`(`+`(1, x))), `-`(A(`+`(1, `-`(`*`(`+`(1, x), `*`(`+`(1, `-`(x)))))))))
 

> series(eval(eqA,A=proc(t) 1+add(u[i]*t^i,i=1..10) end),x,10);
 

series(`+`(`*`(`+`(`*`(4, `*`(u[1])), `-`(1)), `*`(x)), `*`(`+`(`-`(`*`(13, `*`(u[1]))), `*`(16, `*`(u[2])), 1), `*`(`^`(x, 2))), `*`(`+`(`*`(24, `*`(u[1])), `-`(`*`(80, `*`(u[2]))), `*`(64, `*`(u[3])...
series(`+`(`*`(`+`(`*`(4, `*`(u[1])), `-`(1)), `*`(x)), `*`(`+`(`-`(`*`(13, `*`(u[1]))), `*`(16, `*`(u[2])), 1), `*`(`^`(x, 2))), `*`(`+`(`*`(24, `*`(u[1])), `-`(`*`(80, `*`(u[2]))), `*`(64, `*`(u[3])...
series(`+`(`*`(`+`(`*`(4, `*`(u[1])), `-`(1)), `*`(x)), `*`(`+`(`-`(`*`(13, `*`(u[1]))), `*`(16, `*`(u[2])), 1), `*`(`^`(x, 2))), `*`(`+`(`*`(24, `*`(u[1])), `-`(`*`(80, `*`(u[2]))), `*`(64, `*`(u[3])...
 

> solve({seq(coeff(%,x,i),i=0..9)},{seq(u[i],i=1..10)});
 

{u[1] = `/`(1, 4), u[2] = `/`(9, 64), u[3] = `/`(25, 256), u[4] = `/`(1225, 16384), u[5] = `/`(3969, 65536), u[6] = `/`(53361, 1048576), u[7] = `/`(184041, 4194304), u[8] = `/`(41409225, 1073741824), ...
 

> sol:=subs(%,series(1+add(u[i]*x^i,i=1..9),x,10));
 

series(`+`(1, `*`(`/`(1, 4), `*`(x)), `*`(`/`(9, 64), `*`(`^`(x, 2))), `*`(`/`(25, 256), `*`(`^`(x, 3))), `*`(`/`(1225, 16384), `*`(`^`(x, 4))), `*`(`/`(3969, 65536), `*`(`^`(x, 5))), `*`(`/`(53361, 1...
 

Au passage, ce calcul montre que l'équation a au plus une solution formelle avec A(0)=1 car le système est triangulaire. Comme l'énoncé annonce que M est analytique, ce développement est celui de A. 

Q3. Une équation différentielle satisfaite par cette série tronquée 

> with(gfun):
 

> seriestodiffeq(series(sol,x,11),y(x));
 

[{`+`(`*`(`+`(`-`(`*`(4, `*`(x))), `*`(4, `*`(`^`(x, 2)))), `*`(diff(diff(y(x), x), x))), `*`(`+`(`-`(4), `*`(8, `*`(x))), `*`(diff(y(x), x))), y(x)), y(0) = 1, (D(y))(0) = `/`(1, 4)}, ogf]
 

> deq:=op(1,%):
 

> diffeqtorec(deq,y(x),u(n));
 

{`+`(`*`(`+`(1, `*`(4, `*`(n)), `*`(4, `*`(`^`(n, 2)))), `*`(u(n))), `*`(`+`(`-`(`*`(8, `*`(n))), `-`(4), `-`(`*`(4, `*`(`^`(n, 2))))), `*`(u(`+`(n, 1))))), u(0) = 1, u(1) = `/`(1, 4)}
 

Le terme de tête de la récurrence ne s'annule pas sur ℕ, l'équation différentielle admet donc une unique solution série avec ces conditions initiales. 

Q4. La preuve que A(x) (et pas seulement sa troncature) est solution de l'équation différentielle 

La preuve consiste à montrer que cette solution de l'équation différentielle vérifie aussi l'équation fonctionnelle.
Pour cela, on construit une équation différentielle satisfaite par
 

> F(x)=map(normal,subs(A=y,eqA));
 

F(x) = `+`(`/`(`*`(y(`+`(`/`(`*`(4, `*`(x)), `*`(`^`(`+`(1, x), 2)))))), `*`(`+`(1, x))), `-`(y(`*`(`^`(x, 2)))))
 

lorsque y est solution de l'équation différentielle. On peut commencer, en raisonnant juste sur les ordres, par constater que F satisfait une équation différentielle d'ordre au plus 4. Il serait alors tentant de conclure que la vérification des 4 premiers coefficients conclut la preuve, mais il faut d'abord s'assurer que le coefficient de tête de l'équation différentielle ne s'annule pas en 0. 

> deq1:=subs(y=y1,algebraicsubs(deq,y-x^2,y(x)));
 

{`+`(`*`(x, `*`(y1(x))), `*`(`+`(`-`(1), `*`(3, `*`(`^`(x, 2)))), `*`(diff(y1(x), x))), `*`(`+`(`-`(x), `*`(`^`(x, 3))), `*`(diff(diff(y1(x), x), x)))), y1(0) = 1}
 

> deq2:=subs(y=y2,algebraicsubs(deq,numer(y-(4*x/(1+x)^2)),y(x)));
 

{`+`(`*`(`+`(x, `-`(1)), `*`(y2(x))), `*`(`+`(`-`(`*`(`^`(x, 3))), `-`(`*`(3, `*`(`^`(x, 2)))), `-`(x), 1), `*`(diff(y2(x), x))), `*`(`+`(`*`(`^`(x, 2)), `-`(`*`(`^`(x, 3))), `-`(`*`(`^`(x, 4))), x), ...
 

> poltodiffeq(y2(x)/(1+x)-y1(x),[deq1,deq2],[y1(x),y2(x)],F(x));
 

F(x)
 

Cette équation différentielle n'a que 0 comme solution, ce qui est la preuve cherchée. 

Q5. Le lien avec la série hypergéométrique 

> diffeqtorec(deq,y(x),u(n));
 

{`+`(`*`(`+`(1, `*`(4, `*`(n)), `*`(4, `*`(`^`(n, 2)))), `*`(u(n))), `*`(`+`(`-`(`*`(8, `*`(n))), `-`(4), `-`(`*`(4, `*`(`^`(n, 2))))), `*`(u(`+`(n, 1))))), u(0) = 1, u(1) = `/`(1, 4)}
 

> collect(%,u,factor);
 

{`+`(`*`(`^`(`+`(`*`(2, `*`(n)), 1), 2), `*`(u(n))), `-`(`*`(4, `*`(`^`(`+`(n, 1), 2), `*`(u(`+`(n, 1))))))), u(0) = 1, u(1) = `/`(1, 4)}
 

Cette récurrence est exactement celle que satisfont les coefficients de la série , qui est donc égale à A(x). 

II. La relation de Legendre sur les intégrales elliptiques 

Q6. Une première récurrence 

On peut commencer par la deviner : 

> recd:=listtorec([seq(int(t^(2*n)/sqrt(1-t^2),t=0..1),n=0..10)],d(n))[1];
 

{`+`(`*`(`+`(`-`(`*`(2, `*`(n))), `-`(4)), `*`(d(`+`(n, 2)))), `*`(`+`(3, `*`(2, `*`(n))), `*`(d(`+`(n, 1))))), d(0) = `+`(`*`(`/`(1, 2), `*`(Pi))), d(1) = `+`(`*`(`/`(1, 4), `*`(Pi)))}
 

Ensuite, on la prouve par intégration par parties : 

> B:=Int(t^(2*n)/sqrt(1-t^2),t=0..1);
 

Int(`/`(`*`(`^`(t, `+`(`*`(2, `*`(n))))), `*`(`^`(`+`(1, `-`(`*`(`^`(t, 2)))), `/`(1, 2)))), t = 0 .. 1)
 

> student[intparts](B,t^(2*n-1)) assuming n>1;
 

`+`(`-`(Int(`/`(`*`(`^`(t, `+`(`*`(2, `*`(n)), `-`(1))), `*`(`+`(`*`(2, `*`(n)), `-`(1)), `*`(`+`(t, `-`(1)), `*`(`+`(t, 1))))), `*`(t, `*`(`^`(`+`(1, `-`(`*`(`^`(t, 2)))), `/`(1, 2))))), t = 0 .. 1))...
 

on lit ainsi d(n)=(2n-1)(d(n-1)-d(n)). 

Q7. Les représentations hypergéométriques des intégrales elliptiques complètes 

On peut faire d'une pierre deux coups en introduisant 

> ff:=(1-k^2)^alpha;
 

`^`(`+`(1, `-`(`*`(`^`(k, 2)))), alpha)
 

> deq:=diff(y(k),k)=normal(diff(ff,k)/ff)*y(k);
 

diff(y(k), k) = `+`(`/`(`*`(2, `*`(alpha, `*`(k, `*`(y(k))))), `*`(`+`(`-`(1), `*`(`^`(k, 2))))))
 

On développe ensuite en k et on intègre terme à terme. Les coefficients du développement sont donnés par 

> recbis:=diffeqtorec({deq,y(0)=1},y(k),d(n));
 

{`+`(`*`(`+`(`-`(`*`(2, `*`(alpha))), n), `*`(d(n))), `*`(`+`(`-`(n), `-`(2)), `*`(d(`+`(n, 2))))), d(0) = 1, d(1) = 0}
 

et ceux de l'intégrale par : 

> recKE:=`rec*rec`(recd,recbis,d(n));
 

{`+`(`*`(`+`(`*`(30, `*`(alpha)), `-`(`*`(31, `*`(n))), `-`(15), `*`(32, `*`(n, `*`(alpha))), `-`(`*`(20, `*`(`^`(n, 2)))), `*`(8, `*`(`^`(n, 2), `*`(alpha))), `-`(`*`(4, `*`(`^`(n, 3))))), `*`(d(`+`(...
 

> recKE:=collect(recKE,d,factor);
 

{`+`(`*`(`+`(`*`(2, `*`(alpha)), `-`(n), `-`(1)), `*`(`+`(3, `*`(2, `*`(n))), `*`(`+`(5, `*`(2, `*`(n))), `*`(d(`+`(n, 1)))))), `*`(4, `*`(`+`(n, 2), `*`(`^`(`+`(n, 3), 2), `*`(d(`+`(n, 3))))))), d(0)...
 

On récupère ainsi les deux récurrences cherchées : 

> recK:=subs(alpha=-1/2,recKE);recE:=subs(alpha=1/2,recKE);
 

 

{`+`(`*`(`+`(`-`(n), `-`(2)), `*`(`+`(3, `*`(2, `*`(n))), `*`(`+`(5, `*`(2, `*`(n))), `*`(d(`+`(n, 1)))))), `*`(4, `*`(`+`(n, 2), `*`(`^`(`+`(n, 3), 2), `*`(d(`+`(n, 3))))))), d(0) = `+`(`*`(`/`(1, 2)...
{`+`(`-`(`*`(n, `*`(`+`(3, `*`(2, `*`(n))), `*`(`+`(5, `*`(2, `*`(n))), `*`(d(`+`(n, 1))))))), `*`(4, `*`(`+`(n, 2), `*`(`^`(`+`(n, 3), 2), `*`(d(`+`(n, 3))))))), d(0) = `+`(`*`(`/`(1, 2), `*`(Pi))), ...
 

Q8. Une relation entre F(x) et G(x) 

F(x)est définie par une équation différentielle que nous avons déjà calculé : 

> deqF:=holexprtodiffeq(hypergeom([1/2,1/2],[1],x),y(x));
 

{`+`(`*`(`+`(`-`(`*`(4, `*`(x))), `*`(4, `*`(`^`(x, 2)))), `*`(diff(diff(y(x), x), x))), `*`(`+`(`-`(4), `*`(8, `*`(x))), `*`(diff(y(x), x))), y(x)), y(0) = 1}
 

> poltodiffeq((1-x)*(2*x*diff(y(x),x)+y(x)),[deqF],[y(x)],y(x));
 

{`+`(`-`(y(x)), `*`(`+`(`-`(4), `*`(4, `*`(x))), `*`(diff(y(x), x))), `*`(`+`(`-`(`*`(4, `*`(x))), `*`(4, `*`(`^`(x, 2)))), `*`(diff(diff(y(x), x), x)))), y(0) = 1}
 

> diffeqtorec(%,y(x),u(n));
 

{`+`(`*`(`+`(`-`(1), `*`(4, `*`(`^`(n, 2)))), `*`(u(n))), `*`(`+`(`-`(`*`(8, `*`(n))), `-`(4), `-`(`*`(4, `*`(`^`(n, 2))))), `*`(u(`+`(n, 1))))), u(0) = 1}
 

On retrouve bien l'équation satisfaite par les coefficients de la série G, avec la même condition initiale : 

> diffeqtorec(holexprtodiffeq(hypergeom([-1/2,1/2],[1],x),y(x)),y(x),u(n));
 

{`+`(`*`(`+`(`-`(1), `*`(4, `*`(`^`(n, 2)))), `*`(u(n))), `*`(`+`(`-`(`*`(8, `*`(n))), `-`(4), `-`(`*`(4, `*`(`^`(n, 2))))), `*`(u(`+`(n, 1))))), u(0) = 1}
 

Q9. Le membre gauche de la relation de Legendre 

> G:=x-> (1-x)*(2*x*D(F)(x)+F(x));
 

proc (x) options operator, arrow; `*`(`+`(1, `-`(x)), `*`(`+`(`*`(2, `*`(x, `*`((D(F))(x)))), F(x)))) end proc
 

> G(x)*F(1-x)+G(1-x)*F(x)-F(x)*(F(1-x));
 

`+`(`*`(`+`(1, `-`(x)), `*`(`+`(`*`(2, `*`(x, `*`((D(F))(x)))), F(x)), `*`(F(`+`(1, `-`(x)))))), `*`(x, `*`(`+`(`*`(2, `*`(`+`(1, `-`(x)), `*`((D(F))(`+`(1, `-`(x)))))), F(`+`(1, `-`(x)))), `*`(F(x)))...
 

> factor(%);
 

`+`(`-`(`*`(2, `*`(x, `*`(`+`(x, `-`(1)), `*`(`+`(`*`((D(F))(x), `*`(F(`+`(1, `-`(x))))), `*`(F(x), `*`((D(F))(`+`(1, `-`(x))))))))))))
 

> G:='G':
 

Q10. F(x)et F(`+`(1, `-`(x))) satisfont la même équation 

> algebraicsubs(deqF,y-(1-x),y(x));
 

`+`(`-`(y(x)), `*`(`+`(`-`(`*`(8, `*`(x))), 4), `*`(diff(y(x), x))), `*`(`+`(`-`(`*`(4, `*`(`^`(x, 2)))), `*`(4, `*`(x))), `*`(diff(diff(y(x), x), x))))
 

Il ne reste qu'à calculer ce Wronskien : 

> dsolve(diff(w(x),x)=-(-8*x+4)/(-4*x^2+4*x)*w(x),w(x));
 

w(x) = `/`(`*`(_C1), `*`(x, `*`(`+`(x, `-`(1)))))
 

Le reste du calcul se termine sans l'aide du calcul formel. 

III. L'algorithme de Brent-Salamin 

Q13. Les 60 premières décimales de π 

> Digits:=60:
 

> a[0]:=1;b[0]:=1/sqrt(2.);c[0]:=sqrt(a[0]^2-b[0]^2);
 

 

 

1
.707106781186547524400844362104849039284835937688474036588340
.707106781186547524400844362104849039284835937688474036588340
 

> for i to 7 do a[i]:=(a[i-1]+b[i-1])/2;b[i]:=sqrt(a[i-1]*b[i-1]); c[i]:=c[i-1]^2/4/a[i] od;
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.853553390593273762200422181052424519642417968844237018294170
.840896415253714543031125476233214895040034262356784510813226
.146446609406726237799577818947575480357582031155762981705830
.847224902923494152615773828642819707341226115600510764553698
.847201266746891460403631453693352397963981013612000500823296
0.632848766977960958464835240960481230119185324372625374047190e-2
.847213084835192806509702641168086052652603564606255632688497
.847213084752765366704298051779902070392110656059452583317776
0.118180883013461060711874747336546886225509942551318652011311e-4
.847213084793979086607000346473994061522357110332854108003136
.847213084793979086605997900490389211440534858586261300461414
0.412137199027022946940919911302464542734015246853603257102282e-10
.847213084793979086606499123482191636481445984459557704232275
.847213084793979086606499123482191636481445836194326665888883
0.501222991802425040911125873296403770861311699134099507100568e-21
.847213084793979086606499123482191636481445910326942185060580
.847213084793979086606499123482191636481445910326942185060579
0.741326155191716958690107993762920344837903551978875983573955e-43
.847213084793979086606499123482191636481445910326942185060580
.847213084793979086606499123482191636481445910326942185060580
0.162168313448845597369898232968832474513221598387323290957318e-86
 

> for j to 6 do j,2*a[j]^2/(1-add(2^k*c[k]^2,k=0..j-1)) od;
 

 

 

 

 

 

1, 2.91421356237309504880168872420969807856967187537694807317668
2, 3.14057925052216824831133126897582331177344023751294833564348
3, 3.14159264621354228214934443198269577431443722334560279455954
4, 3.14159265358979323827951277480186397438122550483544693578732
5, 3.14159265358979323846264338327950288419711467828364892155662
6, 3.14159265358979323846264338327950288419716939937510582097494
 

Q14. Le calcul en entiers 

> decPi:=proc(D) local a, b, c, i; a[0]:=10^D:b[0]:=isqrt(iquo(10^(2*D),2)):c[0]:=isqrt(a[0]^2-b[0]^2):for i while c[i-1]<>0 do a[i]:=iquo(a[i-1]+b[i-1],2);b[i]:=isqrt(a[i-1]*b[i-1]); c[i]:=iquo(c[i-1]^2,4*a[i]) od;iquo(2*a[i-1]^2*a[0],(a[0]^2-add(2^k*(a[k]^2-b[k]^2),k=0..i-2))) end;
 

proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
proc (D) local a, b, c, i; `assign`(a[0], `^`(10, D)); `assign`(b[0], isqrt(iquo(`^`(10, `+`(`*`(2, `*`(D)))), 2))); `assign`(c[0], isqrt(`+`(`*`(`^`(a[0], 2)), `-`(`*`(`^`(b[0], 2)))))); for i while ...
 

> decPi(10^4);
 

31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819...
 

> evalf(%-trunc(10^(10^4)*Pi),10^4);
 

-0.1103e5
 

> time(decPi(10^4)),time(decPi(2*10^4)),time(decPi(4*10^4));
 

0.37e-1, .123, .357
 

> time(decPi(8*10^4)),time(decPi(16*10^4));
 

1.081, 2.760
 

Le temps est multiplié par un peu plus que 2, mais moins que 3 à chaque étape, indiquant que la multiplication est effectuée par FFT, et que la complexité est bonne. On obtient ainsi un million de décimales en moins d'une minute : 

> time(decPi(10^6));
 

33.899