[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
5.7.2 Expanding and collecting
A polynomial in one or more variables has many equivalent representations. Some useful ones serve a specific purpose. Consider for example the trivariate polynomial 4*x*y + x*z + 20*y^2 + 21*y*z + 4*z^2 (written down here in output-style). It is equivalent to the factorized polynomial (x + 5*y + 4*z)*(4*y + z). Other representations are the recursive ones where one collects for exponents in one of the three variable. Since the factors are themselves polynomials in the remaining two variables the procedure can be repeated. In our example, two possibilities would be (4*y + z)*x + 20*y^2 + 21*y*z + 4*z^2 and 20*y^2 + (21*z + 4*x)*y + 4*z^2 + x*z.
To bring an expression into expanded form, its method
ex ex::expand(unsigned options = 0); |
may be called. In our example above, this corresponds to 4*x*y + x*z + 20*y^2 + 21*y*z + 4*z^2. Again, since the canonical form in GiNaC is not easy to guess you should be prepared to see different orderings of terms in such sums!
Another useful representation of multivariate polynomials is as a
univariate polynomial in one of the variables with the coefficients
being polynomials in the remaining variables. The method
collect()
accomplishes this task:
ex ex::collect(const ex & s, bool distributed = false); |
The first argument to collect()
can also be a list of objects in which
case the result is either a recursively collected polynomial, or a polynomial
in a distributed form with terms like c*x1^e1*...*xn^en, as specified
by the distributed
flag.
Note that the original polynomial needs to be in expanded form (for the
variables concerned) in order for collect()
to be able to find the
coefficients properly.
The following ginsh
transcript shows an application of collect()
together with find()
:
> a=expand((sin(x)+sin(y))*(1+p+q)*(1+d)); d*p*sin(x)+p*sin(x)+q*d*sin(x)+q*sin(y)+d*sin(x)+q*d*sin(y)+sin(y)+d*sin(y) +q*sin(x)+d*sin(y)*p+sin(x)+sin(y)*p > collect(a,{p,q}); d*sin(x)+(d*sin(x)+sin(y)+d*sin(y)+sin(x))*p +(d*sin(x)+sin(y)+d*sin(y)+sin(x))*q+sin(y)+d*sin(y)+sin(x) > collect(a,find(a,sin($1))); (1+q+d+q*d+d*p+p)*sin(y)+(1+q+d+q*d+d*p+p)*sin(x) > collect(a,{find(a,sin($1)),p,q}); (1+(1+d)*p+d+q*(1+d))*sin(x)+(1+(1+d)*p+d+q*(1+d))*sin(y) > collect(a,{find(a,sin($1)),d}); (1+q+d*(1+q+p)+p)*sin(y)+(1+q+d*(1+q+p)+p)*sin(x) |
Polynomials can often be brought into a more compact form by collecting common factors from the terms of sums. This is accomplished by the function
ex collect_common_factors(const ex & e); |
This function doesn't perform a full factorization but only looks for factors which are already explicitly present:
> collect_common_factors(a*x+a*y); (x+y)*a > collect_common_factors(a*x^2+2*a*x*y+a*y^2); a*(2*x*y+y^2+x^2) > collect_common_factors(a*(b*(a+c)*x+b*((a+c)*x+(a+c)*y)*y)); (c+a)*a*(x*y+y^2+x)*b |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |