001 /* 002 * $Id: SolvableReductionSeq.java 3296 2010-08-26 17:30:55Z kredel $ 003 */ 004 005 package edu.jas.gb; 006 007 008 import java.util.List; 009 import java.util.Map; 010 011 import edu.jas.poly.ExpVector; 012 import edu.jas.poly.GenSolvablePolynomial; 013 import edu.jas.structure.RingElem; 014 015 016 /** 017 * Solvable polynomial Reduction algorithm. Implements left, right normalform. 018 * @param <C> coefficient type 019 * @author Heinz Kredel 020 */ 021 022 public class SolvableReductionSeq<C extends RingElem<C>> extends SolvableReductionAbstract<C> { 023 024 025 //private static final Logger logger = Logger.getLogger(SolvableReductionSeq.class); 026 027 028 /** 029 * Constructor. 030 */ 031 public SolvableReductionSeq() { 032 } 033 034 035 /** 036 * Left Normalform. 037 * @param Ap solvable polynomial. 038 * @param Pp solvable polynomial list. 039 * @return left-nf(Ap) with respect to Pp. 040 */ 041 public GenSolvablePolynomial<C> leftNormalform(List<GenSolvablePolynomial<C>> Pp, 042 GenSolvablePolynomial<C> Ap) { 043 if (Pp == null || Pp.isEmpty()) { 044 return Ap; 045 } 046 if (Ap == null || Ap.isZERO()) { 047 return Ap; 048 } 049 int l; 050 Map.Entry<ExpVector, C> m; 051 GenSolvablePolynomial<C>[] P; 052 synchronized (Pp) { 053 l = Pp.size(); 054 P = (GenSolvablePolynomial<C>[]) new GenSolvablePolynomial[l]; 055 //P = Pp.toArray(); 056 for (int j = 0; j < Pp.size(); j++) { 057 P[j] = Pp.get(j); 058 } 059 } 060 int i; 061 ExpVector[] htl = new ExpVector[l]; 062 Object[] lbc = new Object[l]; // want <C> 063 GenSolvablePolynomial<C>[] p = new GenSolvablePolynomial[l]; 064 int j = 0; 065 for (i = 0; i < l; i++) { 066 p[i] = P[i]; 067 m = p[i].leadingMonomial(); 068 if (m != null) { 069 p[j] = p[i]; 070 htl[j] = m.getKey(); 071 lbc[j] = m.getValue(); 072 j++; 073 } 074 } 075 l = j; 076 ExpVector e; 077 C a; 078 boolean mt = false; 079 GenSolvablePolynomial<C> R = Ap.ring.getZERO(); 080 081 //GenSolvablePolynomial<C> T = null; 082 GenSolvablePolynomial<C> Q = null; 083 GenSolvablePolynomial<C> S = Ap; 084 while (S.length() > 0) { 085 m = S.leadingMonomial(); 086 e = m.getKey(); 087 //logger.info("red = " + e); 088 a = m.getValue(); 089 for (i = 0; i < l; i++) { 090 mt = e.multipleOf(htl[i]); 091 if (mt) 092 break; 093 } 094 if (!mt) { 095 //logger.debug("irred"); 096 //T = new OrderedMapPolynomial( a, e ); 097 R = (GenSolvablePolynomial<C>) R.sum(a, e); 098 S = (GenSolvablePolynomial<C>) S.subtract(a, e); 099 // System.out.println(" S = " + S); 100 } else { 101 //logger.debug("red"); 102 e = e.subtract(htl[i]); 103 //a = a.divide( (C)lbc[i] ); 104 Q = p[i].multiplyLeft(e); 105 a = a.divide(Q.leadingBaseCoefficient()); 106 Q = Q.multiplyLeft(a); 107 S = (GenSolvablePolynomial<C>) S.subtract(Q); 108 } 109 } 110 return R; 111 } 112 113 114 /** 115 * LeftNormalform with recording. 116 * @param row recording matrix, is modified. 117 * @param Pp a polynomial list for reduction. 118 * @param Ap a polynomial. 119 * @return nf(Pp,Ap), the left normal form of Ap wrt. Pp. 120 */ 121 public GenSolvablePolynomial<C> leftNormalform(List<GenSolvablePolynomial<C>> row, 122 List<GenSolvablePolynomial<C>> Pp, GenSolvablePolynomial<C> Ap) { 123 if (Pp == null || Pp.isEmpty()) { 124 return Ap; 125 } 126 if (Ap == null || Ap.isZERO()) { 127 return Ap; 128 } 129 int l = Pp.size(); 130 GenSolvablePolynomial<C>[] P = (GenSolvablePolynomial<C>[]) new GenSolvablePolynomial[l]; 131 synchronized (Pp) { 132 //P = Pp.toArray(); 133 for (int i = 0; i < Pp.size(); i++) { 134 P[i] = Pp.get(i); 135 } 136 } 137 ExpVector[] htl = new ExpVector[l]; 138 Object[] lbc = new Object[l]; // want <C> 139 GenSolvablePolynomial<C>[] p = (GenSolvablePolynomial<C>[]) new GenSolvablePolynomial[l]; 140 Map.Entry<ExpVector, C> m; 141 int j = 0; 142 int i; 143 for (i = 0; i < l; i++) { 144 p[i] = P[i]; 145 m = p[i].leadingMonomial(); 146 if (m != null) { 147 p[j] = p[i]; 148 htl[j] = m.getKey(); 149 lbc[j] = m.getValue(); 150 j++; 151 } 152 } 153 l = j; 154 ExpVector e; 155 C a; 156 boolean mt = false; 157 GenSolvablePolynomial<C> zero = Ap.ring.getZERO(); 158 GenSolvablePolynomial<C> R = Ap.ring.getZERO(); 159 160 GenSolvablePolynomial<C> fac = null; 161 // GenSolvablePolynomial<C> T = null; 162 GenSolvablePolynomial<C> Q = null; 163 GenSolvablePolynomial<C> S = Ap; 164 while (S.length() > 0) { 165 m = S.leadingMonomial(); 166 e = m.getKey(); 167 a = m.getValue(); 168 for (i = 0; i < l; i++) { 169 mt = e.multipleOf(htl[i]); 170 if (mt) 171 break; 172 } 173 if (!mt) { 174 //logger.debug("irred"); 175 R = (GenSolvablePolynomial<C>) R.sum(a, e); 176 S = (GenSolvablePolynomial<C>) S.subtract(a, e); 177 // System.out.println(" S = " + S); 178 // throw new RuntimeException("Syzygy no leftGB"); 179 } else { 180 e = e.subtract(htl[i]); 181 //logger.info("red div = " + e); 182 //a = a.divide( (C)lbc[i] ); 183 //Q = p[i].multiplyLeft( a, e ); 184 Q = p[i].multiplyLeft(e); 185 a = a.divide(Q.leadingBaseCoefficient()); 186 Q = Q.multiply(a); 187 S = (GenSolvablePolynomial<C>) S.subtract(Q); 188 fac = row.get(i); 189 if (fac == null) { 190 fac = (GenSolvablePolynomial<C>) zero.sum(a, e); 191 } else { 192 fac = (GenSolvablePolynomial<C>) fac.sum(a, e); 193 } 194 row.set(i, fac); 195 } 196 } 197 return R; 198 } 199 200 201 /** 202 * Right Normalform. 203 * @param Ap solvable polynomial. 204 * @param Pp solvable polynomial list. 205 * @return right-nf(Ap) with respect to Pp. 206 */ 207 public GenSolvablePolynomial<C> rightNormalform(List<GenSolvablePolynomial<C>> Pp, 208 GenSolvablePolynomial<C> Ap) { 209 if (Pp == null || Pp.isEmpty()) { 210 return Ap; 211 } 212 if (Ap == null || Ap.isZERO()) { 213 return Ap; 214 } 215 int l; 216 Map.Entry<ExpVector, C> m; 217 GenSolvablePolynomial<C>[] P; 218 synchronized (Pp) { 219 l = Pp.size(); 220 P = (GenSolvablePolynomial<C>[]) new GenSolvablePolynomial[l]; 221 //P = Pp.toArray(); 222 for (int j = 0; j < Pp.size(); j++) { 223 P[j] = Pp.get(j); 224 } 225 } 226 int i; 227 ExpVector[] htl = new ExpVector[l]; 228 Object[] lbc = new Object[l]; // want <C> 229 GenSolvablePolynomial<C>[] p = (GenSolvablePolynomial<C>[]) new GenSolvablePolynomial[l]; 230 int j = 0; 231 for (i = 0; i < l; i++) { 232 p[i] = P[i]; 233 m = p[i].leadingMonomial(); 234 if (m != null) { 235 p[j] = p[i]; 236 htl[j] = m.getKey(); 237 lbc[j] = m.getValue(); 238 j++; 239 } 240 } 241 l = j; 242 ExpVector e; 243 C a; 244 boolean mt = false; 245 GenSolvablePolynomial<C> R = Ap.ring.getZERO(); 246 247 //GenSolvablePolynomial<C> T = null; 248 GenSolvablePolynomial<C> Q = null; 249 GenSolvablePolynomial<C> S = Ap; 250 while (S.length() > 0) { 251 m = S.leadingMonomial(); 252 e = m.getKey(); 253 //logger.info("red = " + e); 254 a = m.getValue(); 255 for (i = 0; i < l; i++) { 256 mt = e.multipleOf(htl[i]); 257 if (mt) 258 break; 259 } 260 if (!mt) { 261 //logger.debug("irred"); 262 //T = new OrderedMapPolynomial( a, e ); 263 R = (GenSolvablePolynomial<C>) R.sum(a, e); 264 S = (GenSolvablePolynomial<C>) S.subtract(a, e); 265 // System.out.println(" S = " + S); 266 } else { 267 //logger.debug("red"); 268 e = e.subtract(htl[i]); 269 //a = a.divide( (C)lbc[i] ); 270 Q = p[i].multiply(e); 271 a = a.divide(Q.leadingBaseCoefficient()); 272 Q = Q.multiply(a); 273 S = (GenSolvablePolynomial<C>) S.subtract(Q); 274 } 275 } 276 return R; 277 } 278 279 }