Next: About this document ...
Up: The unusual Hecke algebra X(389)
Previous: Discriminant of the Hecke
The following is a PARI program that might be helpful
to the reader interested in computing discriminants of
Z-modules.
In retrospect it looks ``unfinished''.
\\ disc.gp -- Usually compute the discriminant of a finite commutative
\\ Z-module represented by matrices T1,...,Tn, such that
\\ the inner product is <Ti,Tj> = tr(Ti*Tj).
\\ The word ``usually'' is used in the description because the program
\\ can fail if the matrices aren't ``generic enough.'' See
\\ the ``coords'' function.
{nrows(M)=matsize(M)[1];}
{ncols(M)=matsize(M)[2];}
\\ coords: make a matrix whose columns are the col's columns of all of the Ti
{coords(col, i,j)=matrix(nrows(T[1]),ncols(T),i,j, T[j][i,col]);}
\\ Find an integral basis for the module.
\\ The columns of the matrix returned give the
\\ linear combination a1*T1+a2*T2+...+an*Tn, ai in Z,
\\ which give a system of generators for the module.
{intbasis(
i,j,n,C,h,U,M)=
n=nrows(T[1]); i=1; C=coords(i);
while(matrank(C)<n,
i++; if(i>ncols(T), print("Error, not enough generators."); return(0););
C=coords(i););
print("The ", i,"th columns coordinatize the module.");
print("Computing mathnf.");
U=mathnf(C,2)[2];
print("Extracting integral basis.");
\\ take exactly those columns of U, so that when multiplied
\\ by C, the result is =/= 0.
M=matrix(nrows(U),n,i,j,0);
j=1;
for(i=1,ncols(U),
if(C*U[,i]!=0,
if(j>n,print("ERROR: PARI's mathnf is incorrect.");return(0););
M[,j]=U[,i]; j++)
);
if(j<n,print("ERROR: PARI's mathnf is producing invalid results."));
M;
}
{Bmat( i=0,j=0)=
B=matrix(ncols(T),ncols(T),i,j,if(i>=j,trace(T[i]*T[j]),0));
for(i=1,nrows(B),for(j=i+1,ncols(B),B[i,j]=B[j,i]));
B;}
\\ A = computed using intbasis; an integral basis of the Hecke algebra,
\\ expressed on the T[i].
\\ B = computed using Bmat; matrix of inner products (tr(T[i]*T[j])).
{DiscMat(A,B)=mattranspose(A)*B*A;}
William A. Stein
1999-10-21