001    /*
002     * $Id: FactorsMap.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.SortedMap;
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 eventually non-squarefree factorization.
018     * @author Heinz Kredel
019     * @param <C> coefficient type
020     */
021    
022    public class FactorsMap<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 SortedMap<GenPolynomial<C>, Long> factors;
035    
036    
037        /**
038         * List of factors with coefficients from AlgebraicNumberRings.
039         */
040        public final SortedMap<Factors<C>, Long> afactors;
041    
042    
043        /**
044         * Constructor.
045         * @param p given GenPolynomial over C.
046         * @param map irreducible factors of p with coefficients from C.
047         */
048        public FactorsMap(GenPolynomial<C> p, SortedMap<GenPolynomial<C>, Long> map) {
049            this(p, map, null);
050        }
051    
052    
053        /**
054         * Constructor.
055         * @param p given GenPolynomial over C.
056         * @param map irreducible factors of p with coefficients from C.
057         * @param amap irreducible factors of p with coefficients from an algebraic
058         *            number field.
059         */
060        public FactorsMap(GenPolynomial<C> p, SortedMap<GenPolynomial<C>, Long> map,
061                SortedMap<Factors<C>, Long> amap) {
062            poly = p;
063            factors = map;
064            afactors = amap;
065        }
066    
067    
068        /**
069         * Get the String representation.
070         * @see java.lang.Object#toString()
071         */
072        @Override
073        public String toString() {
074            StringBuffer sb = new StringBuffer();
075            sb.append(poly.toString());
076            sb.append(" =\n");
077            boolean first = true;
078            for (GenPolynomial<C> p : factors.keySet()) {
079                if (first) {
080                    first = false;
081                } else {
082                    sb.append(",\n ");
083                }
084                sb.append(p.toString());
085                long e = factors.get(p);
086                if (e > 1) {
087                    sb.append("**" + e);
088                }
089            }
090            if (afactors == null) {
091                return sb.toString();
092            }
093            for (Factors<C> f : afactors.keySet()) {
094                if (first) {
095                    first = false;
096                } else {
097                    sb.append(",\n ");
098                }
099                sb.append(f.toString());
100                Long e = afactors.get(f);
101                if ( e == null ) {
102                    continue;
103                }
104                if (e > 1) {
105                    sb.append("**" + e);
106                }
107            }
108            return sb.toString();
109        }
110    
111    
112        /**
113         * Get a scripting compatible string representation.
114         * @return script compatible representation for this container.
115         * @see edu.jas.structure.ElemFactory#toScript()
116         */
117        public String toScript() {
118            // Python case
119            StringBuffer sb = new StringBuffer();
120            //sb.append(poly.toScript());
121            //sb.append(" =\n");
122            boolean first = true;
123            for (GenPolynomial<C> p : factors.keySet()) {
124                if (first) {
125                    first = false;
126                } else {
127                    sb.append("\n * ");
128                }
129                sb.append(p.toScript());
130                long e = factors.get(p);
131                if (e > 1) {
132                    sb.append("**" + e);
133                }
134            }
135            if (afactors == null) {
136                return sb.toString();
137            }
138            for (Factors<C> f : afactors.keySet()) {
139                if (first) {
140                    first = false;
141                } else {
142                    sb.append("\n * ");
143                }
144                Long e = afactors.get(f);
145                if ( e == null ) { // should not happen
146                    System.out.println("f = " + f);
147                    System.out.println("afactors = " + afactors);
148                }
149                if (e == 1) {
150                    sb.append(f.toScript());
151                } else {
152                    sb.append("(\n");
153                    sb.append(f.toScript());
154                    sb.append("\n)**" + e);
155                }
156            }
157            return sb.toString();
158        }
159    
160    
161        /**
162         * Find largest extension field.
163         * @return largest extension field or null if no extension field
164         */
165        public AlgebraicNumberRing<C> findExtensionField() {
166            if (afactors == null) {
167                return null;
168            }
169            AlgebraicNumberRing<C> ar = null;
170            int depth = 0;
171            for (Factors<C> f : afactors.keySet()) {
172                AlgebraicNumberRing<C> aring = f.findExtensionField();
173                if (aring == null) {
174                    continue;
175                }
176                int d = aring.depth();
177                if (d > depth) {
178                    depth = d;
179                    ar = aring;
180                }
181            }
182            return ar;
183        }
184    
185    }