001    /*
002     * $Id: FactorsList.java 2754 2009-07-16 19:40:51Z kredel $
003     */
004    
005    package edu.jas.ufd;
006    
007    
008    import java.io.Serializable;
009    import java.util.List;
010    
011    import edu.jas.poly.AlgebraicNumberRing;
012    import edu.jas.poly.GenPolynomial;
013    import edu.jas.structure.GcdRingElem;
014    
015    
016    /**
017     * Container for the factors of a squarefree factorization.
018     * @author Heinz Kredel
019     * @param <C> coefficient type
020     */
021    
022    public class FactorsList<C extends GcdRingElem<C>> implements Serializable {
023    
024    
025        /**
026         * Original polynomial to be factored with coefficients from C.
027         */
028        public final GenPolynomial<C> poly;
029    
030    
031        /**
032         * List of factors with coefficients from C.
033         */
034        public final List<GenPolynomial<C>> factors;
035    
036    
037        /**
038         * List of factors with coefficients from AlgebraicNumberRings.
039         */
040        public final List<Factors<C>> afactors;
041    
042    
043        /**
044         * Constructor.
045         * @param p given GenPolynomial over C.
046         * @param list irreducible factors of p with coefficients from C.
047         */
048        public FactorsList(GenPolynomial<C> p, List<GenPolynomial<C>> list) {
049            this(p, list, null);
050        }
051    
052    
053        /**
054         * Constructor.
055         * @param p given GenPolynomial over C.
056         * @param list irreducible factors of p with coefficients from C.
057         * @param alist irreducible factors of p with coefficients from an algebraic
058         *            number field.
059         */
060        public FactorsList(GenPolynomial<C> p, List<GenPolynomial<C>> list, List<Factors<C>> alist) {
061            poly = p;
062            factors = list;
063            afactors = alist;
064        }
065    
066    
067        /**
068         * Get the String representation.
069         * @see java.lang.Object#toString()
070         */
071        @Override
072        public String toString() {
073            StringBuffer sb = new StringBuffer();
074            //sb.append(poly.toString());
075            //sb.append(" =\n");
076            boolean first = true;
077            for (GenPolynomial<C> p : factors) {
078                if (first) {
079                    first = false;
080                } else {
081                    sb.append(",\n ");
082                }
083                sb.append(p.toString());
084            }
085            if (afactors == null) {
086                return sb.toString();
087            }
088            for (Factors<C> f : afactors) {
089                if (first) {
090                    first = false;
091                } else {
092                    sb.append(",\n ");
093                }
094                sb.append(f.toString());
095            }
096            return sb.toString();
097        }
098    
099    
100        /**
101         * Get a scripting compatible string representation.
102         * @return script compatible representation for this container.
103         * @see edu.jas.structure.ElemFactory#toScript()
104         */
105        public String toScript() {
106            // Python case
107            StringBuffer sb = new StringBuffer();
108            sb.append(poly.toScript());
109            sb.append(" =\n");
110            boolean first = true;
111            for (GenPolynomial<C> p : factors) {
112                if (first) {
113                    first = false;
114                } else {
115                    sb.append("\n * ");
116                }
117                sb.append(p.toScript());
118            }
119            if (afactors == null) {
120                return sb.toString();
121            }
122            for (Factors<C> f : afactors) {
123                if (first) {
124                    first = false;
125                } else {
126                    sb.append("\n * ");
127                }
128                sb.append(f.toScript());
129            }
130            return sb.toString();
131        }
132    
133    
134        /**
135         * Find largest extension field.
136         * @return largest extension field or null if no extension field
137         */
138        public AlgebraicNumberRing<C> findExtensionField() {
139            if (afactors == null) {
140                return null;
141            }
142            AlgebraicNumberRing<C> ar = null;
143            int depth = 0;
144            for (Factors<C> f : afactors) {
145                AlgebraicNumberRing<C> aring = f.findExtensionField();
146                if (aring == null) {
147                    continue;
148                }
149                int d = aring.depth();
150                if (d > depth) {
151                    depth = d;
152                    ar = aring;
153                }
154            }
155            return ar;
156        }
157    
158    }