Re: Fast multiplication of polynomials mod p
- To: mathgroup at smc.vnet.net
- Subject: [mg51036] Re: [mg50985] Fast multiplication of polynomials mod p
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Sat, 2 Oct 2004 03:18:17 -0400 (EDT)
- References: <200410010847.EAA11443@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Trav wrote: > I'm running a huge job on Mathematica, and the bulk of the running > time is used on computing products of polynomials mod prime p (the > program has to handle hundreds of polynomials of degrees up to > hundreds, maybe even a 1000, mod p). The generic PolynomialMod > function is slow (at O(d^2), d being the degree). Is there any add-on > to speed up this process? I do know there's a 'FiniteFields' package, > but any other recommendations? > > [ I just realized that I need to perform Gaussian elimination mod p as > well. And the matrix is not sparse. Is there a good Mathematica > library for that? ] > > Thanks in advance. There is fast dedicated technology built into the Algebra` context for manipulating dense univariate polynomials, represented by coefficient lists, modulo p. Here are the functions (they all are named Polynomial...List). In[2]:= ??Algebra`Polynomial*List Algebra`PolynomialDerivativeModList Algebra`PolynomialPlusModList Algebra`PolynomialDivisionModList Algebra`PolynomialPowerModList Algebra`PolynomialExtendedGCDModList Algebra`PolynomialPthRootModList Algebra`PolynomialFactorModList Algebra`PolynomialQuotientModList Algebra`PolynomialGCDModList Algebra`PolynomialRemainderModList Algebra`PolynomialMakeMonicModList Algebra`PolynomialSubtractModList Algebra`PolynomialMinusModList Algebra`PolynomialTimesModList The one you want is PolynomialTimesModList. To get an idea of speed I'll show a brief demo. We start with code to generate random polynomials modulo some given p (which actually need not be prime). We'll multiply a pair of degree over 1000. randomPoly[deg_, mod_, x_] := Table[Random[Integer,mod-1],{deg+1}] . x^Range[0,deg] deg = 1200; SeedRandom[1234]; p = Prime[1234]; poly1 = randomPoly[deg, p, x]; poly2 = randomPoly[deg, p, x]; Now let's see what PolynomialMod does. In[9]:= Timing[prod1 = PolynomialMod[poly1*poly2,p];] Out[9]= {5.61 Second, Null} We can convert to lists, multiply, and convert back quite a bit faster. In[10]:= Timing[ listpoly1 = CoefficientList[poly1,x]; listpoly2 = CoefficientList[poly2,x]; prod2list = Algebra`PolynomialTimesModList[listpoly1,listpoly2,p]; prod2 = prod2list . x^Range[0,Length[prod2list]-1]; ] Out[10]= {0.03 Second, Null} We check the results for consistency. In[11]:= prod1===prod2 Out[11]= True Generally speaking you would want to do as much as possible of the computation using the list representation, and only convert from/to explicit polynomials, if at all, at the beginning and end of the process. Gaussian elimination with integer matrices modulo p can be done via RowReduce[matrix, Modulus->p] Daniel Lichtblau Wolfram Research
- References:
- Fast multiplication of polynomials mod p
- From: lzwnews@yahoo.com (Trav)
- Fast multiplication of polynomials mod p