1
#include "polynomial.h"
2
#include "field_rationals.h"
9
static int rIndex(int i, int j, int N, bool withMasses)
11
if(j<i){i^=j;j^=i;i^=j;}
14
for(int J=I+1;J<N;J++)
16
if((I==i)&&(J==j))return r;
22
static int sIndex(int i, int j, int N, bool withMasses)
24
return rIndex(i,j,N,withMasses)+N*(N-1)/2;
27
static Polynomial S(PolynomialRing const &r, int N, bool withMasses, int i, int j, bool withSVariables)
30
int n=r.getNumberOfVariables();
34
ret+=Term(r.getField().zHomomorphism(1),Monomial(r,IntegerVector::standardVector(n,sIndex(i,j,N,withMasses))));
38
ret+=Term(r.getField().zHomomorphism(-1),Monomial(r,IntegerVector(n)));
39
ret+=Term(r.getField().zHomomorphism(1),Monomial(r,-3*IntegerVector::standardVector(n,rIndex(i,j,N,withMasses))));
46
static Polynomial rPolynomial(PolynomialRing const &r, int N, bool withMasses, int i, int j, int exponent=2)
48
if(i==j)return Polynomial(r);
49
return Term(r.getField().zHomomorphism(1),Monomial(r,exponent*IntegerVector::standardVector(r.getNumberOfVariables(),rIndex(i,j,N,withMasses))));
53
static vector<string> variableNames(int N, bool withMasses, bool withSVariables)
63
ret.push_back(s.str());
68
for(int j=i+1;j<N;j++)
72
ret.push_back(s.str());
78
for(int j=i+1;j<N;j++)
82
ret.push_back(s.str());
90
Polynomial AlbouyChencinerEquation(PolynomialRing const &r, int N, bool withMasses, int i, int j, bool symmetric, bool withSVariables, bool saturate)
92
int n=r.getNumberOfVariables();
96
Term massTerm=Term(r.getField().zHomomorphism(1),Monomial(r,withMasses*IntegerVector::standardVector(n,k)));
100
S(r,N,withMasses,i,k,withSVariables)*(
101
rPolynomial(r,N,withMasses,j,k)
102
-rPolynomial(r,N,withMasses,i,k)
103
-rPolynomial(r,N,withMasses,i,j)
110
S(r,N,withMasses,j,k,withSVariables)*(
111
rPolynomial(r,N,withMasses,i,k)
112
-rPolynomial(r,N,withMasses,j,k)
113
-rPolynomial(r,N,withMasses,i,j)
117
if(saturate)ret.saturate();
122
PolynomialSet AlbouyChencinerEquations(int N, bool withMasses, bool symmetric, bool withSVariables, bool saturate)
124
PolynomialRing r(Q,variableNames(N,withMasses,withSVariables));
126
PolynomialSet ret(r);
131
ret.push_back(AlbouyChencinerEquation(r,N,withMasses,i,j,symmetric,withSVariables,saturate));
133
for(int j=i+1;j<N;j++)
134
ret.push_back(AlbouyChencinerEquation(r,N,withMasses,i,j,symmetric,withSVariables,saturate));
140
PolynomialSet DziobekEquations(PolynomialRing const &r, int N, bool withMasses, bool withSVariables, bool saturate)
142
PolynomialSet ret(r);
154
list<int>::const_iterator i=a.begin();
156
while((*i)==0){i++;I++;}
158
do{i++;I++;}while((*i)==0);
160
do{i++;I++;}while((*i)==0);
162
do{i++;I++;}while((*i)==0);
165
// cerr<<first<<second<<third<<fourth;
166
Polynomial f1=S(r,N,withMasses,first,second,withSVariables)*S(r,N,withMasses,third,fourth,withSVariables)-S(r,N,withMasses,first,third,withSVariables)*S(r,N,withMasses,second,fourth,withSVariables);
167
if(saturate)f1.saturate();
168
Polynomial f2=S(r,N,withMasses,first,third,withSVariables)*S(r,N,withMasses,second,fourth,withSVariables)-S(r,N,withMasses,first,fourth,withSVariables)*S(r,N,withMasses,second,third,withSVariables);
169
if(saturate)f2.saturate();
170
Polynomial f3=S(r,N,withMasses,first,second,withSVariables)*S(r,N,withMasses,third,fourth,withSVariables)-S(r,N,withMasses,first,fourth,withSVariables)*S(r,N,withMasses,second,third,withSVariables);
171
if(saturate)f3.saturate();
176
while(next_permutation(a.begin(),a.end()));
182
static Polynomial mlookup(PolynomialRing const &r, int N, bool withMasses,int i,int j)
184
if(i==j)return r.zero();
185
if(i==0 || j==0)return r.one();
186
return Polynomial(Term(r.getField().zHomomorphism(1),Monomial(r,2*IntegerVector::standardVector(r.getNumberOfVariables(),rIndex(i-1,j-1,N,withMasses)))));
190
PolynomialSet nbodyDeterminants(PolynomialRing const &r, int N, bool withMasses, int determinantSize)
194
for(int i=0;i<N+1-determinantSize;i++)
196
for(int i=0;i<determinantSize-1;i++)
199
PolynomialSet ret(r);
201
if(determinantSize==N+2)return ret;
205
vector<int> indexList;
206
indexList.push_back(0);
207
for(int i=0;i<l.size();i++)if(l[i]==0)indexList.push_back(i+1);
211
for(int A=0;A<determinantSize;A++)
213
for(int B=0;B<determinantSize;B++)
214
AsciiPrinter(Stderr)<<mlookup(r,N,withMasses,indexList[A],indexList[B])<<";";
220
for(int i=0;i<indexList.size();i++)
227
Polynomial prod=r.one();
228
for(int j=0;j<perm.size();j++)
230
prod*=mlookup(r,N,withMasses,indexList[j],indexList[perm[j]]);
233
for(int x=0;x<perm.size();x++)
235
if(perm[y]>perm[x])s*=-1;
241
while(next_permutation(perm.begin(),perm.end()));
244
while(prev_permutation(l.begin(),l.end()));
250
Polynomial massEquation(PolynomialRing const &r, int N, bool withMasses, bool saturate)
256
Polynomial mm=r.one();
257
if(withMasses)mm=Polynomial(Term(r.getField().zHomomorphism(1),Monomial(r,IntegerVector::standardVector(r.getNumberOfVariables(),i)+IntegerVector::standardVector(r.getNumberOfVariables(),j))));
258
ret+=(rPolynomial(r,N,withMasses,i,j,2)-rPolynomial(r,N,withMasses,i,j,-1))*mm;
260
if(saturate)ret.saturate();
265
Polynomial SEquation(PolynomialRing const &r, int N, bool withMasses, int i, int j, bool withSVariables, bool saturate=true)
268
int n=r.getNumberOfVariables();
270
ret-=Term(r.getField().zHomomorphism(1),Monomial(r,IntegerVector::standardVector(n,sIndex(i,j,N,withMasses))));
272
ret+=Term(r.getField().zHomomorphism(-1),Monomial(r,IntegerVector(n)));
273
ret+=Term(r.getField().zHomomorphism(1),Monomial(r,-3*IntegerVector::standardVector(n,rIndex(i,j,N,withMasses))));
275
if(saturate)ret.saturate();
281
PolynomialSet SEquations(PolynomialRing const &r, int N, bool withMasses, bool saturate)
283
PolynomialSet ret(r);
287
ret.push_back(SEquation(r,N,withMasses,i,j,true,saturate));