[GAP Forum] suggestion for additional core operations on polynomials and lists

kroeker kroeker at uni-math.gwdg.de
Wed May 30 18:19:56 BST 2012


Dear GAP-team,


recently I extensively used  polynomials, lists and methods to 
manipulate them.
 From this experience I would like to suggest to add some of the 
following manipulation and access methods to the GAP-core:

- get or set the coefficient of a specified monomial in a polynomial. ( 
'get' parameters: polynomial and the monomial of interest )
- get coefficients for a list of monomials of interest.
- get the nonzero-coefficients as a list.


- flatten a list
   ( e.g. Flatten( [ 2,[ 3,[4] ] ] )  => [ 2,  3, [4]  ] ; Flatten( [ 
2,  3, [4]  ] ) => [ 2,  3, 4 ] );


Some initial implementations are given below.


Any remarks, comments  related to this suggestion?



Thanks,


Jakob



DeclareOperation("Flatten", [IsList] );
# Example: [ [1,[2] ],[1] ] changes to [1,[2], 1] changes to [1,2,1] .
InstallMethod(Flatten, "remove the top level nesting ", [IsList], 
function(list)
     local result, entry;
     Assert( 0, IsList(list) );
     result := [];
     for entry in list do
         if IsList(entry) then
         Append( result, entry );
         else
             Append( result, [entry] );
         fi;
     od;
     return result;
end
);

# todo: check that polynomial and monomial are in the same ring.
DeclareOperation( "getCoefficientOfMonomial", [ IsPolynomial, 
IsPolynomial ] );
InstallMethod( getCoefficientOfMonomial, " get the coefficient of a 
polynomial  ", [IsPolynomial, IsPolynomial] ,
function( polynomial, monomial )

     local  monomData, coeffData, pos;
     monomData := ExtRepPolynomialRatFun(monomial);
     if Size(monomData) <>2 then
         Error( Concatenation( "\"getCoefficientOfMonomial\":  the 
second parameter (' ", String(monomial), " ') has to be a monomial!") );
     fi;
     Assert( 0, Size(monomData) =2 );

     coeffData := ExtRepPolynomialRatFun(polynomial);
     for pos in [1..Size(coeffData)/2] do
         if coeffData[pos*2-1]=monomData[1] then
             return coeffData[pos*2];
         fi;
     od;

     return Zero( CoefficientsFamily(FamilyObj(polynomial)) ) ;
end
);

DeclareOperation( "getNonzeroCoefficientList", [ IsPolynomial ] );
InstallMethod( getNonzeroCoefficientList, " get the nonzero coefficients 
of a polynomial  ", [ IsPolynomial ] ,
function( polynomial )

     local  coeffList, coeffData, pos;
     coeffList := [];

     coeffData := ExtRepPolynomialRatFun(polynomial);
     for pos in [1..Size(coeffData)/2] do
         Append(coeffList, [ coeffData[pos*2] ]);
     od;
    return coeffList;
end
);




More information about the Forum mailing list