/*
* $Id$
*/
package edu.jas.gb;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import edu.jas.poly.GenWordPolynomial;
import edu.jas.poly.Overlap;
import edu.jas.poly.OverlapList;
import edu.jas.poly.Word;
import edu.jas.structure.RingElem;
/**
* Polynomial word reduction abstract class. Implements common S-Polynomial,
* normalform, module criterion and irreducible set.
* @param coefficient type
* @author Heinz Kredel
*/
public abstract class WordReductionAbstract> implements WordReduction {
private static final Logger logger = Logger.getLogger(WordReductionAbstract.class);
//private final boolean debug = logger.isDebugEnabled();
/**
* Constructor.
*/
public WordReductionAbstract() {
}
/**
* S-Polynomials of non-commutative polynomials.
* @param Ap word polynomial.
* @param Bp word polynomial.
* @return list of all spol(Ap,Bp) the S-polynomials of Ap and Bp.
*/
public List> SPolynomials(GenWordPolynomial Ap, GenWordPolynomial Bp) {
List> sp = new ArrayList>();
Map.Entry ma = Ap.leadingMonomial();
Map.Entry mb = Bp.leadingMonomial();
Word e = ma.getKey();
Word f = mb.getKey();
C a = ma.getValue();
C b = mb.getValue();
OverlapList oll = e.overlap(f);
if (oll.ols.isEmpty()) {
return sp;
}
for (Overlap ol : oll.ols) {
GenWordPolynomial s = SPolynomial(ol, b, Ap, a, Bp);
sp.add(s);
}
return sp;
}
/**
* S-Polynomials of non-commutative polynomials.
* @param a leading base coefficient of B.
* @param l1 word.
* @param A word polynomial.
* @param r1 word.
* @param b leading base coefficient of A.
* @param l2 word.
* @param B word polynomial.
* @param r2 word.
* @return list of all spol(Ap,Bp) the S-polynomials of Ap and Bp.
*/
public GenWordPolynomial SPolynomial(C a, Word l1, GenWordPolynomial A, Word r1, C b, Word l2,
GenWordPolynomial B, Word r2) {
C one = A.ring.coFac.getONE();
GenWordPolynomial s1 = A.multiply(a, l1, one, r1);
GenWordPolynomial s2 = B.multiply(b, l2, one, r2);
GenWordPolynomial s = s1.subtract(s2);
return s;
}
/**
* S-Polynomials of non-commutative polynomials.
* @param ol Overlap tuple.
* @param a leading base coefficient of B.
* @param A word polynomial.
* @param b leading base coefficient of A.
* @param B word polynomial.
* @return list of all spol(Ap,Bp) the S-polynomials of Ap and Bp.
*/
public GenWordPolynomial SPolynomial(Overlap ol, C a, GenWordPolynomial A, C b,
GenWordPolynomial B) {
C one = A.ring.coFac.getONE();
GenWordPolynomial s1 = A.multiply(a, ol.l1, one, ol.r1);
GenWordPolynomial s2 = B.multiply(b, ol.l2, one, ol.r2);
GenWordPolynomial s = s1.subtract(s2);
return s;
}
/**
* Normalform Set.
* @param Ap polynomial list.
* @param Pp polynomial list.
* @return list of nf(a) with respect to Pp for all a in Ap.
*/
public List> normalform(List> Pp, List> Ap) {
if (Pp == null || Pp.isEmpty()) {
return Ap;
}
if (Ap == null || Ap.isEmpty()) {
return Ap;
}
ArrayList> red = new ArrayList>();
for (GenWordPolynomial A : Ap) {
A = normalform(Pp, A);
red.add(A);
}
return red;
}
/**
* Is top reducible.
* @param A polynomial.
* @param P polynomial list.
* @return true if A is top reducible with respect to P.
*/
public boolean isTopReducible(List> P, GenWordPolynomial A) {
if (P == null || P.isEmpty()) {
return false;
}
if (A == null || A.isZERO()) {
return false;
}
boolean mt = false;
Word e = A.leadingWord();
for (GenWordPolynomial p : P) {
mt = e.multipleOf(p.leadingWord());
if (mt) {
return true;
}
}
return false;
}
/**
* Is reducible.
* @param Ap polynomial.
* @param Pp polynomial list.
* @return true if Ap is reducible with respect to Pp.
*/
public boolean isReducible(List> Pp, GenWordPolynomial Ap) {
return !isNormalform(Pp, Ap);
}
/**
* Is in Normalform.
* @param Ap polynomial.
* @param Pp polynomial list.
* @return true if Ap is in normalform with respect to Pp.
*/
@SuppressWarnings("unchecked")
public boolean isNormalform(List> Pp, GenWordPolynomial Ap) {
if (Pp == null || Pp.isEmpty()) {
return true;
}
if (Ap == null || Ap.isZERO()) {
return true;
}
int l;
GenWordPolynomial[] P;
synchronized (Pp) {
l = Pp.size();
P = new GenWordPolynomial[l];
//P = Pp.toArray();
for (int i = 0; i < Pp.size(); i++) {
P[i] = Pp.get(i);
}
}
Word[] htl = new Word[l];
GenWordPolynomial[] p = new GenWordPolynomial[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();
j++;
}
}
l = j;
boolean mt = false;
for (Word e : Ap.getMap().keySet()) {
for (i = 0; i < l; i++) {
mt = e.multipleOf(htl[i]);
if (mt) {
return false;
}
}
}
return true;
}
/**
* Is in Normalform.
* @param Pp polynomial list.
* @return true if each Ap in Pp is in normalform with respect to Pp\{Ap}.
*/
public boolean isNormalform(List> Pp) {
if (Pp == null || Pp.isEmpty()) {
return true;
}
GenWordPolynomial Ap;
List> P = new LinkedList>(Pp);
int s = P.size();
for (int i = 0; i < s; i++) {
Ap = P.remove(i);
if (!isNormalform(P, Ap)) {
return false;
}
P.add(Ap);
}
return true;
}
/**
* Irreducible set.
* @param Pp polynomial list.
* @return a list P of monic polynomials which are in normalform wrt. P and
* with ideal(Pp) = ideal(P).
*/
public List> irreducibleSet(List> Pp) {
ArrayList> P = new ArrayList>();
for (GenWordPolynomial a : Pp) {
if (a.length() != 0) {
a = a.monic();
if (a.isONE()) {
P.clear();
P.add(a);
return P;
}
P.add(a);
}
}
int l = P.size();
if (l <= 1)
return P;
int irr = 0;
Word e;
Word f;
GenWordPolynomial a;
logger.debug("irr = ");
while (irr != l) {
//it = P.listIterator();
//a = P.get(0); //it.next();
a = P.remove(0);
e = a.leadingWord();
a = normalform(P, a);
logger.debug(String.valueOf(irr));
if (a.length() == 0) {
l--;
if (l <= 1) {
return P;
}
} else {
f = a.leadingWord();
if (f.signum() == 0) {
P = new ArrayList>();
P.add(a.monic());
return P;
}
if (e.equals(f)) {
irr++;
} else {
irr = 0;
a = a.monic();
}
P.add(a);
}
}
//System.out.println();
return P;
}
/**
* Is reduction of normal form.
* @param lrow left recording matrix.
* @param rrow right recording matrix.
* @param Pp a polynomial list for reduction.
* @param Ap a polynomial.
* @param Np nf(Pp,Ap), a normal form of Ap wrt. Pp.
* @return true, if Np + sum( row[i]*Pp[i] ) == Ap, else false.
*/
public boolean isReductionNF(List> lrow, List> rrow,
List> Pp, GenWordPolynomial Ap, GenWordPolynomial Np) {
if (lrow == null && rrow == null && Pp == null) {
if (Ap == null) {
return (Np == null);
}
return Ap.equals(Np);
}
if (lrow == null || rrow == null || Pp == null) {
return false;
}
if (lrow.size() != Pp.size() || rrow.size() != Pp.size()) {
return false;
}
GenWordPolynomial t = Np;
//System.out.println("t0 = " + t );
GenWordPolynomial r, rl, rr;
GenWordPolynomial p;
for (int m = 0; m < Pp.size(); m++) {
rl = lrow.get(m);
rr = rrow.get(m);
p = Pp.get(m);
if (rl != null && rr != null && p != null) {
if (t == null) {
t = p.multiply(rl, rr);
} else {
t = t.sum(p.multiply(rl, rr));
}
}
//System.out.println("r = " + r );
//System.out.println("p = " + p );
}
//System.out.println("t+ = " + t );
if (t == null) {
if (Ap == null) {
return true;
}
return Ap.isZERO();
}
r = t.subtract(Ap);
boolean z = r.isZERO();
if (!z) {
logger.info("t = " + t);
logger.info("a = " + Ap);
logger.info("t-a = " + r);
}
return z;
}
}
Ads help maintain this website.