# Filename: public_html/files/FP28
# Compute operator L for FP28. Verify Riccati polynomial of transformed operator LL.
# Use Maple Release 5 (or higher).
#
# Mark van Hoeij, november 1998, MSRI Berkeley.
z:=RootOf( x^32+x^28-x^20-x^16-x^12+x^4+1 ); # zeta 120.
zz:=evalf(exp(2*Pi*I/120));
a:=matrix(4,4,[z^15,0,0,0, 0,z^15,0,0, 0,0,0,z^15, 0,0,z^15,0]);
b:=matrix(4,4,[z^30,0,0,0,
0,-1/3*z^30,2/3*z^30,2/3*z^30,
0,2/3*z^30,-1/3*z^30,2/3*z^30,
0,2/3*z^30,2/3*z^30,-1/3*z^30]);
c:=matrix(4,4,[-1/4*z^30, 1/2*z^28 - 1/2*z^20 -z^16 -1/2*z^12 - 1/2*z^8 +z^4 +3/4, 0,0,
1/2*z^28 - 1/2*z^20-z^16-1/2*z^12-1/2*z^8+z^4+3/4, 1/4*z^30 ,0,0,
0,0,0,z^30,
0,0,z^30,0]);
d:=linalg[diag](1,1,z^20-1,-z^20);
la:=proc(A)
[seq([seq(evala(Normal(A[i,j])),j=1..linalg[coldim](A))],i=1..linalg[rowdim](A))]
end:
groep:=proc(gens)
W:={};
do
W_old:=nops(W);
W:={seq(seq(la(linalg[multiply](i,j)),i=gens),j=W),op(W),op(map(la,gens))};
if nops(W)=W_old then break fi
od;
W
end:
# nops(groep({a,b,c})); # 48 elementen.
# nops(groep({a,b,c,d})); # 480 elementen.
# groep({a, evalm(b &* d)}); # 96 elementen.
# groep({evalm( a &* c), evalm(b &* d)}); # 96 elementen.
# nops( groep({a, evalm(b &* c &* d )}) );
# groep({a, evalm(b &* d &* c)}); # 480 elementen.
# nops( groep({a, evalm(b &* c &* d )}) ); # 480 elementen.
A:=evalm(a);
B:=map(evala, evalm(b &* c &* d ));
C:=map(evala, evalm( A^(-1) &* B^(-1)));
CA=evala(Factor(convert(linalg[charpoly]( A ,x),RootOf)));
CB=evala(Sqrfree(convert(linalg[charpoly]( B ,x),RootOf))); # -> determine exponents
CC=evala(Sqrfree(convert(linalg[charpoly]( C ,x),RootOf))); # from these charpoly's.
# This implements the formula for the multiplicity that Marius van der Put
# gave me.
multipliciteit:=proc(A,B)
global geconjugeerde,z,zz;
local cd,som,a,cp,n,x,i,k;
cd:=linalg[coldim](A);
som:=-cd;
for a in [A,B,map(evala,evalm( A^(-1) &* B^(-1)))] do
cp:=evala(Expand( convert(linalg[charpoly](a,x),RootOf) ));
n:=1;
while evala(Rem( (x^n-1)^cd , cp,x))<>0 do n:=n+1 od;
lprint(n);
som:=som+
add(i/n * 1/n * add(exp(2.0*Pi*I*(-i*k)/n)*
subs(`if`(geconjugeerde=true,{RootOf(_Z^2+1)=I},{I=-I,RootOf(_Z^2+1)=-I})
,subs(z=zz,linalg[trace](`if`(k=0,linalg[diag](1$cd),a^k))) ),k=0..n-1),i=0..n-1)
od;
evalf(som)
end:
# multipliciteit(A,B); # multiplicity = 3, so I can add 2 to the exponents.
# This is the generic diff eq with 3 regular singularities of order 4.
equa:=DF^4+(a1*x+a0)/x/(x-1)*DF^3+(b2*x^2+b1*x+b0)/x^2/(x-1)^2*DF^2
+(c3*x^3+c2*x^2+c1*x+c0)/x^3/(x-1)^3*DF
+(d4*x^4+d3*x^3+d2*x^2+d1*x+d0)/x^4/(x-1)^4;
with(DEtools);
_Envdiffopdomain:=[DF,x];
singularities:=[0,1,infty];
# Want the following exponents:
# e[p,i], p in singularities, i in {1,2,3,4}
fuchs_relation:=0; # -1 * sum of exponents e[p,i]
eqns:={};
for p in singularities do
indeq[p]:=subs(_Z=x,op(gen_exp(equa,T,x=subs(infty=infinity,p))[1][1]));
indeq[p]:=collect(indeq[p]/lcoeff(indeq[p],x),x,normal);
fuchs_relation:=normal(fuchs_relation + coeff(indeq[p],x,3));
eqns:=eqns union {coeffs(collect(mul(x-e[p,i],i=1..4)-indeq[p],x),x)}
od;
vars:=indets(equa) minus indets([_Envdiffopdomain,singularities]);
eqns:=map(numer@normal,subs(e[infty,1]=solve(
fuchs_relation+add(add(e[p,i],i=1..4),p=singularities)
,e[infty,1]),eqns));
sol:=readlib(`solve/linear`)(eqns,vars);
L:=collect(subs(sol,equa),DF,normal);
L:=
subs(e[0,1]=1/8-1,e[0,2]=1/8,e[0,3]=1/8+1 ,e[0,4]=5/8+1,
e[1,1]=1/10 , e[1,2]=3/10, e[1,3]=7/10,e[1,4]=9/10,
e[infty,1]=1/8, e[infty,2]=3/8,e[infty,3]=5/8,e[infty,4]=7/8,
L);
v:=seq(`if`(has(i,ln(T)),i,NULL),i=formal_sol(L,T,x=0,terms=3));
SS:={ seq(subs(T=1,coeff( convert(numer(v[1]),polynom),ln(T),i)),i=1..2),
seq(subs(T=1,coeff( convert(numer(v[2]),polynom),ln(T),i)),i=1..2)
};
S:={seq(`if`(degree(i,indets(S))=1,i,NULL),i=SS)};
S:=solve(S);
L:=collect(subs(S,L),DF,normal);
v:=seq(`if`(has(i,ln(T)),i,NULL),i=formal_sol(L,T,x=0,terms=3));
S:=SS union { subs(T=5,coeff( convert(numer(v[1]),polynom),ln(T))) };
S:=solve(S);
L:=collect(subs(S,L),DF,normal);
v:=seq(`if`(has(i,ln(T)),i,NULL),i=formal_sol(L,T,x=0,terms=3));
# OK, logs are gone.
LL:=symmetric_product(L,DF + (1/8)/x + (1/10)/(x-1) );
# should have invariant of degree 5, can determine that from A,B,C.
if false then # skip computation of semi-invariants of the group.
read Matrices; # load code for Sympower's and Hom's of representations.
N:=5; # search semi-invariant of L, corresponding to invariant of LL.
aa:=matrix(1,1,[ -z^15 ]); # search semi-invariant, if you make all
bb:=matrix(1,1,[ z^30 ]); # these matrices [1] then you're looking
cc:=matrix(1,1,[ z^30 ]); # for invariants, and you'll find a 5-dim
dd:=matrix(1,1,[ 1 ]); # space of invariants of degree 8, and
# nothing of lower degree.
aN:=map(evala,Sympower(a,N));
bN:=map(evala,Sympower(b,N));
cN:=map(evala,Sympower(c,N));
dN:=map(evala,Sympower(d,N));
S:=map(vect2matrix,linalg[nullspace](
linalg[blockmatrix](4,1,[ Hom(aa,aN), Hom(bb,bN) ,Hom(cc,cN), Hom(dd,dN) ])
),linalg[rowdim](aa),linalg[rowdim](aN) );
lprint(N,nops(S));
semi_invariants[N]:=map(op,map(columns2poly,S,4,N,X));
# For N=1..10 find only degree 8 invariants, 5 of them.
# Do they factor???
# 2 semi-invariants of degree 5. Take the one that has X[1] as factor.
# That should factor into linear factors.
fi;
# Here is LL again:
LL1:=
DF^4+1/10*(89*x-45)/x/(x-1)*DF^3+1/400*(7479*x^2-6895*x+600)/x^2/(x-1)^2*DF^2+
1/4000/x^2*(32781*x^2-40825*x+8300)/(x-1)^3*DF+1/20000*(3927*x-2725)/x^2/(x-1)
^3;
if normal(LL1-LL)<>0 then ERROR() fi;
# Now with the code of Jacques-Arthur and me I computed the following
# Riccati polynomial for LL (not for L, then you have to apply
# a substitution on P).
P:=
Z^5+(245366784*x^3+739444563*x^2+737492600*x-2787596875)/(-557519375+
184373150*x+246481521*x^2+122683392*x^3)/x*Z^4+2/5*(483065856*x^4+1875325881*x^
3+1373204105*x^2-16703581625*x+13937984375)/(-557519375+184373150*x+246481521*x
^2+122683392*x^3)/x^2/(x-1)*Z^3+2/25*(939294720*x^5+5380106667*x^4+5809988990*x
^3-91889491800*x^2+148598501250*x-69689921875)/(-557519375+184373150*x+
246481521*x^2+122683392*x^3)/x^3/(x-1)^2*Z^2+1/125*(1808142336*x^6+15408360513*
x^5+43238642915*x^4-522670373950*x^3+1182921498750*x^2-1068395471875*x+
348449609375)/(-557519375+184373150*x+246481521*x^2+122683392*x^3)/x^4/(x-1)^3*
Z+1/3125*(3451908096*x^7+41967774147*x^6+302211588068*x^5-3042266659625*x^4+
8490891950000*x^3-11023761109375*x^2+6968992187500*x-1742248046875)/(-557519375
+184373150*x+246481521*x^2+122683392*x^3)/x^5/(x-1)^4 ;
# Verifying:
#
# rightdivision(LL,DF-RootOf(P,Z)); # takes too long.
#
# A[0]:=u(x);
# for i from 1 to 4 do
# lprint(i);
# A[i]:=evala(subs(diff(u(x),x)=u(x)*RootOf(P,Z), diff(A[i-1],x) )); # takes too long.
# od;
# Faster verification:
N:=10; # check up to order 10.
with(algcurves);
p:=puiseux(numer(P),x=2,Z,N)[1];
Normalizer:=evala;
p:=series(p,x=2,N);
p:=series(exp(int(p,x)),x=2,N);
series( add( coeff(LL,DF,i)*diff(p,x$i),i=1..4)+ coeff(LL,DF,0)*p ,x=2,N);
evala(Expand( subs(x=x+2,convert(%,polynom)) ));
if % <> 0 then ERROR(NOT_OK) else lprint(OK) fi;
# We had LL = symmetric_product(L,DF + (1/8)/x + (1/10)/(x-1) );
# so the Riccati polynomial for L should be:
Q:=collect( subs(Z=Z - ((1/8)/x + (1/10)/(x-1)) ,P) ,X,factor);
# Verify that this is a Riccati polynomial for the operator L.
N:=10; # check up to order 10.
p:=puiseux(numer(Q),x=2,Z,N)[1];
Normalizer:=evala;
p:=series(p,x=2,N);
p:=series(exp(int(p,x)),x=2,N);
series( add( coeff(L,DF,i)*diff(p,x$i),i=1..4)+ coeff(L,DF,0)*p ,x=2,N);
evala(Expand( subs(x=x+2,convert(%,polynom)) ));
if % <> 0 then ERROR(NOT_OK) else lprint(OK) fi;
# Summary:
" The differential equation ", diffop2de(L,y(x)),"has Galois group FP28 and has",
exp(Int(RootOf(Q,Z),x)),"as a Liouvillian (in fact: algebraic) solution.";