/*
* $Id$
*/
package edu.jas.ufd;
import org.apache.log4j.Logger;
import edu.jas.poly.GenPolynomial;
import edu.jas.poly.PolyUtil;
import edu.jas.structure.GcdRingElem;
/**
* Greatest common divisor algorithms with primitive polynomial remainder
* sequence.
* @author Heinz Kredel
*/
public class GreatestCommonDivisorPrimitive> extends
GreatestCommonDivisorAbstract {
private static final Logger logger = Logger.getLogger(GreatestCommonDivisorPrimitive.class);
private final boolean debug = logger.isDebugEnabled();
/**
* Univariate GenPolynomial greatest comon divisor. Uses pseudoRemainder for
* remainder.
* @param P univariate GenPolynomial.
* @param S univariate GenPolynomial.
* @return gcd(P,S).
*/
@Override
public GenPolynomial baseGcd(GenPolynomial P, GenPolynomial S) {
if (S == null || S.isZERO()) {
return P;
}
if (P == null || P.isZERO()) {
return S;
}
if (P.ring.nvar > 1) {
throw new IllegalArgumentException(this.getClass().getName() + " no univariate polynomial");
}
long e = P.degree(0);
long f = S.degree(0);
GenPolynomial q;
GenPolynomial r;
if (f > e) {
r = P;
q = S;
long g = f;
f = e;
e = g;
} else {
q = P;
r = S;
}
if (debug) {
logger.debug("degrees: e = " + e + ", f = " + f);
}
r = r.abs();
q = q.abs();
C a = baseContent(r);
C b = baseContent(q);
C c = gcd(a, b); // indirection
r = divide(r, a); // indirection
q = divide(q, b); // indirection
if (r.isONE()) {
return r.multiply(c);
}
if (q.isONE()) {
return q.multiply(c);
}
GenPolynomial x;
while (!r.isZERO()) {
x = PolyUtil. baseSparsePseudoRemainder(q, r);
q = r;
r = basePrimitivePart(x);
}
return (q.multiply(c)).abs();
}
/**
* Univariate GenPolynomial recursive greatest comon divisor. Uses
* pseudoRemainder for remainder.
* @param P univariate recursive GenPolynomial.
* @param S univariate recursive GenPolynomial.
* @return gcd(P,S).
*/
@Override
public GenPolynomial> recursiveUnivariateGcd(GenPolynomial> P,
GenPolynomial> S) {
if (S == null || S.isZERO()) {
return P;
}
if (P == null || P.isZERO()) {
return S;
}
if (P.ring.nvar > 1) {
throw new IllegalArgumentException(this.getClass().getName() + " no univariate polynomial");
}
long e = P.degree(0);
long f = S.degree(0);
GenPolynomial> q;
GenPolynomial> r;
if (f > e) {
r = P;
q = S;
long g = f;
f = e;
e = g;
} else {
q = P;
r = S;
}
if (debug) {
logger.debug("degrees: e = " + e + ", f = " + f);
}
r = r.abs();
q = q.abs();
GenPolynomial a = recursiveContent(r);
GenPolynomial b = recursiveContent(q);
GenPolynomial c = gcd(a, b); // go to recursion
//System.out.println("rgcd c = " + c);
r = PolyUtil. recursiveDivide(r, a);
q = PolyUtil. recursiveDivide(q, b);
if (r.isONE()) {
return r.multiply(c);
}
if (q.isONE()) {
return q.multiply(c);
}
GenPolynomial> x;
while (!r.isZERO()) {
x = PolyUtil. recursivePseudoRemainder(q, r);
//System.out.println("rgcd x = " + x);
q = r;
r = recursivePrimitivePart(x);
}
return q.abs().multiply(c); //.abs();
}
}
Ads help maintain this website.