tpresultant.mw

TP10 : utilisation de résultants 

Manipulation de nombres algébriques 

Une identité 

En notant l'expression s'écrit 

> f:=sin(2*a)/sin(3*a)^2-sin(a)/sin(2*a)^2+sin(3*a)/sin(a)^2;
 

`+`(`/`(`*`(sin(`+`(`*`(2, `*`(a))))), `*`(`^`(sin(`+`(`*`(3, `*`(a)))), 2))), `-`(`/`(`*`(sin(a)), `*`(`^`(sin(`+`(`*`(2, `*`(a)))), 2)))), `/`(`*`(sin(`+`(`*`(3, `*`(a))))), `*`(`^`(sin(a), 2))))
 

Sa valeur numérique  

> evalf(eval(f,a=Pi/7),30);
 

5.29150262212918118100323150727
 

est facile à reconnaître : 

> identify(%);
 

`+`(`*`(2, `*`(`^`(7, `/`(1, 2)))))
 

Il n'y a plus qu'à prouver l'identité. Il est possible d'y parvenir en utilisant simplify comme une boite noire : 

> simplify(eval(f,a=Pi/7)^2);
 

28
 

Mais il est plus satisfaisant d'avoir une approche algorithmique maîtrisée de bout en bout. 

La première étape est de se ramener à un calcul sur des fractions rationnelles. La variable que nous allons utiliser est qui représentera `^`(e, `+`(`*`(`/`(1, 7), `*`(i, `*`(Pi))))) et sera donc annulé par le polynôme `+`(`*`(`^`(x, 7)), 1.) 

> convert(f,exp);
 

`+`(`/`(`*`(`*`(2, `*`(I)), `*`(`+`(exp(`*`(`*`(2, `*`(I)), `*`(a))), `-`(exp(`+`(`-`(`*`(`+`(`*`(2, `*`(I))), `*`(a))))))))), `*`(`^`(`+`(exp(`*`(`*`(3, `*`(I)), `*`(a))), `-`(exp(`+`(`-`(`*`(`+`(`*`...
 

> expand(%);
 

`+`(`/`(`*`(`*`(2, `*`(I)), `*`(`^`(exp(`*`(I, `*`(a))), 2))), `*`(`^`(`+`(`*`(`^`(exp(`*`(I, `*`(a))), 3)), `-`(`/`(1, `*`(`^`(exp(`*`(I, `*`(a))), 3))))), 2))), `-`(`/`(`*`(`+`(`*`(2, `*`(I)))), `*`...
 

> subs(exp(I*a)=x,%);
 

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

> F:=normal(%);
 

`/`(`*`(`*`(2, `*`(I)), `*`(`+`(`*`(`^`(x, 16)), `*`(5, `*`(`^`(x, 14))), `*`(12, `*`(`^`(x, 12))), `*`(`^`(x, 11)), `*`(20, `*`(`^`(x, 10))), `*`(3, `*`(`^`(x, 9))), `*`(23, `*`(`^`(x, 8))), `*`(3, `...
 

Cette fraction rationnelle en x annule le polynôme 

> resultant(numer(t-F),x^7+1,x);
 

`+`(`-`(`*`(`+`(`*`(1274, `*`(I))), `*`(`^`(t, 6)))), `*`(`*`(107016, `*`(I)), `*`(`^`(t, 4))), `-`(`*`(`+`(`*`(2996448, `*`(I))), `*`(`^`(t, 2)))), `*`(27966848, `*`(I)))
 

> factor(%);
 

`+`(`-`(`*`(`+`(`*`(1274, `*`(I))), `*`(`^`(`+`(`*`(`^`(t, 2)), `-`(28)), 3)))))
 

Il ne reste plus qu'à trouver le signe : 

> evalf(eval(f,a=Pi/7));
 

5.291502622
 

et nous avons prouvé 

> subs(a=Pi/7,f)=sqrt(28);
 

`+`(`/`(`*`(sin(`+`(`*`(`/`(2, 7), `*`(Pi))))), `*`(`^`(sin(`+`(`*`(`/`(3, 7), `*`(Pi)))), 2))), `-`(`/`(`*`(sin(`+`(`*`(`/`(1, 7), `*`(Pi))))), `*`(`^`(sin(`+`(`*`(`/`(2, 7), `*`(Pi)))), 2)))), `/`(`...
 

Une autre identité 

Le calcul peut s'effectuer en trois temps : d'abord on construit trois polynômes avec les racines cubiques de cos(a), cos(2a), cos(4a) comme racine sur une même extension algébrique, puis on en déduit un polynôme s'annulant sur les sommes deux à deux puis trois par trois par des calculs de résultants, ensuite il ne reste plus qu'à resortir de l'extension par élimination. 

D'abord les polynômes dont les cosinus sont les racines : 

> P:=map(expand,convert([seq(X^3-cos(m*a),m=[1,2,4])],exp));
 

[`+`(`*`(`^`(X, 3)), `-`(`*`(`/`(1, 2), `*`(exp(`*`(I, `*`(a)))))), `-`(`/`(`*`(`/`(1, 2)), `*`(exp(`*`(I, `*`(a))))))), `+`(`*`(`^`(X, 3)), `-`(`*`(`/`(1, 2), `*`(`^`(exp(`*`(I, `*`(a))), 2)))), `-`(...
 

> P:=subs(exp(I*a)=x,P);
 

[`+`(`*`(`^`(X, 3)), `-`(`*`(`/`(1, 2), `*`(x))), `-`(`/`(`*`(`/`(1, 2)), `*`(x)))), `+`(`*`(`^`(X, 3)), `-`(`*`(`/`(1, 2), `*`(`^`(x, 2)))), `-`(`/`(`*`(`/`(1, 2)), `*`(`^`(x, 2))))), `+`(`*`(`^`(X, ...
 

> resultant(subs(X=Y-X,P[1]),P[2],X);
 

`+`(`-`(`/`(`*`(`/`(1, 8), `*`(`+`(`-`(1), `-`(`*`(3, `*`(x))), `-`(`*`(4, `*`(`^`(x, 9)))), `-`(`*`(9, `*`(`^`(x, 5)))), `-`(`*`(4, `*`(`^`(x, 3)))), `-`(`*`(3, `*`(`^`(x, 2)))), `-`(`*`(6, `*`(`^`(x...
 

deuxième addition : 

> resultant(subs(Y=Y-X,numer(%)),P[3],X);
 

`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
`/`(`*`(`+`(`-`(1), `*`(297053, `*`(`^`(x, 27))), `*`(870, `*`(`^`(x, 9))), `-`(`*`(9, `*`(`^`(x, 3)))), `-`(`*`(9, `*`(`^`(x, 2)))), `-`(`*`(129, `*`(`^`(x, 6)))), `-`(`*`(36, `*`(`^`(x, 4)))), `-`(`...
 

Il ne reste plus qu'à éliminer x 

> res:=factor(resultant(numer(%),x^7-1,x));
 

`+`(`*`(32768, `*`(`^`(Y, 6), `*`(`+`(Y, `-`(3)), `*`(`+`(`*`(`^`(Y, 2)), `*`(3, `*`(Y)), 9), `*`(`^`(`+`(`*`(`^`(Y, 2)), 3), 3), `*`(`^`(`+`(3, `*`(3, `*`(Y)), `*`(`^`(Y, 2))), 3), `*`(`^`(`+`(3, `-`...
 

Ce polynôme a le membre gauche de l'identité comme racine. On vérifie tout d'abord que le membre droit en est également racine : 

> val:=-(-(5-3*7^(1/3))/2)^(1/3);
 

`+`(`-`(`*`(`^`(`+`(`-`(`/`(5, 2)), `*`(`/`(3, 2), `*`(`^`(7, `/`(1, 3))))), `/`(1, 3)))))
 

> expand(eval(res,Y=val));
 

0
 

La fin de la preuve consiste à montrer que c'est bien cette racine qui est égale à la valeur souhaitée, et une vérification numérique suffit. Les distances aux racines valent : 

> sort(map(abs,[seq(evalf(val)-sol,sol={fsolve(res,Y,complex)})]));
 

[0.1e-9, .1931876456, .1931876456, .4301039598, .4301039598, .7175150795, 1.049584927, 1.049584927, 1.158325009, 1.158325009, 1.167168647, 1.167168647, 1.242772573, 1.242772573, 1.318350700, 1.3183507...
[0.1e-9, .1931876456, .1931876456, .4301039598, .4301039598, .7175150795, 1.049584927, 1.049584927, 1.158325009, 1.158325009, 1.167168647, 1.167168647, 1.242772573, 1.242772573, 1.318350700, 1.3183507...
 

Donc une seule d'entre elles est susceptible d'être la bonne. 

> subs(a=2*Pi/7,[seq(cos(m*a),m=[1,2,4])]);
 

[cos(`+`(`*`(`/`(2, 7), `*`(Pi)))), cos(`+`(`*`(`/`(4, 7), `*`(Pi)))), cos(`+`(`*`(`/`(8, 7), `*`(Pi))))]
 

> evalf(%);
 

[.6234898018, -.2225209335, -.9009688678]
 

> %[1]^(1/3)-(-%[2])^(1/3)-(-%[3])^(1/3);
 

-.7175150793
 

> evalf(val);
 

-.7175150795
 

Finalement, la difficulté principale, c'est que Maple ne prend pas les racines cubiques comme Ramanujan ! 

Fonctions symétriques des racines 

> restart;
 

> F:=alpha^10/(1+alpha^2);
 

`/`(`*`(`^`(alpha, 10)), `*`(`+`(1, `*`(`^`(alpha, 2)))))
 

> P:=alpha^4+p*alpha+q;
 

`+`(`*`(`^`(alpha, 4)), `*`(p, `*`(alpha)), q)
 

Une première approche consiste à calculer un polynôme dont les racines sont exactement les valeurs de F en les racines de P, et d'en déduire leur somme : 

> resultant(P,denom(F)*t-numer(F),alpha);
 

`+`(`*`(2, `*`(q, `*`(`^`(t, 4)))), `-`(`*`(`^`(p, 2), `*`(`^`(q, 2), `*`(`^`(t, 3))))), `-`(`*`(4, `*`(`^`(q, 3), `*`(`^`(t, 3))))), `*`(3, `*`(`^`(p, 4), `*`(`^`(t, 3)))), `*`(15, `*`(`^`(p, 2), `*`...
 

> -coeff(%,t,degree(%,t)-1)/coeff(%,t,degree(%,t));
 

`+`(`-`(`/`(`*`(`+`(`-`(`*`(`^`(p, 2), `*`(`^`(q, 2)))), `-`(`*`(4, `*`(`^`(q, 3)))), `*`(3, `*`(`^`(p, 4))), `*`(10, `*`(`^`(p, 2), `*`(q))), `-`(`*`(4, `*`(`^`(q, 4)))))), `*`(`+`(`*`(2, `*`(q)), `*...
 

Une seconde approche repose sur les sommes de Newton. 

La première étape du calcul consiste à réduire F à un polynôme modulo Pour celà, on commence par inverser le dénominateur : 

> gcdex(denom(F),P,alpha,U);U;
 

 

1
`+`(`/`(`*`(p, `*`(`^`(alpha, 3))), `*`(`+`(`*`(2, `*`(q)), `*`(`^`(p, 2)), 1, `*`(`^`(q, 2))))), `-`(`/`(`*`(`+`(1, q), `*`(`^`(alpha, 2))), `*`(`+`(`*`(2, `*`(q)), `*`(`^`(p, 2)), 1, `*`(`^`(q, 2)))...
 

Le polynôme U(alpha) est égal à la fraction `/`(1, `*`(`+`(1, `*`(`^`(alpha, 2))))) lorsque P(alpha) = 0.  

> pol:=rem(U*numer(F),P,alpha);
 

`+`(`/`(`*`(p, `*`(`+`(`*`(2, `*`(q)), `*`(`^`(q, 2)), `*`(`^`(p, 2))), `*`(`^`(alpha, 3)))), `*`(`+`(`*`(2, `*`(q)), `*`(`^`(p, 2)), 1, `*`(`^`(q, 2))))), `/`(`*`(`+`(`*`(`^`(q, 2)), `*`(`^`(q, 3)), ...
 

Ce polynôme de degré 3 est donc égal à Fmodulo  

Il ne reste plus qu'à obtenir les sommes de Newton des racines sum(`^`(alpha, i), P(alpha) = 0) pour i = 0, 1, 2, 3.Ces sommes sont données par leur série génératrice 

> map(normal,series(subs(alpha=1/T,alpha*diff(P,alpha)/P),T,4));
 

series(`+`(4, `-`(`*`(`*`(3, `*`(p)), `*`(`^`(T, 3)))))+O(`^`(T, 4)),T,4)
 

Le résultat final est obtenu par combinaison linéaire : 

> add(coeff(pol,alpha,i)*coeff(%,T,i),i=0..3);
 

`+`(`/`(`*`(4, `*`(`+`(`*`(`^`(q, 2)), `*`(`^`(q, 3)), `*`(`^`(p, 2), `*`(q)), `-`(`*`(`^`(p, 2)))), `*`(q))), `*`(`+`(`*`(2, `*`(q)), `*`(`^`(p, 2)), 1, `*`(`^`(q, 2))))), `-`(`/`(`*`(3, `*`(`^`(p, 2...
 

> normal(%);
 

`+`(`-`(`/`(`*`(`+`(`-`(`*`(`^`(p, 2), `*`(`^`(q, 2)))), `-`(`*`(4, `*`(`^`(q, 3)))), `*`(3, `*`(`^`(p, 4))), `*`(10, `*`(`^`(p, 2), `*`(q))), `-`(`*`(4, `*`(`^`(q, 4)))))), `*`(`+`(`*`(2, `*`(q)), `*...
 

L'ensemble de ces opérations est implanté en Maple dans la fonction sum, qui permet de vérifier le résultat : 

> sum(F,alpha=RootOf(P,alpha));
 

`/`(`*`(`+`(`*`(4, `*`(`^`(q, 3))), `*`(4, `*`(`^`(q, 4))), `*`(`^`(p, 2), `*`(`^`(q, 2))), `-`(`*`(10, `*`(`^`(p, 2), `*`(q)))), `-`(`*`(3, `*`(`^`(p, 4)))))), `*`(`+`(`*`(2, `*`(q)), `*`(`^`(p, 2)),...
 

Polynômes de Tchebychev entiers 

> restart;
 

> deg:=34:
 

> deg2:=iquo(deg,2):
 

> bound:=.33*10^(-12);
 

0.3300000000e-12
 

Le facteur T 

Celui-ci ne demande aucun calcul : `and`(`<`(abs(Q(0)), bound), `<`(bound, 1)) et comme Qa des coefficients entiers Q(0) doit être entier. Il est donc nul. 

> fact:=T:
 

Les facteurs `+`(1, `-`(`*`(4, `*`(T)))), `+`(1, `-`(`*`(5, `*`(T)))) 

Comme Q a des coefficients entiers, `*`(`^`(4, deg(Q)), `*`(Q(`/`(1, 4)))) est un entier. Comme ci-dessus, si sa valeur absolue est inférieure à 1, il est nul. Idem pour  

> 4^deg2*bound;
 

0.5669356829e-2
 

> 5^deg2*bound;
 

.2517700195
 

Par contre, cette méthode ne donne pas de facteur `+`(1, `-`(`*`(6, `*`(T)))): 

> 6^deg2*bound;
 

5.585797615
 

> fact:=fact*(1-4*T)*(1-5*T):
 

Le facteur `+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1) 

> new:=29*T^2-11*T+1;
 

`+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1)
 

> solve(new,T);
 

`+`(`/`(11, 58), `*`(`/`(1, 58), `*`(`^`(5, `/`(1, 2))))), `+`(`/`(11, 58), `-`(`*`(`/`(1, 58), `*`(`^`(5, `/`(1, 2))))))
 

> evalf([%]);
 

[.2282080686, .1511022762]
 

Les deux racines sont dans l'intervalle [0,1/4]. Le résultant Res(Q, `+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1))est un entier. Il est nul si et seulement si `+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1)divise Par la formule de Poisson, il vaut alpha[1], alpha[2] sont les nombres ci-dessus. On obtient donc une borne sur le résultant par : 

> 29^deg2*bound^2;
 

.7903033886
 

qui permet de conclure. 

> fact:=fact*new;
 

`*`(T, `*`(`+`(1, `-`(`*`(4, `*`(T)))), `*`(`+`(1, `-`(`*`(5, `*`(T)))), `*`(`+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1)))))
 

L'inégalité de Markov et les multiplicités 

Il est possible d'utiliser simultanément l'inégalité de Markov et les facteurs déjà connus pour récupérer des facteurs multiples. 

> markov:=proc(pt,knownfact,bound)
local den, i, bb, new, degrest;
   den:=denom(pt);
   new:=1;
   degrest:=deg2-degree(knownfact,T);
   bb:=bound*den^degrest/abs(subs(T=pt,knownfact));
   for i from 0 to degrest-1 while bb<1 do
        new:=new*numer(pt-T);
        bb:=bb*8/den*(degrest^2-i^2)/(2*i+1)
   od;
   new
end;
 

proc (pt, knownfact, bound) local den, i, bb, new, degrest; `assign`(den, denom(pt)); `assign`(new, 1); `assign`(degrest, `+`(deg2, `-`(degree(knownfact, T)))); `assign`(bb, `/`(`*`(bound, `*`(`^`(den...
proc (pt, knownfact, bound) local den, i, bb, new, degrest; `assign`(den, denom(pt)); `assign`(new, 1); `assign`(degrest, `+`(deg2, `-`(degree(knownfact, T)))); `assign`(bb, `/`(`*`(bound, `*`(`^`(den...
proc (pt, knownfact, bound) local den, i, bb, new, degrest; `assign`(den, denom(pt)); `assign`(new, 1); `assign`(degrest, `+`(deg2, `-`(degree(knownfact, T)))); `assign`(bb, `/`(`*`(bound, `*`(`^`(den...
proc (pt, knownfact, bound) local den, i, bb, new, degrest; `assign`(den, denom(pt)); `assign`(new, 1); `assign`(degrest, `+`(deg2, `-`(degree(knownfact, T)))); `assign`(bb, `/`(`*`(bound, `*`(`^`(den...
 

> markov(0,1,bound);
 

`+`(`-`(`*`(`^`(T, 5))))
 

Dans ce cas, la connaissance de facteurs n'aide pas : 

> markov(0,fact/T,bound);
 

`+`(`-`(`*`(`^`(T, 5))))
 

> fact:=fact*T^4;
 

`*`(`^`(T, 5), `*`(`+`(1, `-`(`*`(4, `*`(T)))), `*`(`+`(1, `-`(`*`(5, `*`(T)))), `*`(`+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1)))))
 

Par contre, en ces facteurs aident à en trouver de nouveaux : 

> markov(1/4,1,bound);
 

`+`(1, `-`(`*`(4, `*`(T))))
 

> markov(1/4,fact/(1-4*T),bound);
 

`*`(`^`(`+`(1, `-`(`*`(4, `*`(T)))), 2))
 

> fact:=fact*(1-4*T);
 

`*`(`^`(T, 5), `*`(`^`(`+`(1, `-`(`*`(4, `*`(T)))), 2), `*`(`+`(1, `-`(`*`(5, `*`(T)))), `*`(`+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1)))))
 

Chaque fois qu'un nouveau facteur est trouvé, il faut s'en servir pour tenter d'améliorer les autres multiplicités : 

> markov(1/5,fact/(1-5*T),bound);
 

`+`(1, `-`(`*`(5, `*`(T))))
 

ça ne donne rien en 1/5, mais : 

> markov(0,fact/T^5,bound);
 

`*`(`^`(T, 6))
 

> fact:=fact*T;
 

`*`(`^`(T, 6), `*`(`^`(`+`(1, `-`(`*`(4, `*`(T)))), 2), `*`(`+`(1, `-`(`*`(5, `*`(T)))), `*`(`+`(`*`(29, `*`(`^`(T, 2))), `-`(`*`(11, `*`(T))), 1)))))
 

et on recommence la tournée pour s'assurer que plus rien ne peut être trouvé de cette façon : 

> markov(1/4,fact/(1-4*T)^2,bound);
 

`*`(`^`(`+`(1, `-`(`*`(4, `*`(T)))), 2))
 

> markov(1/5,fact/(1-5*T),bound);
 

`+`(1, `-`(`*`(5, `*`(T))))
 

Pour résumer, on a trouvé que le polynôme P[34]a pour facteur 

> factor(subs(T=X*(1-X),fact));
 

`*`(`^`(X, 6), `*`(`^`(`+`(`-`(1), X), 6), `*`(`^`(`+`(`*`(2, `*`(X)), `-`(1)), 4), `*`(`+`(1, `-`(`*`(5, `*`(X))), `*`(5, `*`(`^`(X, 2)))), `*`(`+`(`*`(40, `*`(`^`(X, 2))), `-`(`*`(58, `*`(`^`(X, 3))...
 

>
 

Les autres facteurs demandent un peu plus de travail. Le résultat final est 

`*`(`^`(X, 11), `*`(`^`(`+`(1, `-`(X)), 11), `*`(`^`(`+`(`*`(2, `*`(X)), `-`(1)), 4), `*`(`^`(`+`(1, `-`(`*`(5, `*`(X))), `*`(5, `*`(`^`(X, 2)))), 2), `*`(`+`(`*`(40, `*`(`^`(X, 2))), `-`(`*`(58, `*`(...