001    /*
002     * $Id: Squarefree.java 3068 2010-04-11 17:27:16Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    import java.util.List;
009    import java.util.SortedMap;
010    
011    import edu.jas.poly.GenPolynomial;
012    import edu.jas.structure.GcdRingElem;
013    
014    
015    /**
016     * Squarefree decomposition interface.
017     * @param <C> coefficient type
018     * @author Heinz Kredel
019     * @usage To create objects that implement the <code>Squarefree</code>
020     *        interface use the <code>SquarefreeFactory</code>. It will select an
021     *        appropriate implementation based on the types of polynomial
022     *        coefficients C. To obtain an implementation use
023     *        <code>getImplementation()</code>, it returns an object of a class
024     *        which extends the <code>SquarefreeAbstract</code> class which
025     *        implements the <code>Squarefree</code> interface.
026     * 
027     * <pre>
028     * Squarefree&lt;CT&gt; engine;
029     * engine = SquarefreeFactory.&lt;CT&gt; getImplementation(cofac);
030     * c = engine.squarefreeFactors(a);
031     * </pre>
032     * 
033     * For example, if the coefficient type is BigInteger, the usage looks like
034     * 
035     * <pre>
036     * BigInteger cofac = new BigInteger();
037     * Squarefree&lt;BigInteger&gt; engine;
038     * engine = SquarefreeFactory.getImplementation(cofac);
039     * Sm = engine.sqaurefreeFactors(poly);
040     * </pre>
041     * 
042     * @see edu.jas.ufd.SquarefreeFactory#getImplementation
043     */
044    
045    public interface Squarefree<C extends GcdRingElem<C>> {
046    
047    
048        /**
049         * GenPolynomial greatest squarefree divisor.
050         * @param P GenPolynomial.
051         * @return squarefree(pp(P)).
052         */
053        public GenPolynomial<C> squarefreePart(GenPolynomial<C> P);
054    
055    
056        /**
057         * GenPolynomial test if is squarefree.
058         * @param P GenPolynomial.
059         * @return true if P is squarefree, else false.
060         */
061        public boolean isSquarefree(GenPolynomial<C> P);
062    
063    
064        /**
065         * GenPolynomial list test if squarefree.
066         * @param L list of GenPolynomial.
067         * @return true if each P in L is squarefree, else false.
068         */
069        public boolean isSquarefree(List<GenPolynomial<C>> L);
070    
071    
072        /**
073         * GenPolynomial squarefree factorization.
074         * @param P GenPolynomial.
075         * @return [p_1 -> e_1, ..., p_k -> e_k] with P = prod_{i=1,...,k} p_i^{e_i}
076         *         and p_i squarefree.
077         */
078        public SortedMap<GenPolynomial<C>, Long> squarefreeFactors(GenPolynomial<C> P);
079    
080    
081        /**
082         * GenPolynomial is (squarefree) factorization.
083         * @param P GenPolynomial.
084         * @param F = [p_1,...,p_k].
085         * @return true if P = prod_{i=1,...,r} p_i, else false.
086         */
087        public boolean isFactorization(GenPolynomial<C> P, List<GenPolynomial<C>> F);
088    
089    
090        /**
091         * GenPolynomial is (squarefree) factorization.
092         * @param P GenPolynomial.
093         * @param F = [p_1 -&gt; e_1, ..., p_k -&gt; e_k].
094         * @return true if P = prod_{i=1,...,k} p_i**e_i, else false.
095         */
096        public boolean isFactorization(GenPolynomial<C> P, SortedMap<GenPolynomial<C>, Long> F);
097    
098    
099        /**
100         * GenPolynomial squarefree and co-prime list.
101         * @param A list of GenPolynomials.
102         * @return B with gcd(b,c) = 1 for all b != c in B and for all non-constant
103         *         a in A there exists b in B with b|a and each b in B is
104         *         squarefree. B does not contain zero or constant polynomials.
105         */
106        public List<GenPolynomial<C>> coPrimeSquarefree(List<GenPolynomial<C>> A);
107    
108    
109        /**
110         * GenPolynomial squarefree and co-prime list.
111         * @param a polynomial.
112         * @param P squarefree co-prime list of GenPolynomials.
113         * @return B with gcd(b,c) = 1 for all b != c in B and for non-constant a
114         *         there exists b in P with b|a. B does not contain zero or constant
115         *         polynomials.
116         */
117        public List<GenPolynomial<C>> coPrimeSquarefree(GenPolynomial<C> a, List<GenPolynomial<C>> P);
118    
119    
120        /**
121         * Test if list of GenPolynomials is squarefree and co-prime.
122         * @param B list of GenPolynomials.
123         * @return true, if for all b != c in B gcd(b,c) = 1 and 
124         *          each b in B is squarefree, else false. 
125         */
126        public boolean isCoPrimeSquarefree(List<GenPolynomial<C>> B);
127    
128    }