package jscl.math.polynomial.groebner;
import jscl.math.polynomial.Monomial;
import jscl.math.polynomial.Polynomial;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
class Projection implements Comparable {
final Monomial monomial;
final Polynomial polynomial;
Projection(Pair pair, int index) {
this(pair.scm.divide(pair.monomial[index]), pair.polynomial[index]);
}
Projection(Monomial monomial, Polynomial polynomial) {
this.monomial = monomial;
this.polynomial = polynomial;
}
Monomial scm() {
return polynomial.head().monomial().multiply(monomial);
}
Polynomial mult() {
return polynomial.multiply(monomial);
}
Projection simplify(List list) {
Monomial t = monomial;
if (t.degree() > 0) {
Monomial m = polynomial.head().monomial();
int n = list.size();
for (int i = 0; i < n; i++) {
Collection ideal = ((F4Reduction) list.get(i)).polys;
Iterator it = ideal.iterator();
while (it.hasNext()) {
Polynomial p = (Polynomial) it.next();
Monomial u = p.head().monomial();
if (u.multiple(m, true)) {
u = u.divide(m);
if (t.multiple(u, true)) {
Projection pr = new Projection(t.divide(u), p).simplify(list);
return pr;
}
}
}
}
}
return this;
}
public int compareTo(Projection proj) {
int c = monomial.compareTo(proj.monomial);
if (c < 0) return -1;
else if (c > 0) return 1;
else {
c = polynomial.index() - proj.polynomial.index();
if (c < 0) return -1;
else if (c > 0) return 1;
else return 0;
}
}
public int compareTo(Object o) {
return compareTo((Projection) o);
}
public String toString() {
return "{" + monomial + ", " + polynomial.head().monomial() + "}";
}
}