<<

. 32
( 33 .)



>>

#
# L is a product of three first-order operators
#
rlist := Llist2rlist( Lfactors, dom );
r2 := rlist[2];
r1 := rlist[3];
GredList := compute_torus( r1, r2, x );
if ( GredList[1] = 2 ) then
#
# torus is C*^2
#
return [ "U3", "C*^2", "standard" ] ;
elif (GredList[1] = 1 ) then
#
# torus is C*
#
elist := GredList[2];
if ( elist[2] = 0 ) then
#
# Torus representation is t |--> [t,1,1/t]
#
g := ratsols( diff(y(x),x) - r2*y(x), y(x) )[1];
#
# The next line rules out the case where g is a constant.
# This ensures that the subsequent calls to ratsols will be
# for inhomogeneous differential equations.
#
if ( diff( g, x ) = 0 ) then
return [ "C", "C*", 1 ] ;
fi;
Ltemp := mult(Dx,Dx-r1-2*r2,dom);
Ltemp1 := diffop2de(Ltemp,y(x),dom);
s := ratsols( Ltemp1 = r2*g^3,y(x) );
if ( nops(s) = 1 ) then
#
# inhomogeneous equation has no rational solutions;
# Maple has returned only a list of solutions to the
# homogeneous equation
#
return [ "U3", "C*", [ 1, 0 ] ] ;
else
#
# decide between C and C^2 for unipotent radical
#
Ltemp := mult(Dx,Dx-r1-2*r2,Dx-2*r1-r2,dom);


142
Ltemp1 := diffop2de(Ltemp,y(x),dom);
s := ratsols( Ltemp1 = r2*g^3, y(x) );
if ( nops(s) = 1 ) then
#
# inhomogeneous equation has no rational solutions;
# Maple has returned only a list of solutions to
# the homogeneous equation
#
return [ "C^2", "C*", [ 1, 2 ] ] ;
else
return [ "C", "C*", 1 ] ;
fi;
fi;
else
#
# Torus representation is NOT [t,1,1/t];
# unipotent radical must be U3
#
return [ "U3", "C*", elist ] ;
fi;
else
error "unexpected trivial torus in case n1 = n2 = 1" ;
fi;
fi;
elif ( n2 = 2 ) then
#
# n1 = 1, n2 = 2
#
rlist := Llist2rlist( Lfactors, dom );
r2 := rlist[2];
r1 := rlist[3];
GredList := compute_torus( r1, r2, x );
if ( GredList[1] = 2 ) then
#
# torus is C*^2
#
return [ "C^2", "C*^2", [ [1, -1], [2, 1] ] ] ;
elif ( GredList[1] = 1 ) then
#
# torus is C*
#
elist := GredList[2];
return [ "C^2", "C*", [ elist[1] - elist[2], \
2*elist[1] + elist[2] ] ] ;
else
error "unexpected trivial torus in case n1 = 1, n2 = 2" ;
fi;
elif ( n2 = infinity ) then
#


143
# n1 = 1, n2 = infinity
#
return [ "C^2", "C*", [ -3, -3 ] ] ;
else
error "for n1 = 1, unexpected n2: %1", n2 ;
fi;
elif ( n1 = 2 ) then
if ( n2 = 1 ) then
#
# n1 = 2, n2 = 1
#
rlist := Llist2rlist( Lfactors, dom );
r2 := rlist[2];
r1 := rlist[3];
GredList := compute_torus( r1, r2, x );
if ( GredList[1] = 2 ) then
#
# torus is C*^2
#
return [ "C^2", "C*^2", [ [ 2, 1 ], [ 1, 2 ] ] ] ;
elif (GredList[1] = 1 ) then
#
# torus is C*
#
elist := GredList[2];
return [ "C^2", "C*", [ 2*elist[1] + elist[2], \
elist[1] + 2*elist[2] ] ] ;
else
error "unexpected trivial torus in case n1 = 2, n2 = 1" ;
fi;
elif ( n2 = 2 ) then
#
# n1 = n2 = 2
#
rlist := Llist2rlist( Lfactors, dom );
r2 := rlist[2];
r1 := rlist[3];
GredList := compute_torus( r1,r2, x );
if ( GredList[1] = 2 ) then
#
# torus is C*^2
#
return [ "C", "C*^2", [ 2, 1 ] ] ;
elif ( GredList[1] = 1 ) then
#
# torus is C*
#
elist := GredList[2];
L2 := mult( Lfactors[2], Lfactors[3], dom);


