001/* 002 * $Id$ 003 */ 004 005package edu.jas.application; 006 007 008import java.util.Map; 009import java.util.Set; 010import java.util.SortedMap; 011 012import org.apache.logging.log4j.Logger; 013import org.apache.logging.log4j.LogManager; 014 015import edu.jas.poly.ExpVector; 016import edu.jas.poly.GenSolvablePolynomial; 017import edu.jas.poly.RecSolvablePolynomial; 018import edu.jas.poly.TableRelation; 019import edu.jas.structure.GcdRingElem; 020 021 022/** 023 * LocalSolvablePolynomial generic recursive solvable polynomials implementing 024 * RingElem. n-variate ordered solvable polynomials over solvable polynomial 025 * coefficients. Objects of this class are intended to be immutable. The 026 * implementation is based on TreeMap respectively SortedMap from exponents to 027 * coefficients by extension of GenPolynomial. 028 * Will be deprecated use QLRSolvablePolynomial. 029 * @param <C> coefficient type 030 * @author Heinz Kredel 031 */ 032 033public class LocalSolvablePolynomial<C extends GcdRingElem<C>> extends 034 GenSolvablePolynomial<SolvableLocal<C>> { 035 036 037 /** 038 * The factory for the recursive solvable polynomial ring. Hides super.ring. 039 */ 040 public final LocalSolvablePolynomialRing<C> ring; 041 042 043 private static final Logger logger = LogManager.getLogger(LocalSolvablePolynomial.class); 044 045 046 private static final boolean debug = logger.isDebugEnabled(); 047 048 049 /** 050 * Constructor for zero LocalSolvablePolynomial. 051 * @param r solvable polynomial ring factory. 052 */ 053 public LocalSolvablePolynomial(LocalSolvablePolynomialRing<C> r) { 054 super(r); 055 ring = r; 056 } 057 058 059 /** 060 * Constructor for LocalSolvablePolynomial. 061 * @param r solvable polynomial ring factory. 062 * @param c coefficient polynomial. 063 * @param e exponent. 064 */ 065 public LocalSolvablePolynomial(LocalSolvablePolynomialRing<C> r, SolvableLocal<C> c, ExpVector e) { 066 this(r); 067 if (c != null && !c.isZERO()) { 068 val.put(e, c); 069 } 070 } 071 072 073 /** 074 * Constructor for LocalSolvablePolynomial. 075 * @param r solvable polynomial ring factory. 076 * @param c coefficient polynomial. 077 */ 078 public LocalSolvablePolynomial(LocalSolvablePolynomialRing<C> r, SolvableLocal<C> c) { 079 this(r, c, r.evzero); 080 } 081 082 083 /** 084 * Constructor for LocalSolvablePolynomial. 085 * @param r solvable polynomial ring factory. 086 * @param S solvable polynomial. 087 */ 088 public LocalSolvablePolynomial(LocalSolvablePolynomialRing<C> r, GenSolvablePolynomial<SolvableLocal<C>> S) { 089 this(r, S.getMap()); 090 } 091 092 093 /** 094 * Constructor for LocalSolvablePolynomial. 095 * @param r solvable polynomial ring factory. 096 * @param v the SortedMap of some other (solvable) polynomial. 097 */ 098 protected LocalSolvablePolynomial(LocalSolvablePolynomialRing<C> r, 099 SortedMap<ExpVector, SolvableLocal<C>> v) { 100 this(r); 101 val.putAll(v); // assume no zero coefficients 102 } 103 104 105 /** 106 * Get the corresponding element factory. 107 * @return factory for this Element. 108 * @see edu.jas.structure.Element#factory() 109 */ 110 @Override 111 public LocalSolvablePolynomialRing<C> factory() { 112 return ring; 113 } 114 115 116 /** 117 * Clone this LocalSolvablePolynomial. 118 * @see java.lang.Object#clone() 119 */ 120 @Override 121 public LocalSolvablePolynomial<C> copy() { 122 return new LocalSolvablePolynomial<C>(ring, this.val); 123 } 124 125 126 /** 127 * Comparison with any other object. 128 * @see java.lang.Object#equals(java.lang.Object) 129 */ 130 @Override 131 public boolean equals(Object B) { 132 if (!(B instanceof LocalSolvablePolynomial)) { 133 return false; 134 } 135 return super.equals(B); 136 } 137 138 139 /** 140 * Hash code for this polynomial. 141 * @see java.lang.Object#hashCode() 142 */ 143 @Override 144 public int hashCode() { 145 return super.hashCode(); 146 } 147 148 149 /** 150 * LocalSolvablePolynomial multiplication. 151 * @param Bp LocalSolvablePolynomial. 152 * @return this*Bp, where * denotes solvable multiplication. 153 */ 154 // not @Override 155 public LocalSolvablePolynomial<C> multiply(LocalSolvablePolynomial<C> Bp) { 156 if (Bp == null || Bp.isZERO()) { 157 return ring.getZERO(); 158 } 159 if (this.isZERO()) { 160 return this; 161 } 162 if (Bp.isONE()) { 163 return this; 164 } 165 if (this.isONE()) { 166 return Bp; 167 } 168 assert (ring.nvar == Bp.ring.nvar); 169 if (debug) { 170 logger.debug("ring = " + ring); 171 } 172 //System.out.println("this = " + this + ", Bp = " + Bp); 173 ExpVector Z = ring.evzero; 174 LocalSolvablePolynomial<C> Dp = ring.getZERO().copy(); 175 LocalSolvablePolynomial<C> zero = ring.getZERO().copy(); 176 SolvableLocal<C> one = ring.getONECoefficient(); 177 178 //LocalSolvablePolynomial<C> C1 = null; 179 //LocalSolvablePolynomial<C> C2 = null; 180 Map<ExpVector, SolvableLocal<C>> A = val; 181 Map<ExpVector, SolvableLocal<C>> B = Bp.val; 182 Set<Map.Entry<ExpVector, SolvableLocal<C>>> Bk = B.entrySet(); 183 for (Map.Entry<ExpVector, SolvableLocal<C>> y : A.entrySet()) { 184 SolvableLocal<C> a = y.getValue(); 185 ExpVector e = y.getKey(); 186 if (debug) 187 logger.info("e = " + e + ", a = " + a); 188 //int[] ep = e.dependencyOnVariables(); 189 //int el1 = ring.nvar + 1; 190 //if (ep.length > 0) { 191 // el1 = ep[0]; 192 //} 193 //int el1s = ring.nvar + 1 - el1; 194 for (Map.Entry<ExpVector, SolvableLocal<C>> x : Bk) { 195 SolvableLocal<C> b = x.getValue(); 196 ExpVector f = x.getKey(); 197 if (debug) 198 logger.info("f = " + f + ", b = " + b); 199 int[] fp = f.dependencyOnVariables(); 200 int fl1 = 0; 201 if (fp.length > 0) { 202 fl1 = fp[fp.length - 1]; 203 } 204 int fl1s = ring.nvar + 1 - fl1; 205 // polynomial with coefficient multiplication 206 LocalSolvablePolynomial<C> Cps = ring.getZERO().copy(); 207 //LocalSolvablePolynomial<C> Cs; 208 LocalSolvablePolynomial<C> qp; 209 if (ring.polCoeff.coeffTable.isEmpty() || b.isConstant() || e.isZERO()) { // symmetric 210 Cps = new LocalSolvablePolynomial<C>(ring, b, e); 211 if (debug) 212 logger.info("symmetric coeff: b = " + b + ", e = " + e); 213 } else { // unsymmetric 214 if (debug) 215 logger.info("unsymmetric coeff: b = " + b + ", e = " + e); 216 // compute e * b as ( e * 1/b.den ) * b.num 217 if (b.den.isONE()) { // recursion base 218 // for (Map.Entry<ExpVector, C> z : b.num.getMap().entrySet()) { 219 // C c = z.getValue(); 220 // SolvableLocal<C> cc = b.ring.getONE().multiply(c); 221 // ExpVector g = z.getKey(); 222 // if (debug) 223 // logger.info("g = " + g + ", c = " + c); 224 // int[] gp = g.dependencyOnVariables(); 225 // int gl1 = 0; 226 // if (gp.length > 0) { 227 // gl1 = gp[gp.length - 1]; 228 // } 229 // int gl1s = b.ring.ring.nvar + 1 - gl1; 230 // if (debug) { 231 // logger.info("gl1s = " + gl1s); 232 // } 233 // // split e = e1 * e2, g = g1 * g2 234 // ExpVector e1 = e; 235 // ExpVector e2 = Z; 236 // if (!e.isZERO()) { 237 // e1 = e.subst(el1, 0); 238 // e2 = Z.subst(el1, e.getVal(el1)); 239 // } 240 // ExpVector e4; 241 // ExpVector g1 = g; 242 // ExpVector g2 = Zc; 243 // if (!g.isZERO()) { 244 // g1 = g.subst(gl1, 0); 245 // g2 = Zc.subst(gl1, g.getVal(gl1)); 246 // } 247 // if (debug) 248 // logger.info("coeff, e1 = " + e1 + ", e2 = " + e2); 249 // if (debug) 250 // logger.info("coeff, g1 = " + g1 + ", g2 = " + g2); 251 // TableRelation<GenPolynomial<C>> crel = ring.coeffTable.lookup(e2, g2); 252 // if (debug) 253 // logger.info("coeff, crel = " + crel.p); 254 // if (debug) 255 // logger.info("coeff, e = " + e + " g, = " + g + ", crel = " + crel); 256 // Cs = ring.fromPolyCoefficients(crel.p); //LocalSolvablePolynomial<C>(ring, crel.p); 257 // // rest of multiplication and update relations 258 // if (crel.f != null) { 259 // SolvableLocal<C> c2 = b.ring.getONE().multiply(crel.f); 260 // C2 = new LocalSolvablePolynomial<C>(ring, c2, Z); 261 // Cs = Cs.multiply(C2); 262 // if (crel.e == null) { 263 // e4 = e2; 264 // } else { 265 // e4 = e2.subtract(crel.e); 266 // } 267 // ring.coeffTable.update(e4, g2, ring.toPolyCoefficients(Cs)); 268 // } 269 // if (crel.e != null) { // process left part 270 // C1 = new LocalSolvablePolynomial<C>(ring, one, crel.e); 271 // Cs = C1.multiply(Cs); 272 // ring.coeffTable.update(e2, g2, ring.toPolyCoefficients(Cs)); 273 // } 274 // if (!g1.isZERO()) { // process right part 275 // SolvableLocal<C> c2 = b.ring.getONE().multiply(g1); 276 // C2 = new LocalSolvablePolynomial<C>(ring, c2, Z); 277 // Cs = Cs.multiply(C2); 278 // } 279 // if (!e1.isZERO()) { // process left part 280 // C1 = new LocalSolvablePolynomial<C>(ring, one, e1); 281 // Cs = C1.multiply(Cs); 282 // } 283 // //System.out.println("e1*Cs*g1 = " + Cs); 284 // Cs = Cs.multiplyLeft(cc); // cc * Cs 285 // Cps = (LocalSolvablePolynomial<C>) Cps.sum(Cs); 286 // } // end b.num loop 287 // recursive polynomial coefficient multiplication : e * b.num 288 RecSolvablePolynomial<C> rsp1 = new RecSolvablePolynomial<C>(ring.polCoeff, e); 289 RecSolvablePolynomial<C> rsp2 = new RecSolvablePolynomial<C>(ring.polCoeff, b.num); 290 RecSolvablePolynomial<C> rsp3 = rsp1.multiply(rsp2); 291 LocalSolvablePolynomial<C> rsp = ring.fromPolyCoefficients(rsp3); 292 Cps = rsp; 293 // if (rsp.compareTo(Cps) != 0) { 294 // logger.info("coeff-poly: Cps = " + Cps); 295 // logger.info("coeff-poly: rsp = " + rsp); 296 // //System.out.println("rsp.compareTo(Cps) != 0"); 297 // //} else { 298 // //System.out.println("rsp.compareTo(Cps) == 0"); 299 // } 300 } else { // b.den != 1 301 if (debug) 302 logger.info("coeff-num: Cps = " + Cps + ", num = " + b.num + ", den = " + b.den); 303 Cps = new LocalSolvablePolynomial<C>(ring, b.ring.getONE(), e); 304 305 // coefficient multiplication with 1/den: 306 LocalSolvablePolynomial<C> qv = Cps; 307 SolvableLocal<C> qden = new SolvableLocal<C>(b.ring, b.den); // den/1 308 //System.out.println("qv = " + qv + ", den = " + den); 309 // recursion with den==1: 310 LocalSolvablePolynomial<C> v = qv.multiply(qden); 311 LocalSolvablePolynomial<C> vl = qv.multiplyLeft(qden); 312 //System.out.println("v = " + v + ", vl = " + vl + ", qden = " + qden); 313 LocalSolvablePolynomial<C> vr = (LocalSolvablePolynomial<C>) v.subtract(vl); 314 SolvableLocal<C> qdeni = new SolvableLocal<C>(b.ring, b.ring.ring.getONE(), b.den); 315 //System.out.println("vr = " + vr + ", qdeni = " + qdeni); 316 // recursion with smaller head term: 317 LocalSolvablePolynomial<C> rq = vr.multiply(qdeni); 318 qp = (LocalSolvablePolynomial<C>) qv.subtract(rq); 319 qp = qp.multiplyLeft(qdeni); 320 //System.out.println("qp_i = " + qp); 321 Cps = qp; 322 323 if (!b.num.isONE()) { 324 SolvableLocal<C> qnum = new SolvableLocal<C>(b.ring, b.num); // num/1 325 // recursion with den == 1: 326 Cps = Cps.multiply(qnum); 327 } 328 } 329 } // end coeff 330 if (debug) 331 logger.info("coeff-den: Cps = " + Cps); 332 // polynomial multiplication 333 LocalSolvablePolynomial<C> Dps = ring.getZERO().copy(); 334 LocalSolvablePolynomial<C> Ds = null; 335 LocalSolvablePolynomial<C> D1, D2; 336 if (ring.table.isEmpty() || Cps.isConstant() || f.isZERO()) { // symmetric 337 if (debug) 338 logger.info("symmetric poly: b = " + b + ", e = " + e); 339 ExpVector g = e.sum(f); 340 if (Cps.isConstant()) { 341 Ds = new LocalSolvablePolynomial<C>(ring, Cps.leadingBaseCoefficient(), g); // symmetric! 342 } else { 343 Ds = Cps.shift(f); // symmetric 344 } 345 } else { // eventually unsymmetric 346 if (debug) 347 logger.info("unsymmetric poly: Cps = " + Cps + ", f = " + f); 348 for (Map.Entry<ExpVector, SolvableLocal<C>> z : Cps.val.entrySet()) { 349 // split g = g1 * g2, f = f1 * f2 350 SolvableLocal<C> c = z.getValue(); 351 ExpVector g = z.getKey(); 352 if (debug) 353 logger.info("g = " + g + ", c = " + c); 354 int[] gp = g.dependencyOnVariables(); 355 int gl1 = ring.nvar + 1; 356 if (gp.length > 0) { 357 gl1 = gp[0]; 358 } 359 int gl1s = ring.nvar + 1 - gl1; 360 if (gl1s <= fl1s) { // symmetric 361 ExpVector h = g.sum(f); 362 if (debug) 363 logger.info("disjoint poly: g = " + g + ", f = " + f + ", h = " + h); 364 Ds = (LocalSolvablePolynomial<C>) zero.sum(one, h); // symmetric! 365 } else { 366 ExpVector g1 = g.subst(gl1, 0); 367 ExpVector g2 = Z.subst(gl1, g.getVal(gl1)); // bug el1, gl1 368 ExpVector g4; 369 ExpVector f1 = f.subst(fl1, 0); 370 ExpVector f2 = Z.subst(fl1, f.getVal(fl1)); 371 if (debug) { 372 logger.info("poly, g1 = " + g1 + ", f1 = " + f1 + ", Dps = " + Dps); 373 logger.info("poly, g2 = " + g2 + ", f2 = " + f2); 374 } 375 TableRelation<SolvableLocal<C>> rel = ring.table.lookup(g2, f2); 376 if (debug) 377 logger.info("poly, g = " + g + ", f = " + f + ", rel = " + rel); 378 Ds = new LocalSolvablePolynomial<C>(ring, rel.p); //ring.copy(rel.p); 379 if (rel.f != null) { 380 D2 = new LocalSolvablePolynomial<C>(ring, one, rel.f); 381 Ds = Ds.multiply(D2); 382 if (rel.e == null) { 383 g4 = g2; 384 } else { 385 g4 = g2.subtract(rel.e); 386 } 387 ring.table.update(g4, f2, Ds); 388 } 389 if (rel.e != null) { 390 D1 = new LocalSolvablePolynomial<C>(ring, one, rel.e); 391 Ds = D1.multiply(Ds); 392 ring.table.update(g2, f2, Ds); 393 } 394 if (!f1.isZERO()) { 395 D2 = new LocalSolvablePolynomial<C>(ring, one, f1); 396 Ds = Ds.multiply(D2); 397 //ring.table.update(?,f1,Ds) 398 } 399 if (!g1.isZERO()) { 400 D1 = new LocalSolvablePolynomial<C>(ring, one, g1); 401 Ds = D1.multiply(Ds); 402 //ring.table.update(e1,?,Ds) 403 } 404 } 405 Ds = Ds.multiplyLeft(c); // c * Ds 406 Dps = (LocalSolvablePolynomial<C>) Dps.sum(Ds); 407 } // end Dps loop 408 Ds = Dps; 409 } 410 Ds = Ds.multiplyLeft(a); // multiply(a,b); // non-symmetric 411 if (debug) 412 logger.debug("Ds = " + Ds); 413 Dp = (LocalSolvablePolynomial<C>) Dp.sum(Ds); 414 } // end B loop 415 } // end A loop 416 //System.out.println("this * Bp = " + Dp); 417 return Dp; 418 } 419 420 421 /** 422 * LocalSolvablePolynomial left and right multiplication. Product with two 423 * polynomials. 424 * @param S LocalSolvablePolynomial. 425 * @param T LocalSolvablePolynomial. 426 * @return S*this*T. 427 */ 428 // not @Override 429 public LocalSolvablePolynomial<C> multiply(LocalSolvablePolynomial<C> S, LocalSolvablePolynomial<C> T) { 430 if (S.isZERO() || T.isZERO() || this.isZERO()) { 431 return ring.getZERO(); 432 } 433 if (S.isONE()) { 434 return multiply(T); 435 } 436 if (T.isONE()) { 437 return S.multiply(this); 438 } 439 return S.multiply(this).multiply(T); 440 } 441 442 443 /** 444 * LocalSolvablePolynomial multiplication. Product with coefficient ring 445 * element. 446 * @param b solvable coefficient. 447 * @return this*b, where * is coefficient multiplication. 448 */ 449 @Override 450 public LocalSolvablePolynomial<C> multiply(SolvableLocal<C> b) { 451 LocalSolvablePolynomial<C> Cp = ring.getZERO().copy(); 452 if (b == null || b.isZERO()) { 453 return Cp; 454 } 455 if (b.isONE()) { 456 return this; 457 } 458 Cp = new LocalSolvablePolynomial<C>(ring, b, ring.evzero); 459 return multiply(Cp); 460 } 461 462 463 /** 464 * LocalSolvablePolynomial left and right multiplication. Product with 465 * coefficient ring element. 466 * @param b coefficient polynomial. 467 * @param c coefficient polynomial. 468 * @return b*this*c, where * is coefficient multiplication. 469 */ 470 @Override 471 public LocalSolvablePolynomial<C> multiply(SolvableLocal<C> b, SolvableLocal<C> c) { 472 LocalSolvablePolynomial<C> Cp = ring.getZERO().copy(); 473 if (b == null || b.isZERO()) { 474 return Cp; 475 } 476 if (c == null || c.isZERO()) { 477 return Cp; 478 } 479 if (b.isONE() && c.isONE()) { 480 return this; 481 } 482 Cp = new LocalSolvablePolynomial<C>(ring, b, ring.evzero); 483 LocalSolvablePolynomial<C> Dp = new LocalSolvablePolynomial<C>(ring, c, ring.evzero); 484 return multiply(Cp, Dp); 485 } 486 487 488 /** 489 * LocalSolvablePolynomial multiplication. Product with exponent vector. 490 * @param e exponent. 491 * @return this * x<sup>e</sup>, where * denotes solvable multiplication. 492 */ 493 @Override 494 public LocalSolvablePolynomial<C> multiply(ExpVector e) { 495 if (e == null || e.isZERO()) { 496 return this; 497 } 498 SolvableLocal<C> b = ring.getONECoefficient(); 499 return multiply(b, e); 500 } 501 502 503 /** 504 * LocalSolvablePolynomial left and right multiplication. Product with 505 * exponent vector. 506 * @param e exponent. 507 * @param f exponent. 508 * @return x<sup>e</sup> * this * x<sup>f</sup>, where * denotes solvable 509 * multiplication. 510 */ 511 @Override 512 public LocalSolvablePolynomial<C> multiply(ExpVector e, ExpVector f) { 513 if (e == null || e.isZERO()) { 514 return this; 515 } 516 if (f == null || f.isZERO()) { 517 return this; 518 } 519 SolvableLocal<C> b = ring.getONECoefficient(); 520 return multiply(b, e, b, f); 521 } 522 523 524 /** 525 * LocalSolvablePolynomial multiplication. Product with ring element and 526 * exponent vector. 527 * @param b coefficient polynomial. 528 * @param e exponent. 529 * @return this * b x<sup>e</sup>, where * denotes solvable multiplication. 530 */ 531 @Override 532 public LocalSolvablePolynomial<C> multiply(SolvableLocal<C> b, ExpVector e) { 533 if (b == null || b.isZERO()) { 534 return ring.getZERO(); 535 } 536 if (b.isONE() && e.isZERO()) { 537 return this; 538 } 539 LocalSolvablePolynomial<C> Cp = new LocalSolvablePolynomial<C>(ring, b, e); 540 return multiply(Cp); 541 } 542 543 544 /** 545 * LocalSolvablePolynomial left and right multiplication. Product with ring 546 * element and exponent vector. 547 * @param b coefficient polynomial. 548 * @param e exponent. 549 * @param c coefficient polynomial. 550 * @param f exponent. 551 * @return b x<sup>e</sup> * this * c x<sup>f</sup>, where * denotes 552 * solvable multiplication. 553 */ 554 @Override 555 public LocalSolvablePolynomial<C> multiply(SolvableLocal<C> b, ExpVector e, SolvableLocal<C> c, 556 ExpVector f) { 557 if (b == null || b.isZERO()) { 558 return ring.getZERO(); 559 } 560 if (c == null || c.isZERO()) { 561 return ring.getZERO(); 562 } 563 if (b.isONE() && e.isZERO() && c.isONE() && f.isZERO()) { 564 return this; 565 } 566 LocalSolvablePolynomial<C> Cp = new LocalSolvablePolynomial<C>(ring, b, e); 567 LocalSolvablePolynomial<C> Dp = new LocalSolvablePolynomial<C>(ring, c, f); 568 return multiply(Cp, Dp); 569 } 570 571 572 /** 573 * LocalSolvablePolynomial multiplication. Left product with ring element 574 * and exponent vector. 575 * @param b coefficient polynomial. 576 * @param e exponent. 577 * @return b x<sup>e</sup> * this, where * denotes solvable multiplication. 578 */ 579 @Override 580 public LocalSolvablePolynomial<C> multiplyLeft(SolvableLocal<C> b, ExpVector e) { 581 if (b == null || b.isZERO()) { 582 return ring.getZERO(); 583 } 584 LocalSolvablePolynomial<C> Cp = new LocalSolvablePolynomial<C>(ring, b, e); 585 return Cp.multiply(this); 586 } 587 588 589 /** 590 * LocalSolvablePolynomial multiplication. Left product with exponent 591 * vector. 592 * @param e exponent. 593 * @return x<sup>e</sup> * this, where * denotes solvable multiplication. 594 */ 595 @Override 596 public LocalSolvablePolynomial<C> multiplyLeft(ExpVector e) { 597 if (e == null || e.isZERO()) { 598 return this; 599 } 600 SolvableLocal<C> b = ring.getONECoefficient(); 601 LocalSolvablePolynomial<C> Cp = new LocalSolvablePolynomial<C>(ring, b, e); 602 return Cp.multiply(this); 603 } 604 605 606 /** 607 * LocalSolvablePolynomial multiplication. Left product with coefficient 608 * ring element. 609 * @param b coefficient polynomial. 610 * @return b*this, where * is coefficient multiplication. 611 */ 612 @Override 613 public LocalSolvablePolynomial<C> multiplyLeft(SolvableLocal<C> b) { 614 LocalSolvablePolynomial<C> Cp = ring.getZERO().copy(); 615 if (b == null || b.isZERO()) { 616 return Cp; 617 } 618 Map<ExpVector, SolvableLocal<C>> Cm = Cp.val; //getMap(); 619 Map<ExpVector, SolvableLocal<C>> Am = val; 620 SolvableLocal<C> c; 621 for (Map.Entry<ExpVector, SolvableLocal<C>> y : Am.entrySet()) { 622 ExpVector e = y.getKey(); 623 SolvableLocal<C> a = y.getValue(); 624 c = b.multiply(a); 625 if (!c.isZERO()) { 626 Cm.put(e, c); 627 } 628 } 629 return Cp; 630 } 631 632 633 /** 634 * LocalSolvablePolynomial multiplication. Left product with 'monomial'. 635 * @param m 'monomial'. 636 * @return m * this, where * denotes solvable multiplication. 637 */ 638 @Override 639 public LocalSolvablePolynomial<C> multiplyLeft(Map.Entry<ExpVector, SolvableLocal<C>> m) { 640 if (m == null) { 641 return ring.getZERO(); 642 } 643 return multiplyLeft(m.getValue(), m.getKey()); 644 } 645 646 647 /** 648 * LocalSolvablePolynomial multiplication. Product with 'monomial'. 649 * @param m 'monomial'. 650 * @return this * m, where * denotes solvable multiplication. 651 */ 652 @Override 653 public LocalSolvablePolynomial<C> multiply(Map.Entry<ExpVector, SolvableLocal<C>> m) { 654 if (m == null) { 655 return ring.getZERO(); 656 } 657 return multiply(m.getValue(), m.getKey()); 658 } 659 660 661 /** 662 * LocalSolvablePolynomial multiplication. Left product with coefficient 663 * ring element. 664 * @param f exponent vector. 665 * @return B*f, where * is commutative multiplication. 666 */ 667 protected LocalSolvablePolynomial<C> shift(ExpVector f) { 668 LocalSolvablePolynomial<C> C = ring.getZERO().copy(); 669 if (this.isZERO()) { 670 return C; 671 } 672 if (f == null || f.isZERO()) { 673 return this; 674 } 675 Map<ExpVector, SolvableLocal<C>> Cm = C.val; 676 Map<ExpVector, SolvableLocal<C>> Bm = this.val; 677 for (Map.Entry<ExpVector, SolvableLocal<C>> y : Bm.entrySet()) { 678 ExpVector e = y.getKey(); 679 SolvableLocal<C> a = y.getValue(); 680 ExpVector d = e.sum(f); 681 if (!a.isZERO()) { 682 Cm.put(d, a); 683 } 684 } 685 return C; 686 } 687 688}