Borderbasix

countmon.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_countmon
2 #define ALREADY_countmon
3 
4 #include<list>
5 
6 QQ binomial(int m,int n)
7 {
8  QQ res=1;
9  if(n>m || m<0 || n<0)
10  return 0;
11  for(int i=m;i>m-n;i--)
12  res*=i;
13  for(int i=1;i<=n;i++)
14  res/=(QQ)i;
15  return res;
16 }
17 
18 template<typename mon>
19 QQ countmon(mon * ideal, int d, int nbvar,int nbmon)
20 {
21  QQ res=binomial(nbvar+d-1,d), sign=1;
22  std::list<mon> ppcm,stock;
23  for(int i=0;i<nbmon;i++)
24  stock.push_back(ideal[i]);
25  for (typename std::list<mon>::iterator iterstock=stock.begin();
26  iterstock!=stock.end();iterstock++)
27  for(typename std::list<mon>::iterator iter2=stock.begin();
28  iter2!=stock.end();iter2++)
29  if (isdivisible<mon>(*iterstock,*iter2,nbvar)
30  && !(iterstock==iter2))
31  stock.erase(iter2--);
32 
33  for(typename std::list<mon>::iterator iter=stock.begin()
34  ;iter!=stock.end();iter++)
35  res-=binomial(nbvar+d-iter->GetDegree()-1,d-iter->GetDegree());
36 
37  for(int i=0;i<nbvar && stock.size()>1;i++)//on fait ca sur tout le complexe de kozul
38  {
39  //cout<<"res ici "<<res<<endl;
40  for(typename std::list<mon>::iterator iter1=stock.begin();
41  iter1!=stock.end();iter1++)
42  for(typename std::list<mon>::iterator iter2=(++iter1)--;
43  iter2!=stock.end();iter2++)
44  {
45  ppcm.push_back(lcm(*iter1,*iter2));
46  //cout<<"ppcm.back "<<ppcm.back()<<endl;
47  }
48  stock=ppcm;
49  //filtrer pour ne garder que les minimaux pour la division.
50  for (typename std::list<mon>::iterator iterstock=stock.begin();
51  iterstock!=stock.end();iterstock++)
52  for(typename std::list<mon>::iterator iter2=stock.begin();
53  iter2!=stock.end();iter2++)
54  if (isdivisible<mon>(*iterstock,*iter2,nbvar)
55  && !(iterstock==iter2))
56  stock.erase(iter2--);
57  //mettre a jour res avec ceux la.
58  for(typename std::list<mon>::iterator iterstock=stock.begin();
59  iterstock!=stock.end();iterstock++)
60  res+=sign*binomial(nbvar+d-iterstock->GetDegree()-1
61  ,d-iterstock->GetDegree());
62  sign*=-1;
63  ppcm.erase(ppcm.begin(),ppcm.end());
64  }
65  return res;
66 }
67 
68 template<typename Base>
69 QQ Bindeg(const Base &b,int d)
70 {
71  QQ res=0;
72  for(typename Base::const_iterator iter=b.begin();iter!=b.end();iter++)
73  {
74  int count=0;
75  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(
76  (iter->taille1+iter->taille2)*sizeof(mon));
77  res+=countmon(iter->refuse,d,b.nbvar(),iter->taille2);
78  //res-=countmon(iter->accept,d,b.nbvar(),iter->taille1);
79  for(int i=0;i<iter->taille1;i++)
80  tmp[count++]=iter->accept[i];
81  for(int i=0;i<iter->taille2;i++)
82  {
83  tmp[count++]=iter->refuse[i];
84  }
85  res-=countmon(tmp,d,b.nbvar(),count);
86  MAC_REV_FREE<mon>(tmp,(iter->taille1+iter->taille2)*sizeof(mon));
87  }
88  if (res<0) {cout<<"merde "<<res<<endl;exit(-1);};
89  return res;
90 }
91 
92 template<typename Base>
93 int critere(const Base &b,int d)
94 {
95  cout<<"Binddeg "<<d<<" "<<Bindeg(b,d)<<endl;
96  for(int i=0;i<b.nbvar();i++)
97  {
98  QQ tmp=0;
99  int j;
100  QQ sign=1;
101  for(j=0;j<=i;j++)
102  {
103  tmp+=sign*binomial(i,j)*Bindeg(b,d-j);
104  sign*=-1;
105  }
106  if (tmp<0) {cout<<"exitcrit"<<endl;return -1;}
107  if (tmp==0) {cout<<"exitcrite"<<endl;return j-1;}
108  }
109  cout<<"exitcrit"<<endl;
110  return -1;
111 }
112 
113 #endif //ALREADY_countmon
QQ countmon(mon *ideal, int d, int nbvar, int nbmon)
Definition: countmon.hpp:19
list< predicat >::const_iterator const_iterator
Definition: types.hpp:21
QQ binomial(int m, int n)
Definition: countmon.hpp:6
int nbvar()
Definition: types.hpp:37
int critere(const Base &b, int d)
Definition: countmon.hpp:93
int sign(const Scl< T > &b)
Definition: BC.hpp:307
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
QQ Bindeg(const Base &b, int d)
Definition: countmon.hpp:69
iterator end()
Definition: types.hpp:30
Definition: Scl.hpp:26
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
mon lcm(const mon &m1, const mon &m2)
Definition: corealgo.hpp:43
iterator begin()
Definition: types.hpp:25
Multivariate monomials.
Definition: Monom.hpp:21
Home  |  Download & InstallContributions