Geoffrey Mess <geoff@math.ucla.edu> writes :
a)It should only be defined for prime values of the second variable.
b) Reduce( n, p) yields n*Z(p)^0, if n is an integer.
c) Reduce(a/b, p) yields a * ( b*Z(p)^0 )^(-1), if b is coprime to p.
d) Reduce should also apply to vectors and matrices with rational
entries, to functions that return vectors and matrices with rational
entries, and so on.
I haven't had the need to use such a function, but it is fairly straight
forward to implement one. Here's a quick attempt at it, you might want to
clean it up a little, especially the error handling part :
################################################################################ Reduce:=function(n,p) local a,b; # handle a non-prime second argument if not(IsPrime(p)) then Print("ERROR : p is not a prime \n"); return; fi; # case when n is an integer if IsInt(n) then return n*Z(p)^0; fi; # case when n is rational if IsRat(n) then a:=Numerator(n); b:=Denominator(n); if Gcd(b,p)<>1 then Print("ERROR : b not coprime to p \n"); return; fi; return a*(b*Z(p)^0 )^(-1); fi; # case when n is a vector if IsVector(n) then return List(n,x->Reduce(x,p)); fi; # case when n is a matrix if IsMat(n) then return List(n,x->Reduce(x,p)); fi; return; end; ################################################################################ for example : gap> tw3; [ [ 1, 0, 0, 0 ], [ 1, 1, -1, 0 ], [ 0, 0, 1, 0 ], [ -1, 0, 1, 1 ] ] gap> Reduce(tw3,2); [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ], [ Z(2)^0, Z(2)^0, Z(2)^0, 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ], [ Z(2)^0, 0*Z(2), Z(2)^0, Z(2)^0 ] ] gap> Reduce(tw3/3,5); [ [ Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ], [ Z(5), Z(5), Z(5)^3, 0*Z(5) ], [ 0*Z(5), 0*Z(5), Z(5), 0*Z(5) ], [ Z(5)^3, 0*Z(5), Z(5), Z(5) ] ] gap> Reduce(tw3[2],2); [ Z(2)^0, Z(2)^0, Z(2)^0, 0*Z(2) ]
Good luck,
Jacob.