Tools for the proofs of results in Hoeij & Weil, Issac'05restart:
with(DEtools):
_Envdiffopdomain:=[Dx,x]:
with(diffalg):Ancillary procedures## Change of variable in a differential operator.
## May also use the function Dchangevar
pullback := proc(L, a)
local i, f;
global x, Dx;
f := add(
mult(subs(x = a, coeff(L, Dx, i)), Dx/diff(a, x) $ i)
, i = 0 .. degree(L, Dx));
sort(collect(f/lcoeff(f, Dx), Dx, X->factor(simplify(X,symbolic))), Dx)
end:## singularities of a differential operator
singularites:=proc(L)
local co, liste;
co := lcoeff(collect(numer(normal(L)), Dx), Dx);
liste := select(X -> has(X, x), factors(co)[2]);
[seq(RootOf(i[1], x), i = liste), infinity]
end proc:## local (generalized) exponents
localex:=proc(L) seq(gen_exp(L,_t,x=p),p=singularites(L)) end proc:Standard operators and their solutionsImprimitive groupsDn:=Dx^2+x*Dx/((x-1)*(x+1))-1/4/((x-1)*n^2*(x+1));## special case for quaternion group D2
Q:=eval(Dn,n=2);
SQ:= symmetric_product(Q,Dx-coeff(Q,Dx,1)/2);
r1:=4*x/(x-1)/(x+1); ## logarithmic derivative of the invariant of degree 6
D2I:=symmetric_product(SQ,Dx+r1/6);coeff(symmetric_power(D2I,6),Dx,0);symmetric_product(SQ,Dx+r1/8);Primitive groupss:=(6*lambda-1)*(6*lambda+1)/144;
St:=pullback( Dx^2+(7*x-4)/6/x/(x-1)*Dx-s/x/(x-1), 1/(x+1) );
St_A4:=subs(lambda=1/3,St);
St_S4:=subs(lambda=1/4,St);
St_A5:=subs(lambda=1/5,St);
##### former standard equations:
A4S:=St_A4:
S4S:=St_S4:
A5S:=St_A5:
A5I:=A5S:b6:=1/2/((x+1)*x):
L:=symmetric_product(St_A4,Dx+b6/6);
## better choice 1 (gives nicer formula).
A4I:=pullback(L,-2*x/(x+1));
verif:=coeff(symmetric_power(A4I,6),Dx,0);## other choice 2: normalise the invariant of degree 8 to 1 so that
## the standard equation is a simple pullback of S4I. Gives nicer formula
b8:=-1/3/(x+1);
L:=symmetric_product(St_A4,Dx+b8/8);
## better choice (makes it a pullback of S4I)
A4I8:=pullback(L,-2/(x+1));
verif:=coeff(symmetric_power(A4I8,8),Dx,0);b8:=-1/24/(x+1);
L:=symmetric_product(St_S4,Dx+b8);
## better choice
S4I:=pullback(L,x/(-x+1));Solutions of Imprimitive standard operatorssol_DnI:=hypergeomsols(diffop2de(Dn,y(x)),y(x)); RiemannPsols(diffop2de(Dn,y(x)),y(x));sol_D2S:=hypergeomsols(diffop2de(Q,y(x)),y(x)); RiemannPsols(diffop2de(Q,y(x)),y(x));hypergeomsols(diffop2de(D2I,y(x)),y(x)); sol_D2I:=RiemannPsols(diffop2de(D2I,y(x)),y(x)) ;lprint(sol_S4I);Solutions of Primitive standard operatorseq:=diffop2de(A4I,y(x)):
hypergeomsols(eq,y(x));
sol_A4I:=RiemannPsols(eq,y(x));
dsolve(eq,[hyper3]);latex(sol_A4I);sol_S4I:=hypergeomsols(diffop2de(S4I,y(x)),y(x)); sol_S4I:=RiemannPsols(diffop2de(S4I,y(x)),y(x));hypergeomsols(diffop2de(A5I,y(x)),y(x)); sol_A5I:=RiemannPsols(diffop2de(A5I,y(x)),y(x));sol_A4S:=hypergeomsols(diffop2de(A4S,y(x)),y(x)); RiemannPsols(diffop2de(A4S,y(x)),y(x));sol_S4S:=hypergeomsols(diffop2de(S4S,y(x)),y(x)); RiemannPsols(diffop2de(S4S,y(x)),y(x));S4: section 5.2.2L:=S4I;
PL:=pullback(L,F(x)):
A0,A1:=coeff(PL,Dx,0),coeff(PL,Dx,1);
sys:=map(numer,{A1-a1(x),A0-a0(x)}):
R := differential_ring(ranking=[F,a1,a0], derivations=[x], notation=diff):
GE:= Rosenfeld_Groebner(sys, R);
EQ:=rewrite_rules(GE[1]);
## simplification: may set G=2a1+diff(a0)/a0 to simplify the formulas.
the_f:=normal(subs(diff(a0(x),x)=G(x)*a0(x)-2*a1(x)*a0(x) , rhs(rewrite_rules(GE[1])[1]) )):
pullback_S4I:=collect(the_f,G(x));A4: section 5.2.3L:=A4I;
PL:=pullback(L,F(x)):
A0,A1:=coeff(PL,Dx,0),coeff(PL,Dx,1);
sys:=map(numer,{A1-a1(x),A0-a0(x)}):
R := differential_ring(ranking=[F,a1,a0], derivations=[x], notation=diff):
GE:= Rosenfeld_Groebner(sys, R);
rewrite_rules(GE[1]);
## simplification: may set G=2a1+diff(a0)/a0 to simplify the formulas.
the_pol:=collect(normal(subs(diff(a0(x),x)=G(x)*a0(x)-2*a1(x)*a0(x) ,
rhs(rewrite_rules(GE[1])[1]) )),F(x),X->collect(X,G(x)) );
PF:=F(x)^2-the_pol;
pullback_A4I:=sqrt(the_pol);Primitive formula: section 4.3#St:=Dx^2+1/6*(8*x+3)/(x+1)/x*Dx+_s/(x+1)^2/x ;
L:=pullback(Dx^2+(7*x-4)/6/x/(x-1)*Dx-_s/x/(x-1), 1/(x+1) );
PSt:=pullback(L,F(x)):
A0,A1:=coeff(PSt,Dx,0) , collect(coeff(PSt,Dx,1),diff(F(x),x$2),factor);
K := field_extension(transcendental_elements=[_s]):
R := differential_ring(ranking=[F,a1,a0], derivations=[x],field_of_constants=K, notation=diff):
sys:=map(numer,{A1-a1(x),A0-a0(x)}):
GE:= Rosenfeld_Groebner(sys, R);
rewrite_rules(GE[1]);
## result letting G=A0'/A0+2*A1;
pullback_formula:=F(x)=factor(normal( subs(a1(x)=1/2*(G(x)-diff(a0(x),x)/a0(x) ) , rhs(rewrite_rules(GE[1])[1]))));pullback_A4S:=rhs(subs(_s=s,lambda=1/3,pullback_formula));
pullback_S4S:=rhs(subs(_s=s,lambda=1/4,pullback_formula));
pullback_A5S:=rhs(subs(_s=s,lambda=1/5,pullback_formula));
pullback_A5I:=pullback_A5S: Expressions of the solutions of equations, after pullback.solution_A4I:=eval(sol_A4I,x=pullback_A4I);solution_S4I:=eval(sol_S4I,x=pullback_S4I);solution_A5I:=eval(sol_A5I,x=pullback_A5I);solution_A4S:=eval(sol_A4S,x=pullback_A4S);solution_S4S:=eval(sol_S4S,x=pullback_S4S);From A4 to D2, section 5.4This is the naive version, showing all steps of the computation. Of course, it is much easier to compute the pullback from D2I to A4I directly !Dn:=Dx^2+x*Dx/((x-1)*(x+1))-1/4/((x-1)*n^2*(x+1)):
Q:=eval(Dn,n=2);
localex(A4S); ## check local exponents to see which transform to apply
b1:=1/12/(x+1)-1/12/x;
L1:=symmetric_product(A4S,Dx-b1);
localex(L1); ## check local exponents
## arrange exponents are 0,1/3 at zero and infinity so they will become ordinary:
L2:=pullback(L1,x-1);
##
L3:=pullback(L2,x^3);
localex(L3); ## shows that this is a standard equations with group D_2.
alias(J=RootOf(_Z^2+_Z+1)):
## rearrange the singular points to get closer to desired equation.
p3:=(x+1+2*J)/(x-1-2*J);
## sends to 1,1,inf ; inverse: (2*J+1)*(1+y)/(-1+y)
L4:=pullback(L3,p3): L4:=collect(L4,Dx,X->factor(evala(expand(X))));;
localex(L4);
b4:=1/12/(x-1)+1/12/(x+1);
L5:=symmetric_product(L4,Dx-b4);
## this is the standard equation for D2.
## but the inversion of the above steps gives an ugly formula so let's not use itThe pullback formula from D_2^i to A_4^ip:=eval(3*sqrt(-3)*(F^2-1)/(F^3-9*F),F=x);verif:=collect(D2I-pullback(A4I,p),Dx,normal);latex(3*sqrt(-3)*(F^2-1)/(F^3-9*F));D2I;## automorphisms of D2I (the other one is x->-x).
p1:=(x+3)/(1-x); p2:=normal(eval(p1,x=p1)); p3:=normal(eval(p2,x=p1));verif1:=collect(pullback(D2I,p1)-D2I,Dx,normal);
verif2:=collect(pullback(D2I,-x)-D2I,Dx,normal);P:=numer(p)-y*denom(p): P:=collect(P/lcoeff(P,x),x,factor);
## we may check that automorphisms of D2I preserve the pullback, of course:
P1:=numer(normal(subs(x=p1,P))): verif1:= collect(P1/lcoeff(P1,x) - P,x,factor);
P2:=numer(normal(subs(x=p2,P))): verif1:= collect(P2/lcoeff(P2,x) - P,x,factor);