CharPolyFromTraces:=function(pp,S,x) dd:=#pp; ans:=x^dd; s:=[pp[1]]; ans:=ans-s[1]*x^(dd-1); if dd gt 1 then for k:=2 to dd do s[k]:=0; for l:=1 to k-1 do s[k]:=s[k]+ (-1)^(l-1) * s[k-l]*pp[l]; end for; s[k]:=s[k]+(-1)^(k-1) *pp[k]; s[k]:=(1/k)*s[k]; ans:=ans+(-1)^(k)*s[k]*x^(dd-k); end for; end if; return ans; end function; TraceSequence:=function(G,A,chi,K) f:=ClassMap(G); eQ:=Order(A); return [K!chi[f(A^k)] : k in [1..chi[1]]]; end function; n:=function(G,alpha,A,chi) eQ:=Order(A); K:=CyclotomicField(#G); t := z^Round(#G/eQ); p:=TraceSequence(G,A,chi,K); S:=PolynomialRing(K); rootlist:=Roots(CharPolyFromTraces(p,S,x)); ans:=0; for k :=1 to #rootlist do if t^alpha eq rootlist[k][1] then ans:= rootlist[k][2]; end if; end for; return ans; end function; FractionalPart:=function(x) return x-Floor(x); end function; CW:= function(G,gprime,T,CCL,M,m,S) H0mK:=[]; e:=[Order(M[j]) : j in [1..#M]]; for i:=1 to #CCL do H0mK[i]:=(2*m-1)*(gprime-1)*T[i][1]; for j:=1 to #M do for alpha:=0 to e[j]-1 do H0mK[i]:=H0mK[i]+( (m-1)*(1-1/e[j]) + FractionalPart( (m-1-alpha)/e[j]) )*n(G,alpha,M[j],T[i]); end for; end for; if m eq 1 then if i eq 1 then H0mK[i]:=H0mK[i]+1; end if; end if; end for; chim:=Character(GModule(G,S,m)); Sm:=Decomposition(T,chim); Im:=[Sm[j]-H0mK[j] : j in [1..#CCL]]; print "S_m="; print Sm; print "\n"; print "H^0(C,mK)="; print H0mK;print "\n"; print "I_m="; return Im; end function;