5.7.6 GCD, LCM and resultant
The functions for polynomial greatest common divisor and least common
multiple have the synopsis
| ex gcd(const ex & a, const ex & b);
ex lcm(const ex & a, const ex & b);
|
The functions gcd()
and lcm()
accept two expressions
a
and b
as arguments and return a new expression, their
greatest common divisor or least common multiple, respectively. If the
polynomials a
and b
are coprime gcd(a,b)
returns 1
and lcm(a,b)
returns the product of a
and b
. Note that all
the coefficients must be rationals.
| #include <ginac/ginac.h>
using namespace GiNaC;
int main()
{
symbol x("x"), y("y"), z("z");
ex P_a = 4*x*y + x*z + 20*pow(y, 2) + 21*y*z + 4*pow(z, 2);
ex P_b = x*y + 3*x*z + 5*pow(y, 2) + 19*y*z + 12*pow(z, 2);
ex P_gcd = gcd(P_a, P_b);
// x + 5*y + 4*z
ex P_lcm = lcm(P_a, P_b);
// 4*x*y^2 + 13*y*x*z + 20*y^3 + 81*y^2*z + 67*y*z^2 + 3*x*z^2 + 12*z^3
}
|
The resultant of two expressions only makes sense with polynomials.
It is always computed with respect to a specific symbol within the
expressions. The function has the interface
| ex resultant(const ex & a, const ex & b, const ex & s);
|
Resultants are symmetric in a
and b
. The following example
computes the resultant of two expressions with respect to x
and
y
, respectively:
| #include <ginac/ginac.h>
using namespace GiNaC;
int main()
{
symbol x("x"), y("y");
ex e1 = x+pow(y,2), e2 = 2*pow(x,3)-1; // x+y^2, 2*x^3-1
ex r;
r = resultant(e1, e2, x);
// -> 1+2*y^6
r = resultant(e1, e2, y);
// -> 1-4*x^3+4*x^6
}
|