Read("FlabbyResolution.gap"); modnearzero := function(a,b) local c; c:=a mod b; if 2*c>b then c:=c-b; fi; return c; end; matmod := function(M,snf) local d,ans,i,row,j; d:=Length(snf); ans:=[]; for i in [1..d] do row:=[]; for j in [1..d] do if i=j and snf[i]=1 then Add(row,1); else Add(row,modnearzero(M[i][j],snf[j])); fi; od; Add(ans,row); od; return ans; end; MultInvFieldToNoetherProblem := function(Mgen,Pgen) local Qgen,snftrans,snf,act; Qgen:=Sum(TransformationMat(Mgen,Pgen)); snftrans:=SmithNormalFormIntegerMatTransforms(Qgen); snf:=Sum(snftrans.normal); act:=List(Pgen,x->TransposedMat(x)^-1); Apply(act,x->matmod(x^snftrans.coltrans,snf)); return rec(snf:=snf,act:=act); end;