Let's examine a simple case:
fricas
(1) -> Dg := [p3 - 3*p2 + 3*p1 - p0,3*p2 - 6*p1 + 3*p0,3*p1 - 3*p0,p0]
Type: List(Polynomial(Integer))
Now calculate coefficients in two ways:
fricas
map(coefficients, Dg::List MPOLY([p0,p1,p2,p3], INT))
Type: List(List(Integer))
and
fricas
map(coefficients, Dg::List MPOLY([p3,p2,p1,p0], INT))
Type: List(List(Integer))
As you see the list are all reversed, but... they were not padded
with zeros. While in my opinion they should be - we have a given
order of variables, and alone 1 in the last list suggests that this
is a coefficient of p3 while it isn't. It is a coefficient of p0.
According to the FriCAS book function coefficients
does not
include zeros in the list. Furthermore it does not say explicitly
in what order the coefficients themselves are listed. In fact
coefficients are listed in monomial order. If one need to
both coeffcients and variables one can use monomials
to get
them together, or use degree
on monomials to extract variables.
fricas
pol1 := first(Dg)
Type: Polynomial(Integer)
fricas
monomials(pol1)
Type: List(Polynomial(Integer))
fricas
coefficients(pol1)
Type: List(Integer)
fricas
map(degree, monomials(pol1))
Type: List(IndexedExponents
?(Symbol))
fricas
pol2 := pol1::MPOLY([p0,p1,p2,p3], INT)
Type: MultivariatePolynomial
?([p0,
p1,
p2,
p3],
Integer)
fricas
monomials(pol2)
Type: List(MultivariatePolynomial
?([p0,
p1,
p2,
p3],
Integer))
fricas
coefficients(pol2)
Type: List(Integer)
fricas
map(degree, monomials(pol2))
Remember
that there are also terms of degree higher than 1. In fact the
two multivariate polynomials that you used above are formally
identical
fricas
(Dg::List MPOLY([p0,p1,p2,p3], INT)=Dg::List MPOLY([p3,p2,p1,p0], INT))::Boolean
Type: Boolean
To produce a list of coefficients of the terms of degree 1,
including the zeros and in a specific order, use the function
coefficient
like this:
fricas
[[coefficient(p,x,1) for x in [p0,p1,p2,p3]] for p in Dg]
Type: List(List(Polynomial(Integer)))
And of course you can use this to produce a matrix.
fricas
matrix %
Type: Matrix(Polynomial(Integer))
Actually, unstated assumption in FriCAS is that multivariate
polynomials are sparse, so omiting zeros is desirable.
For univariate polynomials one can use vectorise
.
Choosing p0
as main variable and converting to
univariate polynomial in one variable we get:
fricas
[vectorise(univariate(p, p0), 2) for p in Dg]
Type: List(Vector(Polynomial(Integer)))