Borderbasix

pol2ter.hpp
Go to the documentation of this file.
1 #ifndef pol2ter
2 #define pol2ter pol
3 #define pol pol
4 #include"ugly.hpp"
5 template<typename T>
6 int Iszero(const T&);
7 
8 int nbbits[256]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
9 
10 template<typename T> void *MAC_REV_MALLOC(int size);
11 template<typename T> void *MAC_REV_REALLOC(void*ptr,int,int);
12 template<typename T> void MAC_REV_FREE(void*ptr,int size);
13 
14 template<typename mon,typename T>
15 struct pol2ter
16 {
17  typedef mon monom_t;
18  typedef T coeff_t;
21  T * nf;
22  unsigned char *nfind;
23  int size,sizenf;
24  //size correspond a nf et sizenf a nfind
25  // pol operator*(const mon&t);//multi par un monome
26  pol2ter operator*(const T &t);
27  pol2ter &operator-=(const pol2ter &Q);
28  pol2ter &operator=(const pol2ter &Q);
29  pol2ter &operator/=(const T &t);
30 };
31 
32 //
33 //l'autre par un coeff constant
34 //
35 template<typename mon,typename T>
38 {
39  int tmpsize=this->size;
40  for(int i=0;i<this->size;i++)
41  this->nf[i]*=toto;
42  return *this;
43 }
44 
45 template<typename mon,typename T>
47 {
48  int sizeres=0;
49  pol2ter<mon,T> res;
50  // cout<<"on m'appelle"<<endl;
51  if(sizenf<Q.sizenf)
52  {
53  T *ptrnf=nf,*ptrresnf,*ptrQnf;
54  for(int i=0;i<sizenf;i++)
55  sizeres+=nbbits[nfind[i]&Q.nfind[i]];
56 
57  for(int i=sizenf;i<Q.sizenf;i++)
58  sizeres+=nbbits[Q.nfind[i]];
59  res.size=sizeres;
60  //res.nfind=malloc(Q.sizenf);
61  res.nf=(T*)MAC_REV_MALLOC<T>(res.size*sizeof(T));
62  ptrresnf=nf;
63  ptrQnf=Q.nf;
64  for(int i=0;i<sizenf;i++)
65  {
66  for(int j=0;j<8;j++)
67  {
68  if((nfind[i]>>j)&1)
69  *(ptrresnf++)=*(ptrnf++);
70  if ((Q.nfind[i]>>j)&1)
71  *(ptrresnf-1)-=*(ptrQnf++);
72  }
73  }
74  for(int i=sizenf;i<Q.sizenf;i++)
75  {
76  for(int j=0;j<8;j++)
77  if((Q.nfind[i]>>j)&1)
78  *(ptrresnf++)=((T)-1)*(*(ptrQnf++));
79  }
80  }
81  else
82  {
83  T *ptrnf=nf,*ptrresnf,*ptrQnf;
84  for(int i=0;i<Q.nizenf;i++)
85  sizeres+=nbbits[nfind[i]&Q.nfind[i]];
86 
87  for(int i=Q.sizenf;i<sizenf;i++)
88  sizeres+=nbbits[nfind[i]];
89 
90  res.size=sizeres;
91  // res.nfind=malloc(sizenf);
92  res.nf=(T*)MAC_REV_MALLOC<T>(res.size*sizeof(T));
93  ptrresnf=nf;
94  ptrQnf=Q.nf;
95  for(int i=0;i<Q.sizenf;i++)
96  {
97  for(int j=0;j<8;j++)
98  {
99  if((nfind[i]>>j)&1)
100  *(ptrresnf++)=*(ptrnf++);
101  if((Q.nfind[i]>>j)&1)
102  *(ptrresnf-1)-=*(ptrQnf++);
103  }
104  }
105  for(int i=Q.sizenf;i<sizenf;i++)
106  {
107  for(int j=0;j<8;j++)
108  if((nfind[i]>>j)&1)
109  *(ptrresnf++)=*(ptrnf++);
110  }
111 
112  }
113  if(sizenf<Q.sizenf)
114  nfind=(unsigned char*)realloc(nfind,Q.sizenf);
115  for(int i=0;i<Q.sizenf;i++)
116  nfind[i]|=Q.nfind[i];
117  MAC_REV_FREE<T>(sizenf*sizeof(T));
118  free(nfind);
119  nfind=res.nfind;
120  nf=res.nf;
121  sizenf=res.sizenf;
122  size=res.size;
123  return *this;
124 }
125 //attention l'operateur -= n'agit que sur les nf
126 
127 //
128 //operateur d'affectation sans recopie de nf!!!!
129 //
130 template<typename mon,typename T>
132 {
133  nf=Q.nf;
134  nfind=Q.nfind;
135  size=Q.size;
136  sizenf=Q.sizenf;
137  ind=Q.ind;
138  ancestor=Q.ancestor;
139  return *this;
140 }
141 
142 template<typename mon,typename T>
144 {
145  for(int i=0;i<this->size;i++)
146  this->nf[i]/=t;
147  return *this;
148 }
149 
150 
151 template<typename mon,typename T>
152 bool operator== (const pol2ter<mon,T> &A, const pol2ter<mon,T> &B)
153 {
154  bool res=(A.ind==B.ind)&&(A.size==B.size)&&(A.sizenf==B.sizenf);
155  if (res)
156  for(int i=0;i<A.sizenf;i++)
157  res&=(A.nfind[i]==B.nfind[i]);
158  if(res)
159  for(int i=0;i<A.size;i++)
160  res&=(A.nf[i]==B.nf[i]);
161  return res;
162 }
163 
164 
165 template<typename polyalp, typename mon, typename T, typename monomial_server>
166 polyalp invconv(const pol2ter<mon,T> & p, monomial_server &serv)
167 {
168  typedef typename polyalp::order_t ord;
169  polyalp res(0);
170  T *tmpptr=p.nf;
171  for(int i=0;i<p.sizenf;i++)
172  {
173  //cout<<"i dans invconv "<<i<<" sizeplace "<<sizeplacemon()<<endl;
174  for(int j=0;j<8;j++)
175  if ((p.nfind[i]>>j)&1)
176  {
177  mon tmp;
178  serv.int2mon(8*i+j,tmp);
179  // cout<<"8*i+j vaut"<<8*i+j<<endl;
180  //cout<<"j'aoute le monome "<<tmp<<endl;
181  //cout<<"LE COEFF EST "<<p.nf[i]<<endl;
182  //cout<<"res dans invconv"<<endl<<res<<endl;
183  res+=tmp*(*(tmpptr++));
184  }
185  }
186  if (!Iszero(p.ind.GetCoeff()))
187  res+=p.ind;
188  //cout<<"res dans invconv"<<endl<<res<<endl;
189  return res;
190 }
191 
192 
193 // renvoit mon/x_i .... mais suppose qu'on ne fait pas n'importe quoi
194 //necessaire pour convert
195 
196 template <typename Mon,typename Base>
197 Mon divmon(const Mon &mon,int i,const Base &b)
198 {
199  Mon res(1);
200  for(int j=0;j<b.nvar();j++)
201  if(i==j)
202  {
203  res*=Mon(j,mon.GetDegree(j)-1);
204  }
205  else
206  {
207  res*=Mon(j,mon.GetDegree(j));
208  }
209  return res;
210 }
211 
212 //converti un polyalp en pol2ter
213 template<typename pol2ter,typename polyalp,typename Base,
214  typename monomial_server>
215 pol2ter convert(const polyalp &P,const Base &b, monomial_server &serv)
216 {
217  typedef typename polyalp::order_t ord;
218  typedef typename polyalp::monom_t mon;
219  typedef typename mon::coeff_t coeff;
220  coeff *tmp;
221  pol2ter res;
222  int i,maxind=-1,j,p=0;
223  i=0;
224  res.ind=mon(0);
225  for(typename polyalp::const_iterator iter=P.begin();iter!=P.end();iter++)
226  if ((IsinB(*iter,b))&&(serv.mon2int(*iter)>maxind))
227  maxind=serv.mon2int(*iter);
228  maxind++;
229  res.sizenf=(maxind/8)+1;
230  res.nfind=(unsigned char*)malloc((maxind/8+1));
231  memset(res.nfind,0,res.sizenf);
232  tmp=(coeff*)MAC_REV_MALLOC<coeff>((maxind)*sizeof(coeff));
233  for(int i=0;i<maxind;i++)
234  tmp[i]=0;
235  for(typename polyalp::const_iterator iter=P.begin();iter!=P.end();iter++)
236  {
237  if(IsinB(*iter,b))
238  {
239  if(!Iszero(iter->GetCoeff()))
240  {
241  int stockind=serv.mon2int(*iter);
242  tmp[stockind]=iter->GetCoeff();
243  res.nfind[stockind/8]|=(unsigned char)(1<<(stockind%8));
244  p++;
245  }
246  }
247  else
248  {
249  res.ind=*iter;
250  res.ancestor=&res.ind;
251  }
252  }
253  res.size=p;//l'ind n'est pas comptabilise dans la nf
254  res.nf=(coeff*)MAC_REV_MALLOC<coeff>(res.size*sizeof(coeff));
255  for( i=0;i<res.size;i++)
256  res.nf[i]=0;
257 
258  j=0;
259  for(int i=0;i<maxind;i++)
260  if(!Iszero(coeff(tmp[i])))
261  res.nf[j++]=tmp[i];
262  MAC_REV_FREE<coeff>(tmp,(maxind)*sizeof(coeff));
263 
264  p=0;
265  for(int i=0;i<res.sizenf;i++)
266  p+=nbbits[res.nfind[i]];
267 #ifdef DEB
268  cout<<"pol.size "<<P.size()<<" kkk "<<p<<endl;
269 #endif
270  return res;
271 }
272 
273 template<typename mon,typename T, typename monomial_server>
275 {
276  int mmax=-1;
277  int k=0;
278  for(int i=0;i<p.sizenf;i++)
279  if(p.nfind[i])
280  {
281  mon tmpmon;
282  for(int j=0;j<8;j++)
283  if(((p.nfind[i]>>j)&1)&&!Iszero(p.nf[k++]))
284  {
285  serv.int2mon(8*i+j,tmpmon);
286  mmax=(mmax<tmpmon.GetDegree())?tmpmon.GetDegree():mmax;
287  }
288  }
289  if(!Iszero(p.ind.GetCoeff()))
290  mmax=(mmax<p.ind.GetDegree())?p.ind.GetDegree():mmax;
291  return mmax;//p.ind.GetDegree();
292 }
293 
294 template<typename mon,typename T>
295 int hasmonom(const pol2ter<mon,T>& p,const mon & m)
296 {
297  int res=0,i,tmpind=mon2int(m);
298  return (tmpind/8<p.sizenf) && ((p.nfind[tmpind/8]>>(tmpind%8))&1);
299 }
300 
301 template<typename mon, typename T>
303 {
304  mon tmp;
305  int cpt=0,i,tmpcpt;
306  //for(i=0;(i<p.sizenf) ;i++)
307  // cpt+=nbbits[p.nfind[i]];
308  //cout<<endl<<"nbbits "<<cpt<<endl<<" et j "<<j<<endl;
309  //cpt=0;
310  for(i=0;(cpt<j) && (i<p.sizenf) ;i++)
311  cpt+=nbbits[p.nfind[i]];
312  tmpcpt=8*i;
313  (i==p.sizenf?i--:i);
314  for(int k=128;cpt>j;k>>=1)
315  if(p.nfind[i]&&k)
316  {tmpcpt--;cpt--;}
317  int2mon(tmpcpt,tmp);
318  return tmp;
319 }
320 #endif
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
int size
Definition: pol2ter.hpp:23
T coeff_t
Definition: pol2ter.hpp:18
unsigned char * nfind
Definition: pol2ter.hpp:22
pol2ter & operator-=(const pol2ter &Q)
Definition: pol2ter.hpp:46
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
void free(void *)
void MAC_REV_FREE(void *ptr, int size)
Definition: memory.hpp:65
mon monofindex(int j, pol< mon, T > &p)
Definition: pol2ter.hpp:302
mon monom_t
Definition: pol2ter.hpp:17
C GetCoeff() const
Definition: Monom.hpp:67
Definition: pol.hpp:6
int Degree(const polter< mon, T > &p)
Definition: pol2ter.hpp:252
typpol nf(int var, int indmon, const typdump &dump, const Base &b)
Definition: corealgo.hpp:1001
void * MAC_REV_MALLOC(int size)
Definition: memory.hpp:39
mon ind
Definition: pol2ter.hpp:19
void * MAC_REV_REALLOC(void *ptr, int, int)
Definition: memory.hpp:49
void * malloc(YYSIZE_T)
polyalp invconv(const polter< mon, T > &p)
Definition: pol2ter.hpp:143
int sizenf
Definition: pol2ter.hpp:23
int mon2int(const mon &mm)
Definition: placemon.hpp:294
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
void int2mon(const int &i, mon &res)
Definition: placemon.hpp:288
MSKint32t k
Definition: mosek.h:2713
C coeff_t
Definition: Monom.hpp:26
int nbbits[256]
Definition: pol2ter.hpp:4
Definition: placemon3.hpp:14
bool operator==(const pol2ter< mon, T > &A, const pol2ter< mon, T > &B)
Definition: pol2ter.hpp:152
mon * ancestor
Definition: pol2ter.hpp:20
Definition: pol2ter.hpp:15
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
Mon mon
Definition: solver_bb_floating.cpp:136
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
Mon divmon(const Mon &mon, int i, const Base &b)
Definition: pol2ter.hpp:179
polter convert(const polyalp &P, const Base &b)
Definition: pol2ter.hpp:196
Monom< COEFF, dynamicexp<'x'> > Mon
Definition: solver_bb_floating.cpp:134
pol2ter & operator=(const pol2ter &Q)
Definition: pol2ter.hpp:131
pol2ter operator*(const T &t)
Definition: pol2ter.hpp:37
int hasmonom(const polter< mon, T > &p, const mon &m)
Definition: pol2ter.hpp:272
int Iszero(const T &)
#define pol2ter
Definition: pol2ter.hpp:2
Multivariate monomials.
Definition: Monom.hpp:21
pol2ter & operator/=(const T &t)
Definition: pol2ter.hpp:143
T * nf
Definition: pol2ter.hpp:21
Home  |  Download & InstallContributions