## File: polytest.g

package info (click to toggle)
gap 4r4p12-2
 `123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120` ``````############################################################################# ## ## ## Polynomial arithmetic timing tests Robert Arthur ## ## ## ############################################################################# if IsBound(Permutations) then # running GAP3 # Without these, the parser doesn't like the GAP4 code's presence LaurentPolynomialByCoefficients:= x->x; ElementsFamily:= x->x; FamilyObj:= x->x; # require a function to test for zero polynomials polyIsZero:= function(p) return p = Polynomial(p.baseRing, []); end; # create a polynomial with base field f, coefficient list l PolynomialTest:= function(f, l) # the actual call return Polynomial(f, l); end; fi; if not IsBound(Permutations) then # running GAP4 PolynomialTest:= function(f, l) return LaurentPolynomialByCoefficients( ElementsFamily(FamilyObj(f)), l, 0); end; polyIsZero:= IsZero; fi; testfields:= [FiniteField(2), FiniteField(3), FiniteField(128), FiniteField(1013), Rationals]; # polys[l] will contain 100 random polynomials over testfields[l]. polys:= List(testfields, x->[]); # Start the calculations! ProdTest:=function() local l,i,j,start,scratch; for l in [1..Length(testfields)] do start:= Runtime(); for i in [1..100] do for j in [1..100] do scratch:= polys[l][i]*polys[l][j]; od; od; Print("Time for product over ",testfields[l],": ", Runtime()-start, "\n"); od; end; AddTest:=function() local l,i,j,start,scratch; for l in [1..Length(testfields)] do start:= Runtime(); for i in [1..100] do for j in [1..100] do scratch:= polys[l][i]+polys[l][j]; od; od; Print("Time for addition over ",testfields[l],": ", Runtime()-start, "\n"); od; end; SubTest:=function() local l,i,j,start,scratch; for l in [1..Length(testfields)] do start:= Runtime(); for i in [1..100] do for j in [1..100] do scratch:= polys[l][i]-polys[l][j]; od; od; Print("Time for subtraction over ",testfields[l],": ", Runtime()-start, "\n"); od; end; # Division not defined for all pairs - we must make sure that p2 divides # p1. Timing only performed for final division. DivTest:=function() local p,l,i,j,start,scratch,total; p:= []; for l in [1..Length(testfields)] do total:= 0; for i in [1..100] do for j in [1..100] do p[j]:= polys[l][i]*polys[l][j]; od; start:= Runtime(); for j in [1..100] do if not polyIsZero(polys[l][i]) then scratch:= p[j]/polys[l][i]; fi; od; total:= total + Runtime() - start; od; Print("Time for division over ", testfields[l],": ",total,"\n"); od; end; DoTests:=function() local i,j,a,l; for i in [1..100] do for j in [1..Length(testfields)] do a:= Random([1..20]); l:= List([1..a], x->Random(testfields[j])); Add(polys[j], PolynomialTest(testfields[j], l)); od; od; Print("Fields are: ", testfields, "\n"); AddTest(); SubTest(); ProdTest(); DivTest(); end; ``````