Dear Forum, Dear Jakob Kroeker,

The following will be in parts a rather technical response. The executive 
summary is that GAP sometimes has to do tradeoffs that make its internal data 
types not perfect for all occasions, but that there are also a multitude of 
functions to interact with these data types that can be of help.

On Sep 23, 2012, at 7:59 AM, kroeker <kroe...@uni-math.gwdg.de> wrote:

> The core GAP polynomial manipulation function set is sufficient but very 
> basic. Extensive polynomial manipulation using ExtRepPolynomialRatFun would 
> be very tedious and computationally expensive
> ( e.g. coefficient access compexity) and I experienced this in a recent join 
> project to compute Hurwitz map approximations.
> 
> An example and working definition for 'ConstantTerm' and 
> 'CoefficientOfPolynomial' is attached.

I'm the first one to admit that the polynomial arithmetic in GAP is not as fast 
as that in a dedicated ``polynomial'' system. However also a reasonable amount 
of care has gone into it and it would not be trivial to rebuild equivalent 
functionality from scratch.

A function to access individual coefficients is probably useful for multiple 
users and I will see to add it to the next version of GAP.

However your approach (storing the polynomial a second time in a dictionary) is 
unnecessarily memory intensive, and (as I believe sorted lists are used inside 
this type of dictionary anyhow) can be easily be improved upon by doing a 
binary search directly through the (sorted! polynomials in GAP assume that the 
terms are stored sorted and if not could produce arithmetic errors!) 
coefficients. Concretely, I would expect the function

InstallMethod(CoefficientOfPolynomial,"binary search in extrep",IsIdenticalObj,
  [IsPolynomial,IsPolynomial],0,
function(pol,mon)
local a,b,fam,ep,em,cmp,mid;

  fam:=FamilyObj(pol);
  ep:=ExtRepPolynomialRatFun(pol);
  em:=ExtRepPolynomialRatFun(mon);
  if Length(em)<>2 or not IsOne(em[2]) then
    Error("second parameter must be monomial");
  fi;
  em:=em[1];
  # binary search in steps of 2 -- this could be in the kernel to be faster
  cmp:=fam!.zippedSum[1]; # monomial comparison function
  a:=1;
  b:=Length(ep)-1;
  while a<b do
    mid:=a+2*QuoInt(b-a,4);
    if cmp(ep[mid],em) then
      a:=mid+2;
    else
      b:=mid;
    fi;
  od;
  if a=b and ep[a]=em then
    return ep[a+1];
  else
    return fam!.zeroCoefficient;
  fi;
end);

to perform as well as the one you proposed while avoiding the storage 
duplication.

I'm a bit reluctant to add ``personal convenience'' functions (such as ``more 
handy format for factors'') to the main GAP system as this likely is dependent 
on personal preference.

> (e.g. evaluating/differentiating a polynomial tensor,
You are aware of `Derivative'?

> coercing polynomials to different rings,
Polynomials don't belong to a ring but to a coefficients family. If you want to 
transfer between finite characteristic and characteristic zero, care has to be 
taken that the ``right'' interpretation for finite field elements is chosen, 
e.g. do you want -p/2..p/2 or 0..p-1?

> counting variables appeared in a polynomial,
There is OccuringVariableIndices from which the number is easily deduced.

I realize that not all of this is documented in the manual. If you need a 
specific function or information about a particular library function please 
feel free to ask.

Best,

   Alexander Hulpke




-- Colorado State University, Department of Mathematics,
Weber Building, 1874 Campus Delivery, Fort Collins, CO 80523-1874, USA
email: hul...@math.colostate.edu, Phone: ++1-970-4914288
http://www.math.colostate.edu/~hulpke


_______________________________________________
Forum mailing list
Forum@mail.gap-system.org
http://mail.gap-system.org/mailman/listinfo/forum

Reply via email to