001/*
002 * $Id$
003 */
004
005package edu.jas.fd;
006
007
008import java.io.Serializable;
009import java.util.List;
010
011import edu.jas.poly.GenSolvablePolynomial;
012import edu.jas.structure.GcdRingElem;
013
014
015/**
016 * (Non-unique) factorization domain greatest common divisor algorithm
017 * interface.
018 * @param <C> coefficient type
019 * @author Heinz Kredel
020 */
021
022public interface GreatestCommonDivisor<C extends GcdRingElem<C>> extends Serializable {
023
024
025    /**
026     * GenSolvablePolynomial left greatest common divisor.
027     * @param P GenSolvablePolynomial.
028     * @param S GenSolvablePolynomial.
029     * @return gcd(P,S) with P = P'*gcd(P,S)*p and S = S'*gcd(P,S)*s, where
030     *         deg_main(p) = deg_main(s) == 0.
031     */
032    public GenSolvablePolynomial<C> leftGcd(GenSolvablePolynomial<C> P, GenSolvablePolynomial<C> S);
033
034
035    /**
036     * GenSolvablePolynomial right greatest common divisor.
037     * @param P GenSolvablePolynomial.
038     * @param S GenSolvablePolynomial.
039     * @return gcd(P,S) with P = p*gcd(P,S)*P' and S = s*gcd(P,S)*S', where
040     *         deg_main(p) = deg_main(s) == 0.
041     */
042    public GenSolvablePolynomial<C> rightGcd(GenSolvablePolynomial<C> P, GenSolvablePolynomial<C> S);
043
044
045    /**
046     * GenSolvablePolynomial left least common multiple.
047     * @param P GenSolvablePolynomial.
048     * @param S GenSolvablePolynomial.
049     * @return lcm(P,S) with lcm(P,S) = P'*P = S'*S.
050     */
051    public GenSolvablePolynomial<C> leftLcm(GenSolvablePolynomial<C> P, GenSolvablePolynomial<C> S);
052
053
054    /**
055     * GenSolvablePolynomial right least common multiple.
056     * @param P GenSolvablePolynomial.
057     * @param S GenSolvablePolynomial.
058     * @return lcm(P,S) with lcm(P,S) = P*P' = S*S'.
059     */
060    public GenSolvablePolynomial<C> rightLcm(GenSolvablePolynomial<C> P, GenSolvablePolynomial<C> S);
061
062
063    /**
064     * GenSolvablePolynomial right content.
065     * @param P GenSolvablePolynomial.
066     * @return cont(P) with pp(P)*cont(P) = P.
067     */
068    public GenSolvablePolynomial<C> rightContent(GenSolvablePolynomial<C> P);
069
070
071    /**
072     * GenSolvablePolynomial right primitive part.
073     * @param P GenSolvablePolynomial.
074     * @return pp(P) with pp(P)*cont(P) = P.
075     */
076    public GenSolvablePolynomial<C> rightPrimitivePart(GenSolvablePolynomial<C> P);
077
078
079    /**
080     * GenSolvablePolynomial left content.
081     * @param P GenSolvablePolynomial.
082     * @return cont(P) with cont(P)*pp(P) = P.
083     */
084    public GenSolvablePolynomial<C> leftContent(GenSolvablePolynomial<C> P);
085
086
087    /**
088     * GenSolvablePolynomial left primitive part.
089     * @param P GenSolvablePolynomial.
090     * @return pp(P) with cont(P)*pp(P) = P.
091     */
092    public GenSolvablePolynomial<C> leftPrimitivePart(GenSolvablePolynomial<C> P);
093
094
095    /**
096     * GenSolvablePolynomial left co-prime list.
097     * @param A list of GenSolvablePolynomials.
098     * @return B with leftGcd(b,c) = 1 for all b != c in B and for all
099     *         non-constant a in A there exists b in B with b|a. B does not
100     *         contain zero or constant polynomials.
101     */
102    public List<GenSolvablePolynomial<C>> leftCoPrime(List<GenSolvablePolynomial<C>> A);
103
104
105    /**
106     * GenSolvablePolynomial test for left co-prime list.
107     * @param A list of GenSolvablePolynomials.
108     * @return true if leftGcd(b,c) = 1 for all b != c in B, else false.
109     */
110    public boolean isLeftCoPrime(List<GenSolvablePolynomial<C>> A);
111
112}