
edu.jas.gb.DReductionSeq Maven / Gradle / Ivy
The newest version!
/*
* $Id: DReductionSeq.java 4059 2012-07-27 11:16:42Z kredel $
*/
package edu.jas.gb;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import edu.jas.poly.ExpVector;
import edu.jas.poly.GenPolynomial;
import edu.jas.poly.GenSolvablePolynomial;
import edu.jas.structure.RingElem;
/**
* Polynomial D-Reduction sequential use algorithm. Implements normalform.
* @param coefficient type
* @author Heinz Kredel
*/
public class DReductionSeq> extends ReductionAbstract implements DReduction {
private static final Logger logger = Logger.getLogger(DReductionSeq.class);
//private final boolean debug = logger.isDebugEnabled();
/**
* Constructor.
*/
public DReductionSeq() {
}
/**
* Is top reducible.
* @param A polynomial.
* @param P polynomial list.
* @return true if A is top reducible with respect to P.
*/
//SuppressWarnings("unchecked") // not jet working
@Override
public boolean isTopReducible(List> P, GenPolynomial A) {
if (P == null || P.isEmpty()) {
return false;
}
if (A == null || A.isZERO()) {
return false;
}
boolean mt = false;
ExpVector e = A.leadingExpVector();
C a = A.leadingBaseCoefficient();
for (GenPolynomial p : P) {
mt = e.multipleOf(p.leadingExpVector());
if (mt) {
C b = p.leadingBaseCoefficient();
C r = a.remainder(b);
mt = r.isZERO();
if (mt) {
return true;
}
}
}
return false;
}
/**
* Is in Normalform.
* @param Ap polynomial.
* @param Pp polynomial list.
* @return true if Ap is in normalform with respect to Pp.
*/
@SuppressWarnings("unchecked")
@Override
public boolean isNormalform(List> Pp, GenPolynomial Ap) {
if (Pp == null || Pp.isEmpty()) {
return true;
}
if (Ap == null || Ap.isZERO()) {
return true;
}
int l;
GenPolynomial[] P;
synchronized (Pp) {
l = Pp.size();
P = new GenPolynomial[l];
//P = Pp.toArray();
for (int i = 0; i < Pp.size(); i++) {
P[i] = Pp.get(i);
}
}
ExpVector[] htl = new ExpVector[l];
C[] lbc = (C[]) new RingElem[l]; // want
GenPolynomial[] p = new GenPolynomial[l];
Map.Entry m;
int i;
int j = 0;
for (i = 0; i < l; i++) {
p[i] = P[i];
m = p[i].leadingMonomial();
if (m != null) {
p[j] = p[i];
htl[j] = m.getKey();
lbc[j] = m.getValue();
j++;
}
}
l = j;
boolean mt = false;
Map Am = Ap.getMap();
for (Map.Entry me : Am.entrySet()) {
ExpVector e = me.getKey();
C a = me.getValue(); //Am.get(e);
for (i = 0; i < l; i++) {
mt = e.multipleOf(htl[i]);
if (mt) {
C r = a.remainder(lbc[i]);
mt = r.isZERO();
if (mt) {
return false;
}
}
}
}
return true;
}
/**
* Normalform using d-reduction.
* @param Ap polynomial.
* @param Pp polynomial list.
* @return d-nf(Ap) with respect to Pp.
*/
@SuppressWarnings("unchecked")
public GenPolynomial normalform(List> Pp, GenPolynomial Ap) {
if (Pp == null || Pp.isEmpty()) {
return Ap;
}
if (Ap == null || Ap.isZERO()) {
return Ap;
}
int l;
GenPolynomial[] P;
synchronized (Pp) {
l = Pp.size();
P = (GenPolynomial[]) new GenPolynomial[l];
//P = Pp.toArray();
for (int i = 0; i < Pp.size(); i++) {
P[i] = Pp.get(i).abs();
}
}
//System.out.println("l = " + l);
Map.Entry m;
ExpVector[] htl = new ExpVector[l];
C[] lbc = (C[]) new RingElem[l]; // want
GenPolynomial[] p = (GenPolynomial[]) new GenPolynomial[l];
int i;
int j = 0;
for (i = 0; i < l; i++) {
p[i] = P[i];
m = p[i].leadingMonomial();
if (m != null) {
p[j] = p[i];
htl[j] = m.getKey();
lbc[j] = m.getValue();
j++;
}
}
l = j;
ExpVector e;
C a;
C r = null;
boolean mt = false;
GenPolynomial R = Ap.ring.getZERO();
GenPolynomial Q = null;
GenPolynomial S = Ap;
while (S.length() > 0) {
m = S.leadingMonomial();
e = m.getKey();
a = m.getValue();
for (i = 0; i < l; i++) {
mt = e.multipleOf(htl[i]);
if (mt) {
r = a.remainder(lbc[i]);
mt = r.isZERO(); // && mt
}
if (mt)
break;
}
if (!mt) {
//logger.debug("irred");
R = R.sum(a, e);
//S = S.subtract( a, e );
S = S.reductum();
//System.out.println(" S = " + S);
} else {
//logger.info("red div = " + e);
ExpVector f = e.subtract(htl[i]);
C b = a.divide(lbc[i]);
R = R.sum(r, e);
Q = p[i].multiply(b, f);
S = S.reductum().subtract(Q.reductum()); // ok also with reductum
}
}
return R.abs();
}
/**
* S-Polynomial.
* @param Ap polynomial.
* @param Bp polynomial.
* @return spol(Ap,Bp) the S-polynomial of Ap and Bp.
*/
@Override
public GenPolynomial SPolynomial(GenPolynomial Ap, GenPolynomial Bp) {
if (logger.isInfoEnabled()) {
if (Bp == null || Bp.isZERO()) {
return Ap.ring.getZERO();
}
if (Ap == null || Ap.isZERO()) {
return Bp.ring.getZERO();
}
if (!Ap.ring.equals(Bp.ring)) {
logger.error("rings not equal");
}
}
Map.Entry ma = Ap.leadingMonomial();
Map.Entry mb = Bp.leadingMonomial();
ExpVector e = ma.getKey();
ExpVector f = mb.getKey();
ExpVector g = e.lcm(f);
ExpVector e1 = g.subtract(e);
ExpVector f1 = g.subtract(f);
C a = ma.getValue();
C b = mb.getValue();
C c = a.gcd(b);
C m = a.multiply(b);
C l = m.divide(c); // = lcm(a,b)
C a1 = l.divide(a);
C b1 = l.divide(b);
GenPolynomial App = Ap.multiply(a1, e1);
GenPolynomial Bpp = Bp.multiply(b1, f1);
GenPolynomial Cp = App.subtract(Bpp);
return Cp;
}
/**
* G-Polynomial.
* @param Ap polynomial.
* @param Bp polynomial.
* @return gpol(Ap,Bp) the g-polynomial of Ap and Bp.
*/
public GenPolynomial GPolynomial(GenPolynomial Ap, GenPolynomial Bp) {
if (logger.isInfoEnabled()) {
if (Bp == null || Bp.isZERO()) {
return Ap.ring.getZERO();
}
if (Ap == null || Ap.isZERO()) {
return Bp.ring.getZERO();
}
if (!Ap.ring.equals(Bp.ring)) {
logger.error("rings not equal");
}
}
Map.Entry ma = Ap.leadingMonomial();
Map.Entry mb = Bp.leadingMonomial();
ExpVector e = ma.getKey();
ExpVector f = mb.getKey();
ExpVector g = e.lcm(f);
ExpVector e1 = g.subtract(e);
ExpVector f1 = g.subtract(f);
C a = ma.getValue();
C b = mb.getValue();
C[] c = a.egcd(b);
//System.out.println("egcd[0] " + c[0]);
GenPolynomial App = Ap.multiply(c[1], e1);
GenPolynomial Bpp = Bp.multiply(c[2], f1);
GenPolynomial Cp = App.sum(Bpp);
return Cp;
}
/**
* D-Polynomial with recording.
* @param S recording matrix, is modified.
* @param i index of Ap in basis list.
* @param Ap a polynomial.
* @param j index of Bp in basis list.
* @param Bp a polynomial.
* @return gpol(Ap, Bp), the g-Polynomial for Ap and Bp.
*/
public GenPolynomial GPolynomial(List> S, int i, GenPolynomial Ap, int j,
GenPolynomial Bp) {
throw new UnsupportedOperationException("not yet implemented");
}
/**
* GB criterium 4. Use only for commutative polynomial rings. This version
* works also for d-Groebner bases.
* @param A polynomial.
* @param B polynomial.
* @param e = lcm(ht(A),ht(B))
* @return true if the S-polynomial(i,j) is required, else false.
*/
@Override
public boolean criterion4(GenPolynomial A, GenPolynomial B, ExpVector e) {
if (logger.isInfoEnabled()) {
if (!A.ring.equals(B.ring)) {
logger.error("rings equal");
}
if (A instanceof GenSolvablePolynomial || B instanceof GenSolvablePolynomial) {
logger.error("GBCriterion4 not applicabable to SolvablePolynomials");
return true;
}
}
ExpVector ei = A.leadingExpVector();
ExpVector ej = B.leadingExpVector();
ExpVector g = ei.sum(ej);
// boolean t = g == e ;
ExpVector h = g.subtract(e);
int s = h.signum();
if (s == 0) { // disjoint ht
C a = A.leadingBaseCoefficient();
C b = B.leadingBaseCoefficient();
C d = a.gcd(b);
if (d.isONE()) { // disjoint hc
//System.out.println("d1 = " + d + ", a = " + a + ", b = " + b);
return false; // can skip pair
}
}
return true; //! ( s == 0 );
}
/**
* GB criterium 4. Use only for commutative polynomial rings. This version
* works also for d-Groebner bases.
* @param A polynomial.
* @param B polynomial.
* @return true if the S-polynomial(i,j) is required, else false.
*/
@Override
public boolean criterion4(GenPolynomial A, GenPolynomial B) {
if (logger.isInfoEnabled()) {
if (A instanceof GenSolvablePolynomial || B instanceof GenSolvablePolynomial) {
logger.error("GBCriterion4 not applicabable to SolvablePolynomials");
return true;
}
}
ExpVector ei = A.leadingExpVector();
ExpVector ej = B.leadingExpVector();
ExpVector g = ei.sum(ej);
ExpVector e = ei.lcm(ej);
// boolean t = g == e ;
ExpVector h = g.subtract(e);
int s = h.signum();
if (s == 0) { // disjoint ht
C a = A.leadingBaseCoefficient();
C b = B.leadingBaseCoefficient();
C d = a.gcd(b);
if (d.isONE()) { // disjoint hc
return false; // can skip pair
}
}
return true; //! ( s == 0 );
}
/**
* Normalform with recording.
* @param row recording matrix, is modified.
* @param Pp a polynomial list for reduction.
* @param Ap a polynomial.
* @return nf(Pp,Ap), the normal form of Ap wrt. Pp.
*/
@SuppressWarnings("unchecked")
public GenPolynomial normalform(List> row, List> Pp,
GenPolynomial Ap) {
if (Pp == null || Pp.isEmpty()) {
return Ap;
}
if (Ap == null || Ap.isZERO()) {
return Ap;
}
throw new UnsupportedOperationException("not yet implemented");
/*
int l = Pp.size();
GenPolynomial[] P = new GenPolynomial[l];
synchronized (Pp) {
//P = Pp.toArray();
for ( int i = 0; i < Pp.size(); i++ ) {
P[i] = Pp.get(i);
}
}
ExpVector[] htl = new ExpVector[ l ];
Object[] lbc = new Object[ l ]; // want
GenPolynomial[] p = new GenPolynomial[ l ];
Map.Entry m;
int j = 0;
int i;
for ( i = 0; i < l; i++ ) {
p[i] = P[i];
m = p[i].leadingMonomial();
if ( m != null ) {
p[j] = p[i];
htl[j] = m.getKey();
lbc[j] = m.getValue();
j++;
}
}
l = j;
ExpVector e;
C a;
boolean mt = false;
GenPolynomial zero = Ap.ring.getZERO();
GenPolynomial R = Ap.ring.getZERO();
GenPolynomial fac = null;
// GenPolynomial T = null;
GenPolynomial Q = null;
GenPolynomial S = Ap;
while ( S.length() > 0 ) {
m = S.leadingMonomial();
e = m.getKey();
a = m.getValue();
for ( i = 0; i < l; i++ ) {
mt = e.multipleOf( htl[i] );
if ( mt ) break;
}
if ( ! mt ) {
//logger.debug("irred");
R = R.sum( a, e );
S = S.subtract( a, e );
// System.out.println(" S = " + S);
//throw new RuntimeException("Syzygy no GB");
} else {
e = e.subtract( htl[i] );
//logger.info("red div = " + e);
C c = (C)lbc[i];
a = a.divide( c );
Q = p[i].multiply( a, e );
S = S.subtract( Q );
fac = row.get(i);
if ( fac == null ) {
fac = zero.sum( a, e );
} else {
fac = fac.sum( a, e );
}
row.set(i,fac);
}
}
return R;
*/
}
/**
* Irreducible set.
* @param Pp polynomial list.
* @return a list P of polynomials which are in normalform wrt. P.
*/
@Override
public List> irreducibleSet(List> Pp) {
ArrayList> P = new ArrayList>();
if (Pp == null) {
return null;
}
for (GenPolynomial a : Pp) {
if (!a.isZERO()) {
P.add(a);
}
}
int l = P.size();
if (l <= 1)
return P;
int irr = 0;
ExpVector e;
ExpVector f;
GenPolynomial a;
logger.debug("irr = ");
while (irr != l) {
a = P.remove(0);
e = a.leadingExpVector();
a = normalform(P, a);
logger.debug(String.valueOf(irr));
if (a.isZERO()) {
l--;
if (l <= 1) {
return P;
}
} else {
f = a.leadingExpVector();
if (e.equals(f)) {
irr++;
} else {
irr = 0;
}
P.add(a);
}
}
//System.out.println();
return P;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy