1 /* CALCUL DES RESOLVANTES PRODUITS DE 1 AU DEGRE DU POLYNOMES */
3 /* AVEC LES RESULTANTS */
4 resolvante_produit_res(p,x):=
5 block([n,rmax,puissances,elementaires,rh,k,rf],
7 rmax : binomial(n,quotient(n,2)),
8 rh: makelist(resultant(p,y-x^i,x),i,0,rmax),
9 puissances: makelist(maplist(lambda([pol],
10 (-1)^k*coeff(pol,y,n-k)),
13 elementaires :maplist(lambda([puissances] ,
14 pui2ele(first(puissances),puissances)),
17 maplist(lambda([elem],
23 (-1)^(i)*first(elem)*y^(deg-i)),
28 /* AVEC LES FONCTIONS SYMETRIQUES */
29 /* Les A[k] sont les fonctions puissances des racines de la re'solvante */
31 resolvante_produit_sym (p,x):=
32 block([n,rmax,krmax,a,aa,resol,pui_depart],
34 krmax : if oddp(n) then 1+quotient(n,2) else quotient(n,2),
35 a[0]:makelist(binomial(n,r),r,0,n),
36 a[1] :cons(n,makelist(coeff(p,x,n-i)*(-1)^i/coeff(p,x,n),i,1,n)),
37 pui_depart:ele2pui(binomial(n,krmax)*krmax,a[1]),
38 for i:1 thru quotient(n,2)
39 do for k:binomial(n,i-1)+1 thru binomial(n,i)
40 do a[k] : pui2ele(n-i,makelist(part(pui_depart,r*k+1),
42 makelist((bin : binomial(n,r),
43 aa : pui2ele(bin,makelist(part(a[k],r+1),k,0,bin)),
45 for j:bin-1 step -1 thru 0 do
47 resol : resol + (-1)^(bin-j)*first(aa)*y^j),
50 resolvante_unitaire(p,q,x):=
51 block([aa,ele,pp,ppui,n,m,alt,resol],
52 (p:expand(p),q:expand(q),
54 ele:cons(n,makelist(coeff(p,x,n-j)*(-1)^j/coeff(p,x,n),j,1,n)),
56 pp:ele2pui(n*m,ele), print(pp),
57 ppui : expand(makelist(q^j,j,1,n)), print(ppui),
58 ppui : makelist((aa:part(ppui,j),
59 aa:aa + (part(pp,1)-1)*coeff(aa,x,0),
60 for k:m*j step -1 thru 0 do
61 aa:ratsubst(part(pp,k+1),x^k,aa),aa),
63 pp:pui2ele(n,cons(n,ppui)),
65 for i:n-1 step -1 thru 0 do
68 resol:alt*first(pp)*y^i + resol),
71 /* Pour calculer prod_{1<= i<j<= 7} (x_i-x_j) */
73 resolvante_alternee1(f,x) :=
76 r:resultant(f,y-diff(f,x)^2,x),
78 r:expand(subst(y=1/z,r/y^8)),
79 delta: poly_discriminant(f,x),
80 r:expand(delta^8*subst(z=y/delta,r)/c),
84 /* Calcul de $x_1x_2+x_3$ */
87 resolvante_klein(polynome,x) :=
88 block([degre,p,pui,elem,e,n],
89 e:polynome2ele(polynome,x),
91 degre : 3*binomial(n,3),
92 p : rest(ele2pui(2*degre,e)),
95 cons((n-2)*e[3]+(n-2)*(n-1)/2*e[2],
96 makelist(monterme(p,r)
97 + (n-2)*(p[r]^2/2-p[2*r]/2)
99 +3*h(p,r), r,2,degre))),
101 elem : rest(pui2ele(degre,pui)),
103 x^degre + sum((-1)^i*elem[i]*x^(degre-i),i,1,degre))$
105 monterme(p,r) := block([somme],
107 for i:quotient(r,2)+1 thru r-1 do
109 binomial(r,i)*(p[r+i]-p[i]*p[r]-p[2*i]*p[r-i]/2+
110 p[i]^2*p[r-i]/2 + p[2*r-i]-p[r-i]*p[r]-
111 p[2*r-2*i]*p[i]/2+ p[r-i]^2*p[i]/2)),
114 h(p,r) := if oddp(r) then 0
115 else binomial(r,r/2)*(p[3*r/2]/3-p[r/2]*p[r]/2+p[r/2]^3/6)$
117 /* Calcul de $x_1x_2x_3+x_4$ */
119 resolvante_klein3(polynome,x) :=
120 block([degre,p,lim,e,n],
121 e:polynome2ele(polynome,x),
123 degre : 4*binomial(n,4),
124 p : rest(ele2pui(3*degre,e)), print(fait),
125 p: cons(degre,cons((n-3)*e[4]+(n-3)*(n-2)*(n-1)/3*e[2],
126 makelist(monterme3(p,r)+
127 + (n-3)*(p[3*r]/3-p[r]*p[2*r]/2 + p[r]^3/6) +
128 (n-3)*(n-2)*(n-1)/3*p[r]
129 +3*h3(p,r),r,2,degre))), print(fait),
130 p : rest(pui2ele(degre,p)), print(fait),
131 x^degre + sum((-1)^i*p[i]*x^(degre-i),i,1,degre))$
136 for i:quotient(r,2)+1 thru r-1 do
139 (-p[2*i+r]+p[i]*p[i+r] + p[2*i]*p[r]/2 - p[i]^2*p[r]
140 +p[3*i]*p[r-i]/3 -p[i]*p[2*i]*p[r-i]/2 + p[i]^3*p[r-i]/6
141 -p[3*r-2*i]+p[r-i]*p[2*r-i] + p[2*r-2*i]*p[r]/2 - p[r-i]^2*p[r]
142 +p[3*r-3*i]*p[i]/3 -p[r-i]*p[2*r-2*i]*p[i]/2 + p[r-i]^3*p[i]/6)),
146 h3(p,r) := if oddp(r) then 0
147 else binomial(r,r/2)*
148 (-p[2*r]/4+p[3*r/2]*p[r/2]/3+p[r]^2/8 +p[r]*p[r/2]^2/4+p[r/2]^4/24)$
150 /* CALCUL DE LA RESOLVANTE x1x2-x3x4 */
151 /* e EST LISTE DES FONCTIONS SYMETRIQUES ELEMENTAIRES [n,e1,...,en]
152 DU POLYNOME QUE L'ON TRANSFORME DEGRE 420 pour degre 8 */
155 resolvante_vierer (polynome,x) :=
156 block( [degre,p,e,n],
157 e:polynome2ele(polynome,x),
159 degre : 6*binomial(n,4),
160 p : rest(ele2pui(2*degre,e)),
162 makelist(if oddp(r) then 0
163 else 2*termevierer(p,r)
164 + (-1)^r*(n-3)*(n-2)*(p[r]^2-p[2*r])/2
165 + 6*(-1)^(r/2)*binomial(r,r/2)*
166 (-p[2*r]/4+p[3*r/2]*p[r/2]/3+p[r]^2/8 - p[r]*p[r/2]^2/4
167 +p[r/2]^4/24),r,1,degre)),
168 p:rest(pui2ele(degre,p)),
169 x^degre + sum((-1)^i*p[i]*x^(degre-i),i,1,degre))$
171 termevierer(p,r) := block([somme],
173 for i:r/2+1 thru r-1 do
175 (-1)^i*binomial(r,i)*(-3*p[2*r]/2+p[r-i]*p[r+i]
176 +p[2*i]*p[2*(r-i)]/4 -p[r-i]^2*p[2*i]/4
178 +p[i]*p[2*r-i]+p[r]^2/2
179 -p[i]*p[r-i]*p[r] +p[i]^2*p[r-i]^2/4),
182 /* CALCUL DE LA RESOLVANTE x1x2 + x3x4 de D_8 */
183 /* e EST LISTE DES FONCTIONS SYMETRIQUES ELEMENTAIRES [n,e1,...,en]
184 DU POLYNOME QUE L'ON TRANSFORME DEGRE 210 pour degre le degre 8 */
186 resolvante_diedrale (polynome,x) :=
187 block( [degre,p,e,n],
188 e:polynome2ele(polynome,x),
190 degre : 3*binomial(n,4),
191 p : rest(ele2pui(2*degre,e)),
193 makelist(termediedral(p,r)
194 + (n-3)*(n-2)*(p[r]^2-p[2*r])/4
196 else 3*binomial(r,r/2)*
197 (-p[2*r]/4+p[3*r/2]*p[r/2]/3+p[r]^2/8 - p[r]*p[r/2]^2/4
198 +p[r/2]^4/24),r,1,degre)),
199 p:rest(pui2ele(degre,p)),
200 x^degre + sum((-1)^i*p[i]*x^(degre-i),i,1,degre))$
202 termediedral(p,r) := block([somme],
204 for i:quotient(r,2)+1 thru r-1 do
206 binomial(r,i)*(-3*p[2*r]/2+p[r-i]*p[r+i]
207 +p[2*i]*p[2*(r-i)]/4 -p[r-i]^2*p[2*i]/4
209 +p[i]*p[2*r-i]+p[r]^2/2
210 -p[i]*p[r-i]*p[r] +p[i]^2*p[r-i]^2/4),
214 /* RESOLVANTE BIPARTITE : x1x2x3..x(n/2) + x(n/2+1)....xn
215 NE FONCTIONNE QUE SI n EST PAIR
216 SE CALCULE EN 3 OU 5 SECONDES POUR LE DEGRE 6
217 SE CALCULE EN 4 mn POUR LE DEGRE 8 */
219 resolvante_bipartite(polynome,x) :=
220 block( [degre,pui_pol,elem_pol,n,pui_resol,elem_resol],
221 elem_pol:polynome2ele(polynome,x),
223 degre : binomial(n-1,n/2-1),
224 pui_pol : ele2pui(4*degre,elem_pol),
226 for r:degre step -1 thru 1 do
228 pui_resol : cons(pui(pui_pol,
229 polynome_bipartite(r),
230 makelist(concat(a,j),j,1,n)),
232 elem_resol : pui2ele(degre,cons(degre,pui_resol)),
233 ele2polynome(elem_resol,y))$
235 polynome_bipartite(r) :=
238 borne:quotient(r,2)+remainder(r,2),
239 for i:borne thru r do
241 binomial(r,i)*prod(concat(a,j)^i,j,1,n/2)
242 *prod(concat(a,j)^(r-i),j,n/2+1,n),
244 else s +(degre-1)*binomial(r,r/2)*prod(concat(a,j)^(r/2),j,1,n))$
246 /* resolvante_bipartite(x^6+2*x^2+2,x);
248 resolvante_bipartite(x^6+2*x^3-2,x); */