/*
* $Id$
*/
package edu.jas.ufd;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import edu.jas.poly.AlgebraicNumber;
import edu.jas.poly.AlgebraicNumberRing;
import edu.jas.poly.Complex;
import edu.jas.poly.ComplexRing;
import edu.jas.poly.GenPolynomial;
import edu.jas.poly.GenPolynomialRing;
import edu.jas.poly.TermOrder;
import edu.jas.poly.PolyUtil;
import edu.jas.structure.GcdRingElem;
import edu.jas.structure.RingFactory;
/**
* Complex coefficients factorization algorithms. This class implements
* factorization methods for polynomials over Complex numbers via the algebraic
* number C(i) over rational numbers or over (prime) modular integers. Note:
* Decomposition to linear factors is only via absolute factorization since
* Complex are not the analytic complex numbers.
* @author Heinz Kredel
* @param coefficient type
*/
public class FactorComplex> extends FactorAbsolute> {
private static final Logger logger = Logger.getLogger(FactorComplex.class);
private final boolean debug = logger.isDebugEnabled();
/**
* Factorization engine for algebraic coefficients.
*/
public final FactorAbstract> factorAlgeb;
/**
* Complex algebraic factory.
*/
public final AlgebraicNumberRing afac;
/**
* No argument constructor. Note: can't use this constructor.
*/
protected FactorComplex() {
throw new IllegalArgumentException("don't use this constructor");
}
/**
* Constructor.
* @param fac complex number factory.
*/
public FactorComplex(RingFactory> fac) { // why is this constructor required?
this((ComplexRing) fac);
}
/**
* Constructor.
* @param fac complex number factory.
*/
public FactorComplex(ComplexRing fac) {
super(fac);
this.afac = fac.algebraicRing();
this.factorAlgeb = FactorFactory. getImplementation(afac);
}
/**
* Constructor.
* @param fac complex number factory.
* @param factorAlgeb factorization engine for polynomials over algebraic coefficients.
*/
public FactorComplex(ComplexRing fac, FactorAbstract> factorAlgeb) {
super(fac);
this.afac = fac.algebraicRing();
this.factorAlgeb = factorAlgeb;
}
/**
* GenPolynomial base factorization of a squarefree polynomial.
* @param P squarefree GenPolynomial<AlgebraicNumber<C>>.
* @return [p_1,...,p_k] with P = prod_{i=1, ..., k} p_i.
*/
@Override
public List>> baseFactorsSquarefree(GenPolynomial> P) {
if (P == null) {
throw new IllegalArgumentException(this.getClass().getName() + " P == null");
}
List>> factors = new ArrayList>>();
if (P.isZERO()) {
return factors;
}
if (P.isONE()) {
factors.add(P);
return factors;
}
GenPolynomialRing> pfac = P.ring; // CC[x]
if (pfac.nvar > 1) {
throw new IllegalArgumentException("only for univariate polynomials");
}
ComplexRing cfac = (ComplexRing) pfac.coFac;
if (!afac.ring.coFac.equals(cfac.ring)) {
throw new IllegalArgumentException("coefficient rings do not match");
}
Complex ldcf = P.leadingBaseCoefficient();
if (!ldcf.isONE()) {
P = P.monic();
factors.add(pfac.getONE().multiply(ldcf));
}
//System.out.println("\nP = " + P);
GenPolynomialRing> pafac = new GenPolynomialRing>(afac, pfac);
GenPolynomial> A = PolyUtil. algebraicFromComplex(pafac, P);
//System.out.println("A = " + A);
List>> afactors = factorAlgeb.baseFactorsSquarefree(A);
if (debug) {
// System.out.println("complex afactors = " + afactors);
logger.info("complex afactors = " + afactors);
}
for (GenPolynomial> pa : afactors) {
GenPolynomial> pc = PolyUtil. complexFromAlgebraic(pfac, pa);
factors.add(pc);
}
//System.out.println("cfactors = " + factors);
return factors;
}
}
Ads help maintain this website.