144
L2sharp := mult( Lfactors[1], Lfactors[2], dom);
if ( numES( L2, dom) = 1 ) then
return [ "C", "C*", elist[1] - elist[2] ] ;
elif ( numES( L2sharp, dom) = 1 ) then
return [ "C", "C*", elist[1] + 2*elist[2] ] ;
fi;
return [ "C", "C*", 2*elist[1] + elist[2] ];
else
error "unexpected trivial torus in case n1 = 2, n2 = 2";
fi;
elif ( n2 = infinity ) then
#
# n1 = 2, n2 = infinity
#
return [ "C", "C*", -3 ] ;
else
error "for n1 = 2, unexpected n2: %1", n2;
fi;
elif ( n1 = 3 ) then
if ( n2 = 3 ) then
#
# n1 = n2 = 3
#
rlist := Llist2rlist( Lfactors, dom );
r2 := rlist[2];
r1 := rlist[3];
GredList := compute_torus( r1,r2, x );
if ( GredList[1] = 2 ) then
return [ "0", "C*^2", "0" ] ;
elif ( GredList[1] = 1 ) then
return [ "0", "C*", "0" ] ;
else
error "unexpected trivial torus in case n1 = 3, n2 = 3" ;
fi;
else
error "for n1 = 3, unexpected n2: %1", n2 ;
fi;
else
if ( n2 = 1 ) then
#
# n1 = infinity, n2 = 1
#
return [ "C^2", "C*", [ 3, 3 ] ] ;
elif ( n2 = 2 ) then
#
# n1 = infinity, n2 = 2
#
return [ "C", "C*", 3 ] ;
elif ( n2 = infinity ) then


145
#
# n1 = n2 = infinity
#
rlist := Llist2rlist( Lfactors, dom );
r2 := rlist[2];
r1 := rlist[3];
GredList := compute_torus( r1, r2, x );
if ( GredList[1] = 1 ) then
return [ "0", "C*", "0" ] ;
elif ( GredList[1] = 0 ) then
return [ "0", "1", "0" ] ;
else
error "unexpected 2-dimensional torus in case\
n1 = n2 = infinity";
fi;
else
error "for n1 = infinity, unexpected n2: %1", n2 ;
fi;
fi;
end:




#
# IV. order_3_no_pole code
#


translate_matrix_text := proc( s, txt )
#
# This procedure takes as input s, a Maple name that describes
# a certain type of conjugation action. See the comments
# for o3np, under conjugation action of SL2 or GL2 on C^2.
#
# It returns as output an English-language description
# of that action.
#
if ( s = "matrix_vector" ) then
return cat( "M.v = Mv for M in ", txt, ", v in C^2.\
(matrix-vector multiplication)") ;
elif ( s = "vector_transpose_matrix_inverse" ) then
return cat( "M.v = multiply( transpose(v), inverse(M) )\n\
for M in ",txt, ", v in C^2.\n (multiplication of vector\
transpose by matrix inverse)" ) ;
else
error "Incorrect call to translate_matrix_text";
fi;
end:


146
order_3_no_pole := proc( f, g, x )
#
# This procedure takes as input the polynomials f and g in x,
# and returns as output a paragraph describing the Galois group
# of the operator D^3 + fD + g over C(x), where C is the
# field of algebraic numbers.
#
# It is a wrapper function for o3np, providing a text description
# for the output of that procedure; see o3np code and comments
# for details.
#
local G, L, Dx, U, P, Conj, ConjText;
G := o3np( f, g, x );
L := Dx^3 + f*Dx + g;

<<

. 32
( 33 .)



>>