Dear Forum and dear Alexander,

recently Marc Bogaerds asked how to get the constant term of a polynomial.
Instead of using ExtRepPolynomialRatFun directly it is thinkable to provide additional functions like 'ConstantTerm' or 'CoefficientOfPolynomial'

Now you may ask why this is useful?
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. In fact, I defined even more useful functions as attached
(e.g. evaluating/differentiating a polynomial tensor,
coercing polynomials to different rings,
counting variables appeared in a polynomial,
a more handy format for factors of a polynomial in comparison to 'Factors', etc.)

Please let me know, if you would like to see some this functions in a special package or in the GAP core
or whatever.



Best,


Jakob






DeclareOperation( "IsMonomial",  [IsObject] ); 

DeclareAttribute("CoefficientsDictionaryOfPolynomial",IsPolynomial);

DeclareOperation("CoefficientOfPolynomial",[ IsPolynomial, IsPolynomial ] );

DeclareOperation("ConstantTerm",[ IsPolynomial ] );


InstallMethod( IsMonomial, "", [IsObject], 
function (monomial)
        local  monomData;
        if not IsPolynomial (monomial) then 
                return false;
        fi;
        monomData := ExtRepPolynomialRatFun(monomial);
        if Size(monomData) <>2 or not IsOne(monomData[2]) then
                return false;
        fi;
        return true;
end
);


InstallMethod( CoefficientsDictionaryOfPolynomial , 
"get coefficient dict of a  polynomial ", [ IsPolynomial ],
 function( polynomial )
    local  coeffData, pos, dict;
    
    if HasCoefficientsDictionaryOfPolynomial(polynomial) then
        dict := CoefficientsDictionaryOfPolynomial(polynomial);
    else
        dict := NewDictionary([1,2,3,4], true);
        coeffData := ExtRepPolynomialRatFun(polynomial);
        for pos in [1..Size(coeffData)/2] do
            AddDictionary(dict,coeffData[pos*2-1], coeffData[pos*2] );
        od;    
    fi;
    return dict ;
end
);



InstallMethod( CoefficientOfPolynomial , 
"get coefficient for a given monomial of an polynomial ", [ IsPolynomial, 
IsPolynomial ],
 function( polynomial, monomial )
    
    local  monomData, dict, coefficient;
 
    if not IsMonomial ( monomial ) then 
        Error( "CoefficientOfPolynomial: second parameter is not a monomial !" 
);
    fi;
    
    monomData := ExtRepPolynomialRatFun(monomial);
    dict := CoefficientsDictionaryOfPolynomial(polynomial);
    coefficient := LookupDictionary(dict, monomData[1]);
    if coefficient=fail then 
        return Zero( CoefficientsFamily(FamilyObj(polynomial)) ) ;
    fi;
    return coefficient;       
end
);


InstallMethod( ConstantTerm , 
"get constant part of a polynomial ", [ IsPolynomial ],
 function( polynomial )
    
    local  dict, coefficient;
    dict := CoefficientsDictionaryOfPolynomial(polynomial);
    coefficient := LookupDictionary(dict, []);
    if coefficient=fail then 
        return Zero( CoefficientsFamily(FamilyObj(polynomial)) ) ;
    fi;
    return coefficient;       
end
);


# Example:

rng := PolynomialRing( ZmodnZ(11)  ,["x","y"] );
indeterminates := IndeterminatesOfPolynomialRing(rng);
x := indeterminates[1];
y := indeterminates[2];
polynomial := (x^4-4)^3*(4*y^2+2);
CoefficientOfPolynomial(polynomial, x^4*y^2);
ConstantTerm(polynomial);  
polynomial := 0*x^0;
ConstantTerm(polynomial);    
polynomial := x^0;
ConstantTerm(polynomial);
 
    


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

Reply via email to