1
#include "field_rationalfunctions2.h"
11
#include "buchberger.h"
12
#include "saturation.h"
17
int FieldElementRationalFunctions2Living;
19
class FieldElementRationalFunction2 : public FieldElementImplementation
23
FieldElementRationalFunction2(FieldImplementation &a):
24
FieldElementImplementation(a),
25
p(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()),
26
q(Term(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing().getField().zHomomorphism(1),Monomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing())))
28
FieldElementRationalFunctions2Living++;
30
FieldElementRationalFunction2(FieldImplementation &a,int n_):
31
FieldElementImplementation(a),
32
p(Term(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing().getField().zHomomorphism(n_),Monomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing()))),
33
q(Term(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing().getField().zHomomorphism(1),Monomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing())))
35
if(n_==0)p=Polynomial(((FieldRationalFunctions2Implementation*)&a)->getPolynomialRing());
36
FieldElementRationalFunctions2Living++;
40
/* PolynomialSet g(p.getRing());
43
// LexicographicTermOrder T;
44
LexicographicTermOrder T;
47
// assert(g.size()==1);
50
Polynomial r=g.front();
52
PolynomialSet Q(p.getRing());
53
PolynomialSet P(p.getRing());
59
FieldElement a=q.terms.rbegin()->second;
64
FieldElementRationalFunction2(FieldImplementation &a, Polynomial const &p_, Polynomial const &q_):
65
FieldElementImplementation(a),
70
FieldElementRationalFunctions2Living++;
72
virtual ~FieldElementRationalFunction2()
74
FieldElementRationalFunctions2Living--;
76
FieldElementRationalFunction2& operator=(const FieldElementRationalFunction2& a)
82
void operator*=(const FieldElementImplementation &a)
84
const FieldElementRationalFunction2 *A=(const FieldElementRationalFunction2*)&a;
91
void operator+=(const FieldElementImplementation &a)
93
const FieldElementRationalFunction2 *A=(const FieldElementRationalFunction2*)&a;
100
void madd(const FieldElementImplementation &a,const FieldElementImplementation &b)
102
const FieldElementRationalFunction2 *A=(const FieldElementRationalFunction2*)&a;
103
const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b;
107
p=p*(A->q*B->q)+(A->p*B->p)*q;
111
FieldElementRationalFunction2 *one() const;
117
FieldElementRationalFunction2 *sum(const FieldElementImplementation &b)const
119
const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b;
121
FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p*B->q+B->p*q,B->q*q);
125
FieldElementRationalFunction2 *difference(const FieldElementImplementation &b)const
127
const FieldElementRationalFunction2 *B=(const FieldElementRationalFunction2*)&b;
128
FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p*B->q-B->p*q,B->q*q);
131
FieldElementRationalFunction2 *negation()const
133
FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),p-p-p,q);
137
FieldElementImplementation *inverse()const
141
AsciiPrinter P(Stderr);
142
P.printString("Error inverting FieldElement: ");
143
// P.printFieldElement(*this);
148
FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField(),q,p);
155
assert(0);//not an ordered field (yet)
156
if(isZero())return 0;
157
return p.terms.rbegin()->second.sign();
160
static string LaTeXTranslator(const string &s)
162
assert(0);//not supported yet
171
for(int i=startIndex;i<s.length();i++)if(s[i]=='/')slashIndex=i;
175
return sign+string("{").append(s,startIndex,slashIndex-startIndex)+string("\\over ").append(s,slashIndex+1,s.length()-slashIndex-1)+string("}");
179
std::string toString(bool writeIfOne=true, bool alwaysWriteSign=false, bool latexMode=false /*, bool mathMode=true*/) const
183
// s << "(" <<p.toString(latexMode) << "/" << q.toString(latexMode) << ")";
185
s<<p.toString(latexMode);
187
s << q.toString(latexMode);
192
FieldElementRationalFunction2 *copy()const
194
FieldElementRationalFunction2 *r= new FieldElementRationalFunction2(*getField());
202
PolynomialRing FieldRationalFunctions2Implementation::getPolynomialRing()const
204
return thePolynomialRing;
207
bool FieldRationalFunctions2Implementation::isRationals()const
212
FieldRationalFunctions2Implementation::FieldRationalFunctions2Implementation(PolynomialRing const &r):
217
std::string FieldRationalFunctions2Implementation::toString()const
220
s<< thePolynomialRing.getField().toString() << "("<<thePolynomialRing.toStringVariableNames()<< ")";
224
FieldElementImplementation *FieldRationalFunctions2Implementation::zHomomorphismImplementation(int n)
226
FieldElementImplementation *ret=new FieldElementRationalFunction2(*this,n);
230
FieldElement FieldRationalFunctions2Implementation::zHomomorphism(int n)
232
return FieldElement(zHomomorphismImplementation(n));
235
const char *FieldRationalFunctions2Implementation::name()
237
return "Rational functions in n variables";
240
FieldElementRationalFunction2 *FieldElementRationalFunction2::one() const
242
return new FieldElementRationalFunction2(*getField(),1);
247
FieldRationalFunctions2::FieldRationalFunctions2(PolynomialRing const &r):
248
Field(new FieldRationalFunctions2Implementation(r))
253
FieldElement FieldRationalFunctions2::polynomialToFraction(Polynomial const &p)
255
FieldRationalFunctions2Implementation *imp=dynamic_cast<FieldRationalFunctions2Implementation*>(implementingObject);
256
Polynomial q=Term(imp->getPolynomialRing().getField().zHomomorphism(1),Monomial(imp->getPolynomialRing()));
258
return new FieldElementRationalFunction2(*imp, p, q);
261
/*****************************************************
262
* Conversion functions
263
*****************************************************/
264
PolynomialRing makeVariablesParameters(PolynomialRing const &r, int numberOfParameters)
266
assert(numberOfParameters>=0);
267
assert(numberOfParameters<=r.getNumberOfVariables());
268
vector<string> names(numberOfParameters);
269
for(int i=0;i<numberOfParameters;i++)names[i]=r.getVariableName(i);
270
PolynomialRing temp(r.getField(),names);
271
vector<string> names2(r.getNumberOfVariables()-numberOfParameters);
272
for(int i=0;i<names2.size();i++)names2[i]=r.getVariableName(i+numberOfParameters);
274
return PolynomialRing(FieldRationalFunctions2(temp),names2);
277
Polynomial makeVariablesParameters(PolynomialRing const &genericRing, Polynomial const &p)
279
Polynomial ret(genericRing);
280
FieldRationalFunctions2Implementation const *coefficientField=dynamic_cast<FieldRationalFunctions2Implementation const*>(genericRing.getField().implementingObject);
281
FieldRationalFunctions2 &DANGER=(FieldRationalFunctions2&)genericRing.getField();
282
PolynomialRing coefRing=coefficientField->getPolynomialRing();
284
for(TermMap::const_iterator i=p.terms.begin();i!=p.terms.end();i++)
286
FieldElement c=i->second;
287
IntegerVector v=i->first.exponent;
288
IntegerVector coefficientExponent=v.subvector(0,p.getRing().getNumberOfVariables()-genericRing.getNumberOfVariables());
289
IntegerVector monomialExponent=v.subvector(p.getRing().getNumberOfVariables()-genericRing.getNumberOfVariables(),v.size());
290
FieldElement c2=DANGER.polynomialToFraction(Term( c,Monomial(coefRing, coefficientExponent)));//does the numerator not belong to a field?
291
ret+=Polynomial(Term(c2,Monomial(genericRing,monomialExponent)));
296
PolynomialSet makeVariablesParameters(PolynomialRing const &genericRing, PolynomialSet const &p)
298
PolynomialSet ret(genericRing);
299
for(PolynomialSet::const_iterator i=p.begin();i!=p.end();i++)
300
ret.push_back(makeVariablesParameters(genericRing,*i));