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 }