4
* Created on: Dec 14, 2010
9
#include "polynomial.h"
10
#include "field_rationals.h"
12
#include "polyhedralcone.h"
13
#include "wallideal.h"
14
#include "tropical2.h"
17
* Implemented according to [Becker, Weispfenning] Chapter 10.1.
20
Polynomial dDivision(Polynomial p, PolynomialSet const &l, TermOrder const &termOrder)
22
PolynomialRing theRing=p.getRing();
23
Polynomial r(p.getRing());
28
Term initial=p.getMarked();
29
PolynomialSet::const_iterator i;
30
PolynomialSet::iterator j;
31
for(i=l.begin();i!=l.end();i++)
33
if(i->getMarked().m.exponent.divides(initial.m.exponent))
34
if((initial.c*(i->getMarked().c.inverse())).isInteger())break;
40
Term s(-initial.c*i->getMarked().c.inverse(),Monomial(p.getRing(),initial.m.exponent-i->getMarked().m.exponent));
54
Polynomial eDivision(Polynomial p, PolynomialSet const &l, TermOrder const &termOrder)
56
PolynomialRing theRing=p.getRing();
57
Polynomial r(p.getRing());
59
// debug<<"eDivision input "<< p<<l<<termOrder;
64
// debug<<"P "<<p<<"\n";
65
Term initial=p.getMarked();
66
PolynomialSet::const_iterator i;
67
PolynomialSet::iterator j;
68
for(i=l.begin();i!=l.end();i++)
70
if(i->getMarked().m.exponent.divides(initial.m.exponent))
72
// debug<<"CHECKING:"<<initial<<"\n";
73
FieldElement q=integerDivision(initial.c,i->getMarked().c);
81
// debug<<"dividing by "<<*i<<"\n";
82
Term s(-integerDivision(initial.c,i->getMarked().c),Monomial(p.getRing(),initial.m.exponent-i->getMarked().m.exponent));
95
static Polynomial sgpol(Polynomial const &g1, Polynomial const &g2, bool s)
97
PolynomialRing R=g1.getRing();
98
FieldElement a1=g1.getMarked().c;
99
FieldElement a2=g2.getMarked().c;
100
IntegerVector t1=g1.getMarked().m.exponent;
101
IntegerVector t2=g2.getMarked().m.exponent;
104
FieldElement g=gcd(a1,a2,c1,c2);
105
FieldElement b1=a2*g.inverse();
106
FieldElement b2=a1*g.inverse();
107
IntegerVector s1=max(t1,t2)-t1;
108
IntegerVector s2=max(t1,t2)-t2;
123
if(s)return Term(b1,Monomial(R,s1))*g1-Term(b2,Monomial(R,s2))*g2;
124
return Term(c1,Monomial(R,s1))*g1+Term(c2,Monomial(R,s2))*g2;
128
Polynomial spol(Polynomial const &g1, Polynomial const &g2)
130
return sgpol(g1,g2,true);
134
Polynomial gpol(Polynomial const &g1, Polynomial const &g2)
136
return sgpol(g1,g2,false);
139
void zMinimize(PolynomialSet &F)
140
{//can be done in nlogn time, but that requirese sorting according to coefficients.
141
for(PolynomialSet::iterator i=F.begin();i!=F.end();)
144
for(PolynomialSet::const_iterator j=F.begin();j!=F.end();j++)
146
if(j->getMarked().m.exponent.divides(i->getMarked().m.exponent))
147
if((j->getMarked().c.inverse()*i->getMarked().c).isInteger()){doDelete=true;break;}
150
PolynomialSet::iterator i2=i;
160
void zAutoReduce(PolynomialSet *g, TermOrder const &termOrder)
162
for(PolynomialSet::iterator i=g->begin();i!=g->end();i++)
166
PolynomialSet::iterator tempIterator=i;
169
Monomial monomial=temp.getMarked().m;
170
if(temp.getMarked().c.sign()>0)
171
g->insert(tempIterator,eDivision(temp,*g,termOrder));
173
g->insert(tempIterator,eDivision(temp.getRing().zero()-temp,*g,termOrder));
187
typedef pair<Polynomial,Polynomial> Pair;
188
void zBuchberger(PolynomialSet &F, TermOrder const &T)
191
PolynomialSet G(F.getRing());
192
for(PolynomialSet::const_iterator i=F.begin();i!=F.end();i++)if(!i->isZero())G.push_back(*i);
194
for(PolynomialSet::const_iterator i=G.begin();i!=G.end();i++)
195
for(PolynomialSet::const_iterator j=G.begin();j!=i;j++)
196
B.push_back(Pair(*i,*j));
202
// debug<<"Looping\n";
209
PolynomialSet::const_iterator gi=G.begin();
212
IntegerVector lcm=max(f.first.getMarked().m.exponent,f.second.getMarked().m.exponent);
213
FieldElement HCf1=f.first.getMarked().c;
214
FieldElement HCf2=f.second.getMarked().c;
215
for(;gi!=G.end();gi++)
217
if(gi->getMarked().m.exponent.divides(lcm)
218
&& (gi->getMarked().c.inverse()*HCf1).isInteger()
219
&& (gi->getMarked().c.inverse()*HCf2).isInteger())break;
223
// debug<<f.first.getMarked()<<" "<<f.second.getMarked()<<"\n";
225
Polynomial h=gpol(f.first,f.second);
226
Polynomial h0=dDivision(h,G,T);
229
// debug<<"remainder is zero!\n";
234
for(PolynomialSet::const_iterator gi=G.begin();gi!=G.end();gi++)
235
D.push_back(Pair(*gi,h0));
242
Polynomial h=spol(f.first,f.second);
243
Polynomial h0=dDivision(h,G,T);
247
for(PolynomialSet::const_iterator gi=G.begin();gi!=G.end();gi++)
248
D.push_back(Pair(*gi,h0));
256
//debug<<F<<"---------------------------------------------------------------------\n";
263
void IntegerGroebnerFanTraverser::updatePolyhedralCone()
265
IntegerVectorList inequalities=fastNormals(wallInequalities(groebnerBasis));
266
IntegerVectorList empty;
267
theCone=PolyhedralCone(inequalities,empty,n);
268
theCone.canonicalize();
273
IntegerGroebnerFanTraverser::IntegerGroebnerFanTraverser(PolynomialSet const &generators):
274
n(generators.getRing().getNumberOfVariables()),
275
groebnerBasis(generators)
277
// LexicographicTermOrder tieBreaker;
278
// zBuchberger(groebnerBasis,tieBreaker);
279
//debug<<"WE ASSUME THAT WE ALREADY HAVE A REDUCED GB\n";
281
updatePolyhedralCone();
284
void IntegerGroebnerFanTraverser::changeCone(IntegerVector const &ridgeVector, IntegerVector const &rayVector)
286
IntegerVectorList tOld;
287
tOld.push_back(ridgeVector);
288
tOld.push_back(-rayVector);
289
MatrixTermOrder TOld(tOld);
292
t.push_back(ridgeVector);
293
t.push_back(rayVector);
294
MatrixTermOrder T(t);
297
//debug<<"OLDGB\n"<<groebnerBasis;
298
PolynomialSet g=initialFormsAssumeMarked(groebnerBasis,ridgeVector);
299
//debug<<"OLD INITIAL GB\n"<<g;
301
//debug<<"NEW INITIAL GB\n"<<g;
305
PolynomialSet liftedBasis(groebnerBasis.getRing());
306
for(PolynomialSet::const_iterator i=g.begin();i!=g.end();i++)
308
Polynomial lt=*i;//Polynomial(i->getMarked());
309
Polynomial r=eDivision(lt, groebnerBasis,TOld);
310
Polynomial rIn=eDivision(lt,initialFormsAssumeMarked(groebnerBasis,ridgeVector),TOld);
311
liftedBasis.push_back(lt-r);
313
// debug<<"--------------------\n";
314
// debug<<"lt:"<<lt<<"\n";
315
// debug<<"r:"<<r<<"\n";
316
// debug<<"rIn:"<<rIn<<"\n";
317
// debug<<"--------------------\n";
320
//debug<<"to be autoreduced:"<<liftedBasis;
321
//debug<<"autoreducing......\n";
323
zAutoReduce(&liftedBasis,T);
324
PolynomialSet newInitialForms=initialForms(liftedBasis,ridgeVector);
325
//debug<<"LIFTED"<<liftedBasis;
326
//debug<<"NEWINITIALFORMS"<<newInitialForms;
328
/*zBuchberger(groebnerBasis,T);
331
groebnerBasis.sort_();
333
bool areEqual=(groebnerBasis.size()==liftedBasis.size());
336
PolynomialSet::const_iterator i=groebnerBasis.begin();
337
for(PolynomialSet::const_iterator j=liftedBasis.begin();j!=liftedBasis.end();j++,i++)
338
areEqual&=(*i-*j).isZero();
342
debug<<groebnerBasis<<liftedBasis;
347
groebnerBasis=liftedBasis;
348
groebnerBasis.mark(T);
351
//debug<<"NEW BASIS"<<groebnerBasis;
353
updatePolyhedralCone();
356
IntegerVectorList IntegerGroebnerFanTraverser::link(IntegerVector const &ridgeVector)
358
IntegerVectorList ret;
359
IntegerVector v=theCone.link(ridgeVector).getUniquePoint();
362
PolyhedralCone temp=intersection(PolyhedralCone::positiveOrthant(n),theCone.faceContaining(ridgeVector));
363
IntegerVector temp2=temp.getRelativeInteriorPoint();
368
// debug<<"LINK"<<ret;
373
PolyhedralCone & IntegerGroebnerFanTraverser::refToPolyhedralCone()