001/* 002 * $Id$ 003 */ 004 005package edu.jas.gb; 006 007 008import java.util.List; 009 010import org.apache.logging.log4j.Logger; 011import org.apache.logging.log4j.LogManager; 012 013import edu.jas.poly.GenWordPolynomial; 014import edu.jas.poly.GenWordPolynomialRing; 015import edu.jas.poly.PolyUtil; 016import edu.jas.structure.RingElem; 017 018 019/** 020 * Non-commutative word Groebner Base sequential algorithm. Implements Groebner 021 * bases and GB test. 022 * @param <C> coefficient type 023 * @author Heinz Kredel 024 */ 025 026public class WordGroebnerBaseSeq<C extends RingElem<C>> extends WordGroebnerBaseAbstract<C> { 027 028 029 private static final Logger logger = LogManager.getLogger(WordGroebnerBaseSeq.class); 030 031 032 private static final boolean debug = logger.isDebugEnabled(); 033 034 035 /** 036 * Constructor. 037 */ 038 public WordGroebnerBaseSeq() { 039 super(); 040 } 041 042 043 /** 044 * Constructor. 045 * @param red Reduction engine 046 */ 047 public WordGroebnerBaseSeq(WordReduction<C> red) { 048 super(red); 049 } 050 051 052 /** 053 * Constructor. 054 * @param red Reduction engine 055 * @param pl pair selection strategy 056 */ 057 public WordGroebnerBaseSeq(WordReduction<C> red, WordPairList<C> pl) { 058 super(red, pl); 059 } 060 061 062 /** 063 * Word Groebner base using word pairlist class. 064 * @param F word polynomial list. 065 * @return GB(F) a finite non-commutative Groebner base of F, if it exists. 066 */ 067 @Override 068 public List<GenWordPolynomial<C>> GB(List<GenWordPolynomial<C>> F) { 069 List<GenWordPolynomial<C>> G = normalizeZerosOnes(F); 070 G = PolyUtil.<C> wordMonic(G); 071 if (G.size() <= 1) { 072 return G; 073 } 074 GenWordPolynomialRing<C> ring = G.get(0).ring; 075 if (!ring.coFac.isField()) { 076 throw new IllegalArgumentException("coefficients not from a field"); 077 } 078 //Collections.sort(G); 079 OrderedWordPairlist<C> pairlist = (OrderedWordPairlist<C>) strategy.create(ring); 080 pairlist.put(G); 081 logger.info("start {}", pairlist); 082 083 WordPair<C> pair; 084 GenWordPolynomial<C> pi; 085 GenWordPolynomial<C> pj; 086 List<GenWordPolynomial<C>> S; 087 GenWordPolynomial<C> H; 088 while (pairlist.hasNext()) { 089 pair = pairlist.removeNext(); 090 //logger.debug("pair = {}", pair); 091 if (pair == null) { 092 continue; 093 } 094 pi = pair.pi; 095 pj = pair.pj; 096 if (debug) { 097 logger.info("pi = {}, pj = {}", pi, pj); 098 } 099 100 S = red.SPolynomials(pi, pj); 101 if (S.isEmpty()) { 102 continue; 103 } 104 for (GenWordPolynomial<C> s : S) { 105 if (s.isZERO()) { 106 //pair.setZero(); 107 continue; 108 } 109 if (debug) { 110 logger.info("ht(S) = {}", s.leadingWord()); 111 } 112 boolean t = pairlist.criterion3(pair.i, pair.j, s.leadingWord()); 113 //System.out.println("criterion3(" + pair.i + "," + pair.j + ") = " + t); 114 //if ( !t ) { 115 // continue; 116 //} 117 118 H = red.normalform(G, s); 119 if (debug) { 120 //logger.info("pair = {}", pair); 121 //logger.info("ht(S) = {}", S.monic()); //.leadingWord() ); 122 logger.info("ht(H) = {}", H.monic()); //.leadingWord() ); 123 } 124 if (H.isZERO()) { 125 //pair.setZero(); 126 continue; 127 } 128 if (!t) { 129 logger.info("criterion3({},{}) wrong: {} --> {}", pair.i, pair.j, s.leadingWord(), H.leadingWord()); 130 } 131 132 H = H.monic(); 133 if (debug) { 134 logger.info("ht(H) = {}", H.leadingWord()); 135 } 136 if (H.isONE()) { 137 G.clear(); 138 G.add(H); 139 return G; // since no threads are activated 140 } 141 if (debug) { 142 logger.info("H = {}", H); 143 } 144 if (H.length() > 0) { 145 //l++; 146 G.add(H); 147 pairlist.put(H); 148 } 149 } 150 } 151 //logger.info("#sequential list = {}", G.size()); 152 G = minimalGB(G); 153 logger.info("end {}", pairlist); 154 //Collections.sort(G); 155 //Collections.reverse(G); 156 return G; 157 } 158 159}