Borderbasix

corealgo3_omp.hpp
Go to the documentation of this file.
1 #ifndef ALREADY_corealgo3
2 #define ALREADY_corealgo3
3 #include<omp.h>
4 
5 template<typename typP,typename typPk,typename Base>
6 void Crochetchoix(const typP & P,typPk & Pk, typPk & redspol,int k,
7  Base &b);
8 
9 template<typename typPk>
10 void stab(typPk & Pk)
11 {
12  typedef typename typPk::value_type pol;
13  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
14  {
15  pol tmpres=mon(0);
16  for(typename pol::iterator iterpol=iter->begin();iterpol!=iter->end();
17  iterpol++)
18  {
19  if(!Iszero(iterpol->GetCoeff()))
20  tmpres+=*iterpol;
21  }
22  *iter=tmpres;
23  }
24 }
25 
26 template<typename T>
27 void my_merge(T &l1,const T &l2)
28 {
29  typename T::const_iterator iter=l2.begin();
30  for(;iter!=l2.end();iter++)
31  l1.push_back(*iter);
32 }
33 template<typename mon>
34 mon lcm(const mon &m1,const mon &m2)
35 {
36  mon m(1);
37  int maxi=max(lvar(m1.rep),lvar(m2.rep));
38  for(int i=0;i<=maxi;i++)
39  m*=mon(i,max(m1.GetDegree(i),m2.GetDegree(i)));
40  return m;
41 }
42 
43 static int max_degppcm;
44 
45 template<typename typppcm,typename Base>
46 int compute_ppcm(typppcm &ppcm,const Base & b)
47 {
48  typedef typename Base::mon mon;
49  //typppcm tmpppcm;
50  max_degppcm=0;
51  int maxdeg=-1;
52  list<mon> list1,list2,tmplist2;
53 
54 
55  for(typename Base::const_reverse_iterator iter=b.rbegin()
56  ;iter==b.rbegin();iter++)
57  {
58 #ifndef oldppcm
59  for(int i=0;i<iter->taille2;i++)
60  for(int j=i+1;j<iter->taille2;j++)
61  {
62  mon tmpmon=lcm(iter->refuse[i],iter->refuse[j]);
63 
64  if((!ppcm.count(tmpmon))&&
65  (tmpmon.GetDegree()!=
66  (iter->refuse[i].GetDegree()+iter->refuse[j].GetDegree())))
67  {
68  ppcm[tmpmon]=1;
69  if(tmpmon.GetDegree()>max_degppcm)
70  max_degppcm=tmpmon.GetDegree();
71  }
72 
73  // cout<<"ppcm rajoute "<<tmpmon<<" "<<iter->refuse[i]<<" "<<iter->refuse[j]<<endl;
74  }
75 #else
76  for(int i=0;i<iter->taille2;i++)
77  for(int j=i+1;j<iter->taille2;j++)
78  {
79  mon tmpmon=lcm(iter->refuse[i],iter->refuse[j]);
80 
81  if((tmpmon.GetDegree()!=
82  (iter->refuse[i].GetDegree()+iter->refuse[j].GetDegree())))
83  {
84  int ok=1;
85  for(int k=0;k<iter->taille2;k++)
86  {
87  if((k!=i) && (k!=j)
88  && (isdivisible(iter->refuse[k],tmpmon,b)))
89  {
90  mon lc_i=lcm(iter->refuse[k],iter->refuse[i]);
91  mon lc_j=lcm(iter->refuse[k],iter->refuse[j]);
92  if((lc_i.rep!=tmpmon.rep)
93  && (isdivisible(lc_i,tmpmon,b)) &&
94  (lc_j.rep!=tmpmon.rep)
95  &&(isdivisible(lc_j,tmpmon,b)))
96  ok=0;
97  }
98  }
99  if(ok)
100  list2.push_back(tmpmon);
101  }
102  }
103 #endif
104  }
105 #ifdef oldppcm
106  maxdeg=0;
107  // cout<<"liste2.size "<<list2.size()<<endl;
108  for(typename list<mon>::iterator iter2=list2.begin();
109  iter2!=list2.end();iter2++)
110  {
111  // cout<<"je passe ici "<<*iter2<<endl;
112  ppcm[*iter2]=1;
113  if(iter2->GetDegree()>maxdeg)
114  maxdeg=iter2->GetDegree();
115  }
116  max_degppcm=maxdeg;
117 #endif
118  return maxdeg;
119 }
120 
121 int GB_stop(int k)
122 {
123  int res=0;
124  if(k>max_degppcm) res=1;
125  return res;
126 }
127 
128 template<typename mon,typename Base,typename typppcm,typename typMk>
129 int goodspol(const mon &m1,const mon &m2, typppcm & ppcm,const Base &b
130  ,const typMk &Spoldejavu)
131 {
132  //list<mon> ppcm;
133  int res=0,comp=0;//,nobplus=1;
134  mon m=m1;
135  for(int i=0;i<b.nbvar();i++)
136  if(m1.GetDegree(i)!=m2.GetDegree(i))
137  {
138  comp++;
139  if (m1.GetDegree(i)-m2.GetDegree(i)==1)
140  res+=1;
141  if (m1.GetDegree(i)-m2.GetDegree(i)==-1)
142  {
143  res+=1;
144  m*=mon(i,1);
145  }
146  };
147  //compute_ppcm(ppcm,b);
148  //if((res==2)&&(comp==2))
149  // for(int i=0;i<b.nbvar();i++)
150  // if(m.GetDegree(i)>0)
151  // nobplus=nobplus && !IsinB(my_divmon(m,i,b),b);
152  //cout<<"m1 "<<m1<<" m2 "<<m2<<" resultat "<<((res==2)&&(comp==2))<<endl;
153  //return ((res==2)&&(comp==2)&&nobplus);
154  //cout<<m1<<" < "<<m2<<" res "<<(member(ppcm,m)&&(res==2)&&(comp==2))<<endl;
155 
156  // cout<<"m "<<m<<endl;
157  //il y a un pbm a ne pas refaire les spol deja vu je ne comprends
158  //pas pourquoi voir example caprass
159  #ifdef NO_TWICE
160  return (res==2)&&(comp==2)&&ppcm[m]&&!member(Spoldejavu,m);
161  #else
162  return (res==2)&&(comp==2)&&ppcm.count(m);
163  #endif
164 }
165 
166 template<typename typPk,typename Base,typename typMk>
167 typPk Spolordsup(const typPk &Pk,const Base & b, const typMk & Spoldejavu)
168 {
169  typedef typename typPk::value_type::monom_t mon;
170  //typedef typename typ::order_t O;
171  map<mon,int> ppcm;
172  typPk res;
173  int maxdeg;
174  //cout<<"compute ppcm"<<endl;
175  maxdeg=compute_ppcm(ppcm,b);
176  //cout<<"test goodspol"<<endl;
177  for(typename typPk::const_iterator iter1=Pk.begin();iter1!=Pk.end();iter1++)
178  for(typename typPk::const_iterator iter2=iter1;iter2!=Pk.end();iter2++)
179  if (goodspol(iter1->ind,iter2->ind,ppcm,b,Spoldejavu))
180  {
181  res.push_back(*iter1);
182  res.push_back(*iter2);
183  }
184  return res;
185 }
186 template<typename typP>
187 int minmaxdegP(typP P,int &maxdeg)
188 {
189  int res=Degree(P.front());
190  maxdeg=res;
191  for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
192  {
193  res=(res>Degree(*iter))?Degree(*iter):res;
194  maxdeg=(maxdeg<Degree(*iter))?Degree(*iter):maxdeg;
195  }
196  return res;
197 }
198 template<typename typP>
199 typP Crochet(const typP &P, int k)
200 {
201  typP res;
202  for(typename typP::const_iterator iter=P.begin();iter!=P.end();iter++)
203  {
204  if(Degree(*iter)==k) res.push_back(*iter);
205  }
206  return res;
207 }
208 
209 template<typename mon, typename T, typename monomial_server>
210 std::list<pol<mon,T> > Crochet(const std::list<pol<mon,T> > &P, int k,
211  monomial_server &serv)
212 {
213  std::list<pol<mon,T> > res;
214  for(typename std::list<pol<mon,T> >::const_iterator iter=P.begin()
215  ;iter!=P.end();iter++)
216  {
217  if(Degree(*iter,serv)==k) res.push_back(*iter);
218  }
219  return res;
220 }
221 
222 template<typename typP, typename Base>
223 void Setnbvars(const typP &tmpPk,Base& b)
224 {
225  int tmpvar=0;
226  for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
227  for(typename typP::value_type::const_iterator iterpol=iter->begin();
228  iterpol!=iter->end();iterpol++)
229  if(tmpvar<lvar(iterpol->rep)) tmpvar=lvar(iterpol->rep);
230  b.nbvars=tmpvar+1;
231 }
232 
233 template<typename typP, typename typMk, typename Base,
234  typename monomial_server>
235 void DoBaseMk(const typP &tmpPk, typMk &Mk, Base &b, monomial_server &serv)
236 {
237  typedef typename typMk::value_type mon;
238  typename Base::predicat_t tmp;
239  int i=0;
240  //int tmpvar=0;
241 
242  for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
243  {
244  mon tmp(choice(*iter,b,serv));
245  int yes=1;
246  // cout<<"pol dans DoBaseMk "<<endl<<*iter<<endl<<"g choisi "<<tmp<<endl;
247  tmp.SetCoeff(1);//*=mon(1/tmp.GetCoeff());
248  for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
249  if(*iter==tmp) {yes=0;break;};
250  if(yes) Mk.push_back(tmp);
251  }
252  //cout<<"Mk.size()"<<Mk.size()<<endl;
253  tmp.taille2=Mk.size();
254  tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(tmp.taille2*sizeof(mon));
255  tmp.taille1=1;
256  tmp.accept=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
257  // cout<<"mon(1) "<<mon(1)<<endl;
258  tmp.accept[0]=mon(1);
259  //cout<<"tmp.accept "<<tmp.accept[0]<<endl;
260  i=0;//pour en etre bien sur
261  for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++,i++)
262  {
263  tmp.refuse[i]=*iter;
264  };
265  if(!b.def.empty())
266  {
267  typename Base::predicat_t verytmp;
268  for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
269  {
270  verytmp=*iter;
271  MAC_REV_FREE<mon>(verytmp.refuse,verytmp.taille2*sizeof(mon));
272  MAC_REV_FREE<mon>(verytmp.accept,verytmp.taille1*sizeof(mon));
273  }
274  b.erase(b.begin(),b.end());
275  }
276  b.def.push_back(tmp);
277  return;
278 }
279 
280 template <typename typPk,typename typMk,typename typmat >
281 typmat*
282 MatrixOf(const typPk & L,
283  const typMk & lm,const typmat &mat)
284 {
285  typedef typename typPk::value_type POL;
286  typedef typename typMk::value_type monom_t;
287  typmat *res=NULL;
288  map<monom_t,int> index;
289  int l=1;
290  if (res!=NULL) {delete res;};
291  for(typename typMk::const_iterator m = lm.begin(); m!=lm.end(); m++){
292  index[*m]=l;
293  l++;
294  }
295  int c;
296  res=new typmat(L.size(),lm.size());
297  l=0;
298  // cout<<"L.size() "<<L.size()<<" lm.size() "<<lm.size()<<endl;
299  for(typename typPk::const_iterator pi = L.begin(); pi != L.end(); ++pi){
300  for(typename POL::const_iterator m = pi->begin(); m!=pi->end(); m++)
301  {
302 
303  if((index.count(*m)))
304  {
305  c=index[*m];
306  (*res)(l,c-1,m->GetCoeff());
307  }
308  }
309  l++;
310  }
311  return res;
312 }
313 
314 template<typename typMat,typename typP,typename typPk,typename typMk, typename Base,typename typdump, class monomial_server, typename workspace>
315 void init_algo(typP &P,int &nouveaumon, int &maxdeg, int & k,
316  typPk &Pk, typMk & Mk, Base & b, typdump & dump, workspace &w,
317  monomial_server &serv)
318 {
319  typedef typename typPk::value_type pol;
320  typedef typename pol::coeff_t coeff;
321  typedef typename pol::monom_t mon;
322  const typename typP::value_type::order_t (tmpord)(const mon,const mon);
323  typP tmpPk=P;
324  pol debugpol;
325  typMat *Mat;
326  int *pr,*pc,flag=1;
327  serv.setorder(my_ord);
328  nouveaumon=1;
329  Setnbvars(P,b);
330  init_space(&w);
331 #ifdef unimul
332  serv.init_multiple(b.nbvars);
333 #endif
334 #ifdef uninf
335  serv.init_nf(b.nbvars);
336 #endif
337  flag=1;
338 while(flag)
339  {
340  Mk.erase(Mk.begin(),Mk.end());
341  k=minmaxdegP(tmpPk,maxdeg);
342  tmpPk=Crochet(tmpPk,k);
343  DoBaseMk(tmpPk,Mk,b,serv);
344  Mat=MatrixOf(tmpPk,Mk,typMat());
345  tmpPk=Solve(*Mat,tmpPk,&pr,&pc);
346  selectnozero(tmpPk);
347  stab(tmpPk);
348  if(rank(*Mat)==(int)tmpPk.size()) flag=0;
349  Mat->destroystore();
350  delete(Mat);
351  free(pr);
352  free(pc);
353  }
354  for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
355  Pk.push_back(convert<pol>(*iter,b,serv));
356  Dump(Pk,dump);
357  return ;
358 }
359 
360 template<typename pol,typename coeff, typename workspace,typename typserv>
361 void inline my_plus(pol &res,const pol & nf,const coeff toto,workspace *w,
362  typserv &serv)
363 {
364  typedef typename pol::monom_t mon;
365  typedef typename mon::coeff_t mcoeff_t;
366  //symbolic size
367  int i=0,j=0,k=0,p=0,q=0;
368  int slicep[omp_get_max_threads()+1];
369  int sliceq[omp_get_max_threads()+1];
370  int tmpsize=0,tmp;
371  mcoeff_t *tmpnf,*tmpspace,zero=0;
372  unsigned char *tmpnfind;
373  cout<<"toto "<<toto<<endl;
374  cout<<"res "<<invconv<Poly>(res,serv)<<endl;
375  cout<<"nf "<<invconv<Poly>(nf,serv)<<endl;
376  if(res.sizenf<=nf.sizenf)
377  {
378  // cout<<"res.sizenf<nf.sizenf "<<endl;
379  if(w->sizenf<nf.sizenf)
380  increase_space(w);
381  for(i=0;i<omp_get_max_threads()+1;i++)
382  {
383  slicep[i]=0;
384  sliceq[i]=0;
385  }
386 #pragma omp parallel for shared(w,toto,slicep,sliceq)
387  for(i=0;i<res.sizenf;i++)
388  {
389  slicep[omp_get_thread_num()+1]+=nbbits[res.nfind[i]];
390  sliceq[omp_get_thread_num()+1]+=nbbits[nf.nfind[i]];
391  }
392  for(i=1;i<omp_get_thread_num()+1;i++)
393  {
394  slicep[i]+=slicep[i-1];
395  sliceq[i]+=sliceq[i-1];
396  }
397 #pragma omp parallel for shared(w,toto,slicep,sliceq) firstprivate(p,q)
398  for(i=0;i<res.sizenf;i++)
399  {
400  if(res.nfind[i]|nf.nfind[i])
401  {
402  w->tabnf[i]=res.nfind[i]|nf.nfind[i];
403  for(int j=0;j<8;j++)
404  {
405  if ((res.nfind[i]>>j)&1)
406  w->tabcoeff[8*i+j]=
407  res.nf[p++ +slicep[omp_get_thread_num()]];
408  if((nf.nfind[i]>>j)&1)
409  w->tabcoeff[8*i+j]-=toto*nf.nf[q++
410  +sliceq[omp_get_thread_num()]];
411  if(Iszero(w->tabcoeff[8*i+j]))
412  w->tabnf[i]&=~(1<<j);
413  }
414  }
415  }
416  // cout<<"slsliceq[omp_get_max_threads()] "<<sliceq[omp_get_max_threads()]<<endl;
417  //int ttmp=0;
418  //for(int j=0;j<res.sizenf;j++)
419  // ttmp+=nbbits[nf.nfind[j]];
420  //cout<<" ttmp "<<ttmp<<endl;
421  q=sliceq[omp_get_max_threads()];
422 //#pragma omp parallel for shared(w,toto)
423  for(i=res.sizenf;i<nf.sizenf;i++)
424  {
425  if(nf.nfind[i])
426  for(int j=0;j<8;j++)
427  if ((nf.nfind[i]>>j)&1)
428  if (!Iszero(nf.nf[q++]))
429  w->tabcoeff[8*i+j]=((mcoeff_t)-1)*toto*(nf.nf[q-1]);
430  else
431  w->tabnf[i]&=~(1<<j);
432  w->tabnf[i]=nf.nfind[i];
433  }
434  for(int i=0;i<nf.sizenf;i++)
435  tmpsize+=nbbits[w->tabnf[i]];
436  res.nf=(COEFF*)MAC_REV_REALLOC<COEFF>(res.nf,res.size*sizeof(COEFF)
437  ,tmpsize*sizeof(COEFF));
438  res.size=tmpsize;
439  res.nfind=(unsigned char*)realloc(res.nfind,nf.sizenf);
440  res.sizenf=nf.sizenf;
441 
442  for(int i=0;i<nf.sizenf;i++)
443  {
444  if(w->tabnf[i])
445  for(int j=0;j<8;j++)
446  if ((w->tabnf[i]>>j)&1)
447  //if (!Iszero(w->tabcoeff[8*i+j]))
448  {
449  res.nf[k++]=w->tabcoeff[8*i+j];
450  w->tabcoeff[8*i+j]=zero;
451  }
452  //else
453  // w->tabnf[i]&=~(1<<j);
454  res.nfind[i]=w->tabnf[i];
455  w->tabnf[i]=0;
456  }
457  cout<<"le resultat "<<invconv<Poly>(res,serv)<<endl;
458  }
459  else
460  {
461  if(w->sizenf<res.sizenf)
462  increase_space(w);
463  for(i=0;i<omp_get_max_threads()+1;i++)
464  {
465  slicep[i]=0;
466  sliceq[i]=0;
467  }
468  //#pragma omp parallel for shared(w,toto,slicep,sliceq)
469  for(i=0;i<nf.sizenf;i++)
470  {
471  slicep[omp_get_thread_num()+1]+=nbbits[res.nfind[i]];
472  sliceq[omp_get_thread_num()+1]+=nbbits[nf.nfind[i]];
473  }
474  for(i=1;i<omp_get_thread_num()+1;i++)
475  {
476  slicep[i]+=slicep[i-1];
477  sliceq[i]+=sliceq[i-1];
478  }
479  //#pragma omp parallel for shared(w,toto,slicep,sliceq) firstprivate(p,q)
480  for(i=0;i<nf.sizenf;i++)
481 #if 1
482  {
483  if(res.nfind[i])
484  {
485  unsigned char mask=1;
486  w->tabnf[i]=res.nfind[i];
487  if(res.nfind[i]==255)
488  for(int j=0;j<8;j++)
489  w->tabcoeff[8*i+j]=res.nf[p++];
490  else
491  for(int j=0;j<8;j++,mask<<=1)
492  {
493  //if ((res.nfind[i]>>j)&1)
494  if (res.nfind[i]&mask)
495  w->tabcoeff[8*i+j]=res.nf[p++];
496  }
497  }
498  if(nf.nfind[i])
499  {
500  unsigned char mask=1;
501  w->tabnf[i]|=nf.nfind[i];
502  if(nf.nfind[i]==255)
503  for(int j=0;j<8;j++,mask<<=1)
504  {
505  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
506  if(Iszero(w->tabcoeff[8*i+j]))
507  w->tabnf[i]&=~mask;
508  }
509  else
510  for(int j=0;j<8;j++,mask<<=1)
511  {
512  if(nf.nfind[i]&mask)
513  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
514  if(Iszero(w->tabcoeff[8*i+j]))
515  w->tabnf[i]&=~mask;
516  }
517  }
518  }
519 #endif
520 #if 0
521  if(res.nfind[i]|nf.nfind[i])
522  {
523  w->tabnf[i]=res.nfind[i]|nf.nfind[i];
524  for(int j=0;j<8;j++)
525  {
526  if ((res.nfind[i]>>j)&1)
527  {
528  w->tabcoeff[8*i+j]=res.nf[p++];
529  }
530  if((nf.nfind[i]>>j)&1)
531  w->tabcoeff[8*i+j]-=toto*nf.nf[q++];
532  if(Iszero(w->tabcoeff[8*i+j]))
533  w->tabnf[i]&=~(1<<j);
534  }
535  }
536 #endif
537  // p=slicep[omp_get_max_threads()];
538 //#pragma omp parallel for shared(w,toto)
539  for(i=nf.sizenf;i<res.sizenf;i++)
540  {
541  if(res.nfind[i])
542  for(int j=0;j<8;j++)
543  if ((res.nfind[i]>>j)&1)
544  if (!Iszero(res.nf[p++]))
545  w->tabcoeff[8*i+j]=res.nf[p-1];
546  else
547  w->tabnf[i]&=~(1<<j);
548  w->tabnf[i]=res.nfind[i];
549  }
550  for(int i=0;i<res.sizenf;i++)
551  tmpsize+=nbbits[w->tabnf[i]];
552  res.nf=(COEFF*)MAC_REV_REALLOC<COEFF>(res.nf,res.size*sizeof(COEFF)
553  ,tmpsize*sizeof(COEFF));
554  res.size=tmpsize;
555  // res.nfind=(unsigned char*)realloc(res.nfind,nf.sizenf);
556  //res.sizenf=nf.sizenf;
557  for(int i=0;i<res.sizenf;i++)
558  {
559  if(w->tabnf[i])
560  for(int j=0;j<8;j++)
561  if ((w->tabnf[i]>>j)&1)
562  //if (!Iszero(w->tabcoeff[8*i+j]))
563  {
564  res.nf[k++]=w->tabcoeff[8*i+j];
565  w->tabcoeff[8*i+j]=zero;
566  }
567  //else
568  // w->tabnf[i]&=~(1<<j);
569 
570  res.nfind[i]=w->tabnf[i];
571  w->tabnf[i]=0;
572  }
573  }
574 
575 #ifdef DEB
576  cout<<"k "<<k<<" tmpsize "<<tmpsize<<endl;
577  int cpt=0;
578  for(int i=0;i<res.sizenf;i++)
579  if(res.nfind[i])
580  for(int j=0;j<8;j++)
581  if ((res.nfind[i]>>j)&1)
582  if (Iszero(res.nf[cpt++]))
583  cout<<"j'ai fait n'importe quoi ici"<<endl;
584  cout<<"les resultat "<<endl<<invconv<Poly>(res)<<endl;
585 #endif
586  return;
587 }
588 template<typename pol,typename coeff>
589 void inline my_plus(pol &res,const pol & nf,const coeff toto,int removeme)
590 {
591  typedef typename pol::monom_t mon;
592  typedef typename mon::coeff_t mcoeff_t;
593  //symbolic size
594  int i=0,j=0,k=0,p=0,q=0;
595  int tmpsize=0,tmp;
596  mcoeff_t *tmpnf,*tmpspace;
597  unsigned char *tmpnfind;
598 #ifdef DEB
599  cout<<"dans myplus je calcul"<<endl<<invconv<Poly>(res,serv)<<endl<<
600  "toto "<<toto<<endl<<"nf"<<endl<<invconv<Poly>(nf,serv)<<endl;
601 #endif
602  if(res.sizenf<nf.sizenf)
603  {
604  tmpspace=(mcoeff_t*)
605  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*nf.sizenf*8);
606  for(int i=0;i<nf.sizenf*8;i++)
607  tmpspace[i]=0;
608  for(int i=0;i<res.sizenf;i++)
609  tmpsize+=nbbits[res.nfind[i]|nf.nfind[i]];
610  for(int i=0;i<nf.sizenf;i++)
611  tmpsize+=nbbits[nf.nfind[i]];
612  tmpnf=(mcoeff_t*)
613  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*tmpsize);
614  tmpnfind=(unsigned char*)
615  MAC_REV_MALLOC<unsigned char>(nf.sizenf);
616  // memset(tmpnfind,0,nf.sizenf);
617 
618  for(int i=0;i<res.sizenf;i++)
619  {
620  if(res.nfind[i]|nf.nfind[i])
621  for(int j=0;j<8;j++)
622  {
623  if ((res.nfind[i]>>j)&1)
624  tmpspace[8*i+j]=res.nf[p++];
625  if((nf.nfind[i]>>j)&1)
626  tmpspace[8*i+j]-=toto*nf.nf[q++];
627  }
628  tmpnfind[i]=res.nfind[i]|nf.nfind[i];
629  }
630 
631  for(int i=res.sizenf;i<nf.sizenf;i++)
632  {
633  if(nf.nfind[i])
634  for(int j=0;j<8;j++)
635  if ((nf.nfind[i]>>j)&1)
636  tmpspace[8*i+j]=((mcoeff_t)-1)*toto*(nf.nf[q++]);
637  tmpnfind[i]=nf.nfind[i];
638  }
639  for(int i=0;i<nf.sizenf;i++)
640  if(tmpnfind[i])
641  for(int j=0;j<8;j++)
642  if ((tmpnfind[i]>>j)&1)
643  if (!Iszero(tmpspace[8*i+j]))
644  tmpnf[k++]=tmpspace[8*i+j];
645  else
646  tmpnfind[i]&=~(1<<j);
647  MAC_REV_FREE<mcoeff_t>(tmpspace,nf.sizenf*8*sizeof(mcoeff_t));
648  res.sizenf=nf.sizenf;
649  }
650  else
651  {
652  tmpspace=(mcoeff_t*)
653  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*res.sizenf*8);
654  for(int i=0;i<res.sizenf*8;i++)
655  tmpspace[i]=0;
656  for(int i=0;i<nf.sizenf;i++)
657  tmpsize+=nbbits[res.nfind[i]|nf.nfind[i]];
658  for(int i=0;i<res.sizenf;i++)
659  tmpsize+=nbbits[res.nfind[i]];
660  tmpnf=(mcoeff_t*)
661  MAC_REV_MALLOC<mcoeff_t>(sizeof(mcoeff_t)*tmpsize);
662  tmpnfind=(unsigned char*)
663  MAC_REV_MALLOC<unsigned char>(res.sizenf);
664 
665  for(int i=0;i<nf.sizenf;i++)
666  {
667  if(res.nfind[i]|nf.nfind[i])
668  for(int j=0;j<8;j++)
669  {
670  if((res.nfind[i]>>j)&1)
671  tmpspace[8*i+j]=res.nf[p++];
672  if((nf.nfind[i]>>j)&1)
673  tmpspace[8*i+j]-=toto*nf.nf[q++];
674  }
675  tmpnfind[i]=res.nfind[i]|nf.nfind[i];
676  }
677 
678  for(int i=nf.sizenf;i<res.sizenf;i++)
679  {
680  if(res.nfind[i])
681  for(int j=0;j<8;j++)
682  if((res.nfind[i]>>j)&1)
683  tmpspace[8*i+j]=res.nf[p++];
684  tmpnfind[i]=res.nfind[i];
685  }
686 
687  for(int i=0;i<res.sizenf;i++)
688  if(tmpnfind[i])
689  for(int j=0;j<8;j++)
690  if ((tmpnfind[i]>>j)&1)
691  if (!Iszero(tmpspace[8*i+j]))
692  tmpnf[k++]=tmpspace[8*i+j];
693  else
694  tmpnfind[i]&=~(1<<j);
695 
696  MAC_REV_FREE<mcoeff_t>(tmpspace,res.sizenf*8*sizeof(mcoeff_t));
697  }
698 #ifdef DEB
699  cout<<"k "<<k<<" tmpsize "<<tmpsize<<endl;
700 #endif
701  MAC_REV_FREE<mcoeff_t>(res.nf,res.size*sizeof(mcoeff_t));
702  //res.nf=tmpnf;
703  MAC_REV_FREE<unsigned char>(res.nfind,res.sizenf);
704  //res.nfind=tmpnfind;
705 
706  res.nf=tmpnf;
707  res.nf=(mcoeff_t*)MAC_REV_REALLOC<mcoeff_t>(res.nf,res.size*sizeof(mcoeff_t)
708  ,k*sizeof(mcoeff_t));
709 
710  //cout<<"tmpnfind "<<tmpnfind<<endl;
711  res.nfind=tmpnfind;
712  // cout<<"res.nfind "<<res.nfind<<endl;
713  res.size=k;
714 #ifdef DEB
715  int cpt=0;
716  for(int i=0;i<res.sizenf;i++)
717  if(tmpnfind[i])
718  for(int j=0;j<8;j++)
719  if ((tmpnfind[i]>>j)&1)
720  if (Iszero(res.nf[cpt++]))
721  cout<<"j'ai fait n'importe quoi ici"<<endl;
722  cout<<"les resultat "<<endl<<invconv<Poly>(res,serv)<<endl;
723 #endif
724  return;
725 }
726 
727 //#undef DEB
728 //renvoit l'indice du monome x_i*m_j
729 template<typename mon,typename Base>
730 int indice2(int i,int j,const Base & b)
731 {
732  int res=-1;
733  mon tmp;
734  int2mon(j,tmp);
735  tmp*=mon(i,1);//on suppose qd meme que j correspond a qqchose
736  //cout<<"indice2 IsinB("<<mon(i,1)*tmp<<",b) "<<IsinB(mon(i,1)*tmp,b)<<endl;
737  if(IsinB(tmp,b))
738  {
739  res=mon2int(tmp);
740  // cout<<"le monome "<<mon(i,1)*tmp<<" l'indice "<<res<<endl;
741  }
742  return res;
743 }
744 
745 //on lui donne l'ensemble des formes normales, dump, l'indice de b(cf ci dessus)
746 // le numero de la variable par laquelle on multiplie
747 //et elle renvoie un pol(cf def du type) sur la forme normale de var*m_{indmon}
748 #ifndef uninf
749 template<typename typpol,typename typdump,typename Base>
750 typpol nf(int var ,int indmon,const typdump &dump,const Base & b)
751 {
752  //on cherche dans dump...
753  //a optimiser plus tard
754  typedef typename typdump::value_type dumpstruct;
755  typedef typpol pol;
756  typedef typename pol::monom_t mon;
757  pol res;
758  res.nf=NULL;
759  res.size=-1;
760  mon tmpmon;//=mon(1,var)*int2mon<mon>(indmon);
761  int deg=0;//=tmpmon.GetDegree()+1;
762  typename typdump::const_iterator iter;
763  int2mon(indmon,tmpmon);
764  deg=tmpmon.GetDegree()+1;
765  //cout<<"mon("<<var<<",1) "<<mon(var,1)<<" et deg "<<deg<<endl;
766  tmpmon*=mon(var,1);
767  for(iter=dump.begin();
768  (iter!=dump.end()) && (iter->k!=deg);iter++);
769  // cout<<"iter-k "<<iter->k<<endl;
770  // if(iter!=dump.end()) cout<<"iter->k en sortie "<<iter->k<<" et deg "<<deg<<endl;
771  //cout<<"valuer a la sortie "<<(--iter)++->k<<endl;
772  // cout<<"iter!=dump.end() "<<(iter!=dump.end())
773  // <<" dump.empty() "<<dump.empty()<<endl;
774  if(iter!=dump.end())//on cherche pas n'importe quoi qd meme
775  {
776  int i;
777  for(i=0;i<iter->size;i++)
778  {
779  // cout<<"dans nf iter->nf[i].ind "<<iter->nf[i].ind<<endl;
780  if(iter->nf[i].ind.rep==tmpmon.rep)
781  break;
782  }
783  if(i!=iter->size)
784  //Tue Dec 4 16:39:25 MET 2001
785  // densify(iter->nf[i],res);
786 
787  res=(iter->nf[i]);
788  }
789  //cout<<"la gueule de res "<<res<<endl;
790  //if (res!=NULL) cout<<"suite de res "<<res->ind<<" "<<res->nf<<endl;
791  return res;
792 }
793 #endif
794 
795 void getperm(int *perm, int sizeperm, int *indextab)
796 {
797  int median=indextab[sizeperm/2],i,j=sizeperm-1;
798  if(1)
799  for(i=0;i<=j;i++)
800  if(indextab[i]>median)
801  {
802  int tmp=indextab[j];
803  indextab[j]=indextab[i];
804  indextab[i]=tmp;
805  j--;i--;
806  }
807  perm[sizeperm/2]=sizeperm-i;
808  getperm(perm,sizeperm-i-1,indextab);
809  getperm(perm+sizeperm-i,i,indextab+sizeperm-i);
810 }
811 
812 //effectue la multiplication du pol T par la variable x_i
813 template<typename typpol,typename typdump,typename Base,typename mon,
814  typename workspace, typename monomial_server>
815 typpol inline mult(int i,const typpol &pol,const typdump &dump,
816  const Base &b,mon **exce,int &exsize,workspace &w,
817  monomial_server &serv)
818 {
819  typedef typename typpol::coeff_t coeff;
820  static const mon monzero=mon(0);
821  static COEFF zero=0;
822  typpol ret;
823  (*exce)=(mon*)MAC_REV_MALLOC<mon>((pol.size+1)*sizeof(mon));
824  int *stockindicetab=(int*)malloc(pol.size*sizeof(int));
825  int noquo=0,maxind=0,p=0,q=0;
826  coeff *tmpspace;
827  // for(int i=0;i<w.sizenf;i++)
828  // p+=nbbits[w.tabnf[i]];
829  for(int j=0;j<pol.sizenf;++j)
830  if (pol.nfind[j])
831  {
832  for(int k=0;k<8;k++)
833  if((pol.nfind[j]>>k)&1)
834  {
835  int stockindice2=mulind(8*j+k,i,b);
836  if(stockindice2<0)
837  stockindice2=-1*(8*j+k)-1;
838  stockindicetab[p++]=stockindice2;
839 
840  // cout<<"stockindice2 "<<stockindice2<<" pol.size "<<
841  //pol.size<<" J "<<j<<endl;
842  if (stockindice2>=maxind)
843  maxind=stockindice2;
844  }
845  }
846  //cout<<"p "<<p<<" pol.size "<<pol.size<<endl;
847  for(;maxind/8+1>=w.sizenf;increase_space(&w));
848  //tmpspace=(coeff*)MAC_REV_MALLOC<coeff>((maxind/8+1)*8*sizeof(coeff));
849  //ret.sizenf=(maxind/8+1);
850  //ret.nfind=(unsigned char*)MAC_REV_MALLOC<unsigned char>(ret.sizenf);
851  //memset(ret.nfind,0,ret.sizenf);
852 
853 
854 
855  //for(int j=0;j<ret.sizenf*8;j++)
856  // tmpspace[j]=0;
857 #ifdef DEB
858  q=0;
859  for(int j=0;j<p;j++)
860  q+=nbbits[pol.nfind[j]];
861  cout<<" a '"<<q<<endl;
862 #endif
863  int j;
864 //#pragma omp parallel for shared(stockindicetab,w,serv)
865  for(j=0;j<p;j++)
866  if(stockindicetab[j]>=0)
867  {
868 
869 #ifdef DEB
870  mon tmpmm;
871  int2mon(stockindicetab[j],tmpmm);
872  cout<<"le monome la "<<tmpmm<<" "<<pol.nf[j]<<endl;
873 #endif
874  w.tabcoeff[stockindicetab[j]]+=pol.nf[j];
875  if(!Iszero(w.tabcoeff[stockindicetab[j]]))
876  w.tabnf[stockindicetab[j]/8]|=1<<(stockindicetab[j]%8);
877  }
878  else
879  {
880  // cout<<"ici aussi"<<endl;
881  typpol tmp;
882  tmp=serv.nf(i,-1*(stockindicetab[j]+1),dump,b);
883  if (tmp.size!=-1)
884  {
885  int compteurtmp=0;
886  //On fait un plus dense dans tmpspace
887  for(;tmp.sizenf>=w.sizenf;increase_space(&w));
888 // if(tmp.sizenf>res.sizenf)
889 // {
890 // ret.nfind=(unsigned char*)realloc(ret.nfind,tmp.sizenf);
891 // for(int k=ret.sizenf;k<tmp.sizenf;k++)
892 // ret.nfind[k]=0;
893 // tmpspace=(coeff*)MAC_REV_REALLOC<coeff>(tmpspace,
894 // ret.sizenf*8*sizeof(coeff),
895 // tmp.sizenf*8*sizeof(coeff));
896 // for(int k=ret.sizenf*8;k<tmp.sizenf*8;k++)
897 // tmpspace[k]=0;
898 // ret.sizenf=tmp.sizenf;
899 
900 // //normalement on ne devrait JAMAIS passer par la
901 // }
902 #if 1
903  int k,l;
904  unsigned *tmpptr=(unsigned*)tmp.nfind;
905  unsigned mask=1;
906  for(k=0;k<tmp.sizenf/sizeof(unsigned);k++)
907  if(tmpptr[k])
908  {
909  ((unsigned*)w.tabnf)[k]|=tmpptr[k];
910  mask=1;
911  for(l=0;l<8*sizeof(unsigned);l++,mask<<=1)
912  {
913  if(tmpptr[k]&mask)
914  w.tabcoeff[8*sizeof(unsigned)*k+l]
915  -=pol.nf[j]*tmp.nf[compteurtmp++];
916  // if(Iszero(w.tabcoeff[8*k*sizeof(unsigned)+l]))
917  // ((unsigned*)w.tabnf)[k]&=~mask;
918  }
919  }
920  for(k=tmp.sizenf-(tmp.sizenf%sizeof(unsigned))
921  ;k<tmp.sizenf;k++)
922  if(tmp.nfind[k])
923  {
924  w.tabnf[k]|=tmp.nfind[k];
925  mask=1;
926  for(l=0;l<8;l++,mask<<=1)
927  {
928  if(tmp.nfind[k]&mask)
929  w.tabcoeff[8*k+l]-=pol.nf[j]*tmp.nf[compteurtmp++];
930  //if(Iszero(w.tabcoeff[8*k+l]))
931  // w.tabnf[k]&=~mask;
932  }
933  }
934 #endif
935 #if 0
936  for(int k=0;k<tmp.sizenf;k++)
937  {
938  if(tmp.nfind[k])
939  {
940  if(tmp.nfind[k]==255)
941  {
942  unsigned char mask=1;
943  w.tabnf[k]|=tmp.nfind[k];
944  for(int l=0;l<8;l++,mask<<=1)
945  {
946  w.tabcoeff[8*k+l]-=
947  pol.nf[j]*tmp.nf[compteurtmp++];
948  if(Iszero(w.tabcoeff[8*k+l]))
949  w.tabnf[k]&=~mask;
950  }
951  }
952  else
953  {
954  unsigned char mask=1;
955  w.tabnf[k]|=tmp.nfind[k];
956  for(int l=0;l<8;l++,mask<<=1)
957  if(tmp.nfind[k]&mask)
958  {
959  w.tabcoeff[8*k+l]-=
960  pol.nf[j]*tmp.nf[compteurtmp++];
961  if(Iszero(w.tabcoeff[8*k+l]))
962  w.tabnf[k]&=~mask;
963  }
964  }
965  }
966 
967  }
968 #endif
969  }
970  else
971  {
972  mon tmpmon;
973  (*exce)[noquo]=mon(i,1);
974  int2mon(-1*(stockindicetab[j]+1),tmpmon);
975  (*exce)[noquo]*=tmpmon;//int2mon<mon>(j);
976  (*exce)[noquo]*=pol.nf[j];
977  ++noquo;
978  };
979  }
980  ret.ind=pol.ind;
981  ret.ind*=mon(i,1);
982  (*exce)[noquo++]=ret.ind;
983  exsize=noquo;
984  (*exce)=(mon*)MAC_REV_REALLOC<mon>((*exce),(pol.size+1)*sizeof(mon)
985  ,(noquo)*sizeof(mon));
986 #ifdef DEB
987  for(int j=0;j<exsize;j++)
988  cout<<" "<<(*exce)[j];
989  cout<<endl;
990 #endif
991  ret.ind.SetCoeff(noquo+1);
992  ret.size=0;
993  p=0;
994  for(int j=0;j<w.sizenf;j++)
995  if(w.tabnf[j])
996  {
997  ret.size+=nbbits[w.tabnf[j]];
998  p=j;
999  }
1000 #ifdef DEB
1001  cout<<" val p "<<p<<" et pol.size "<<pol.size<<endl;
1002 #endif
1003  ret.nf=(coeff*)MAC_REV_MALLOC<coeff>(ret.size*sizeof(coeff));
1004  ret.sizenf=p+1;
1005  ret.nfind=(unsigned char *)malloc(ret.sizenf);
1006  p=0;
1007  for(int j=0;j<ret.sizenf;j++)
1008  {
1009  ret.nfind[j]=w.tabnf[j];
1010  if(w.tabnf[j])
1011  for(int k=0;k<8;k++)
1012  if((w.tabnf[j]>>k)&1)
1013  {
1014  if(!Iszero(w.tabcoeff[8*j+k]))
1015  {
1016  ret.nf[p++]=w.tabcoeff[8*j+k];
1017  w.tabcoeff[8*j+k]=zero;
1018  }
1019  else
1020  {
1021  ret.nfind[j]&=~(1<<k);
1022  }
1023  }
1024  w.tabnf[j]=0;
1025  }
1026  ret.nf=(coeff*)MAC_REV_REALLOC<coeff>(ret.nf,ret.size*sizeof(coeff),
1027  p*sizeof(coeff));
1028  ret.size=p;
1029  //MAC_REV_FREE<coeff>(tmpspace,ret.sizenf*8*sizeof(coeff));
1030  free(stockindicetab);
1031 #ifdef DEB
1032  cout<<"ret.size "<<ret.size<<endl;
1033  cout<<invconv<Poly>(ret)<<endl;
1034  cout<<"-----------------------------------"<<endl;
1035  int cpt=0;
1036  for(int i=0;i<ret.sizenf;i++)
1037  if(ret.nfind[i])
1038  for(int j=0;j<8;j++)
1039  if ((ret.nfind[i]>>j)&1)
1040  if (Iszero(ret.nf[cpt++]))
1041  cout<<"nimpici"<<endl;
1042 #endif
1043  return ret;
1044 }
1045 
1046 // renvoit mon/x_i .... mais suppose qu'on ne fait pas n'importe quoi
1047  template <typename Mon,typename Base>
1048 Mon my_divmon(const Mon &mon,int i,const Base& b)
1049 {
1050  Mon res(1);
1051  for(int j=0;j<b.nbvar();j++)
1052  if(i==j)
1053  {
1054  res*=Mon(j,mon.GetDegree(j)-1);
1055  }
1056  else
1057  {
1058  res*=Mon(j,mon.GetDegree(j));
1059  }
1060  return res;
1061 }
1062 
1063 template<typename typmon,typename Base>
1064 int GoodDir(const typmon &m,int i, const Base & b)
1065 {
1066  int j,res=0;
1067  mon tmpm=m*mon(i,1);
1068  //cout<<"dans GoodDir les monomes "<<m<<"********"<<typmon(i,1)<<endl;
1069  //cout<<"b.nbvar() "<<b.nbvar()<<endl;
1070 #pragma omp parallel for shared(tmpm,res)
1071  for(j=0;j<b.nbvar();j++)
1072  {
1073  if(tmpm.GetDegree(j)>=1)
1074  if(IsinB(my_divmon(tmpm,j,b),b)) {res|=1;};
1075  }
1076  //cout<<" le verdict de GoodDir "<<res<<endl;
1077  return res;
1078 }
1079 
1080 //fonction adhoc qui merge une liste de polyalp avec une liste de pol
1081 //en cours de calcul cad liste de pol + liste excedentaire
1082 template<typename typPk,typename typP,typename typexceed,
1083  typename typsize ,typename Base,typename monomial_server>
1084 void conv_merge(typPk &Pk,typP &P,typexceed &ex,typsize &sizeex,
1085  const Base &b, monomial_server &serv)
1086 {
1087  typedef typename typP::value_type polalp;
1088  typedef typename polalp::order_t ord;
1089  typedef typename polalp::monom_t mon;
1090  typedef typename typPk::value_type pol;
1091  typedef typename pol::coeff_t coeff;
1092  coeff * tabcoeff=NULL;
1093  unsigned char *tabindices=NULL;
1094  int tabsize=0,tabnfsize=0;
1095 
1096  for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
1097  {
1098  //cout<<"dans for"<<endl;
1099  int comp=0;int i=0;
1100  pol tmp;
1101  int maxind=0;
1102  tmp.ind=mon(1);
1103  for(typename polalp::iterator iterpol=iter->begin();
1104  iterpol!=iter->end();iterpol++)
1105  if (IsinB(*iterpol,b) && (serv.mon2int(*iterpol)>maxind))
1106  maxind=serv.mon2int(*iterpol);
1107  tabcoeff=(coeff*)MAC_REV_MALLOC<coeff>((maxind+1)*sizeof(coeff));
1108  tabindices=(unsigned char*)malloc(maxind/8+1);
1109 
1110  tabsize=maxind+1;
1111  tabnfsize=maxind/8+1;
1112  memset((void*)tabindices,0,tabnfsize);
1113  maxind=0;
1114  //ici il faudrait un type template
1115  for(i=0;i<tabsize;i++)
1116  {
1117  tabcoeff[i]=0;
1118  }
1119  //memset((void*)tabcoeff,0,tabsize*sizeof(coeff));
1120  //ici aussi
1121  i=0;
1122  mon * tmpex=NULL;
1123  tmpex=(mon*)MAC_REV_REALLOC<mon>((void*)tmpex,0,iter->size()
1124  *sizeof(mon));
1125 
1126  for(typename polalp::iterator iterpol=iter->begin();
1127  iterpol!=iter->end();iterpol++)
1128  {
1129 #ifdef BONRAJOUT
1130  cout<<"IsinB("<<*iterpol<<","<<"b)"<<IsinB(*iterpol,b)<<endl;
1131 #endif
1132  if (IsinB(*iterpol,b))
1133  {
1134 #ifdef BONRAJOUT
1135  cout<<"dedans"<<endl;
1136 #endif
1137  int tmp=serv.mon2int(*iterpol);
1138  tabcoeff[tmp]=iterpol->GetCoeff();
1139  tabindices[tmp/8]|=1<<(tmp%8);
1140  i++;
1141  maxind++;
1142  }
1143  else
1144  {
1145 #ifdef BONRAJOUT
1146  cout<<"y en a un qu'est pas dans B "<<*iterpol<<endl;
1147 #endif
1148  if(!Iszero(iterpol->GetCoeff()))
1149  tmpex[comp++]=*iterpol;
1150  }
1151  }
1152  tmpex=(mon*)MAC_REV_REALLOC<mon>((void*)tmpex,iter->size()*sizeof(mon)
1153  ,(comp+1)*sizeof(mon));
1154  tmp.size=maxind;
1155  tmp.nf=(coeff*)MAC_REV_MALLOC<coeff>(tmp.size*sizeof(coeff));
1156  tmp.nfind=tabindices;
1157  tmp.sizenf=tabnfsize;
1158  tmp.ind=mon(comp+1);
1159  maxind=0;
1160  for(int i=0;i<tabnfsize;i++)
1161  if(tabindices[i])
1162  {
1163  for(int j=0;j<8;j++)
1164  if (((tabindices[i]>>j)&1) && !Iszero(tabcoeff[8*i+j]))
1165  tmp.nf[maxind++]=tabcoeff[8*i+j];
1166  else
1167  tmp.nfind[i]&=~(1<<j);
1168  }
1169  tmp.nf=(coeff*)MAC_REV_REALLOC<coeff>(tmp.nf,tmp.size*sizeof(coeff)
1170  ,maxind*sizeof(coeff));
1171  tmp.size=maxind;
1172  MAC_REV_FREE<coeff>(tabcoeff,tabsize*sizeof(coeff));
1173  Pk.push_back(tmp);
1174  ex.push_back(tmpex);
1175  sizeex.push_back(comp);
1176 #ifdef BONRAJOUT
1177  cout<<"ici dans conv merge"<<endl;
1178  for(int i=0;i<comp;i++)
1179  cout<<tmpex[i]<<" ";
1180  cout<<endl;
1181 #endif
1182  }
1183 }
1184 //member ne test que les exposants pas les coefficients
1185 template<typename typMk>
1186 int member(const typMk & tmpMk,const typename typMk::value_type mon)
1187 {
1188  int res=0;
1189  for(typename typMk::const_iterator iter=tmpMk.begin();
1190  iter!=tmpMk.end();iter++)
1191  if(iter->rep==mon.rep) {res=1;break;}
1192  return res;
1193 }
1194 
1195 template<typename typMat,typename typPk,typename typP,
1196  typename typMk,typename Base,typename typdump,typename typrecall,
1197  typename workspace, typename monomial_server>
1198 int newPkMkMatrixof(typMat &mat,typPk &Pk, typP &P,typMk &Mk,
1199  int &k,Base &b, typdump &dump,typrecall &recall
1200  ,workspace &w, monomial_server &serv)
1201 {
1202  typedef typename typMk::value_type mon;
1203  typedef typename typP::value_type::order_t ord;
1204  typedef typename typPk::value_type pol;
1205  typedef typename pol::coeff_t coeff;
1206  typedef typename typP::value_type polyalp;
1207  typPk tmpPk,workvect;
1208  typMk tmpMk;
1209  list<mon *> exceed;
1210  list<int> sizeexceed;
1211  int nbproj=0,flagdoplus=1,*ncol;
1212  //prise en compte des pol pas encore introduits
1213  cerr<<"k on entering newpkmkmatrixof "<<k<<endl;
1214  typP ttmpP=Crochet(P,k+1);//
1215  typrecall verytmp=Crochet(recall,k+1,serv);
1216  recall.erase(recall.begin(),recall.end());
1217  if (!ttmpP.empty())
1218  {
1219  int tmpdeg;
1220  proj(ttmpP,dump,b,serv);
1221  selectnozero(ttmpP);
1222  nbproj=ttmpP.size();
1223  if (!ttmpP.empty())
1224  {
1225  tmpdeg=minmaxdegP(ttmpP,tmpdeg);
1226  if(tmpdeg<k+1)
1227  {
1228  flagdoplus=0;
1229  cout<<"un des pol de pretendu degre le bon se reduit mal"<<endl;
1230  //en fait a un polynome de degre inferieur
1231  typPk tmpconv;
1232  recover(tmpPk,Mk,dump,tmpdeg);
1233  cout<<"forget "<<tmpdeg<<endl;
1234  recall=verytmp;
1235  forget(b,dump,tmpdeg,recall);
1236  serv.compress(tmpPk,dump,b,tmpdeg);
1237  verytmp.erase(verytmp.begin(),verytmp.end());
1238  ttmpP=Crochet(ttmpP,tmpdeg);
1239  nbproj=ttmpP.size();
1240  Mk.erase(Mk.begin(),Mk.end());
1241  for (typename typPk::iterator iterpk=tmpPk.begin();
1242  iterpk!=tmpPk.end();iterpk++)
1243  {
1244  // cout<<"iterpk->ind "<<iterpk->ind
1245  // <<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl;
1246  if (IsinB(iterpk->ind,b))
1247  {
1248  for(typename Base::iterator iterb=b.begin()
1249  ;iterb!=b.end();iterb++)
1250  {
1251  iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
1252  (iterb->refuse,(iterb->taille2)*sizeof(mon),
1253  (iterb->taille2+1)*sizeof(mon));
1254  iterb->refuse[iterb->taille2]=iterpk->ind;
1255  iterb->refuse[iterb->taille2].SetCoeff(1);
1256  iterb->taille2++;
1257  }
1258  }
1259  }
1260  for(typename typPk::iterator iter=tmpPk.begin()
1261  ;iter!=tmpPk.end();iter++)
1262  {
1263  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
1264  *tmp=iter->ind;
1265  tmpMk.push_back(*tmp);
1266  exceed.push_back(tmp);
1267  sizeexceed.push_back(1);
1268  // cout<<"pour Mk iter->ind "<<iter->ind<<endl;
1269  }
1270  //on vient de chuter de
1271  //degre et on a reconstitue les bons mk et pk
1272  k=tmpdeg-1;
1273  //Dump(Pk,dump);
1274  }
1275  }
1276  }
1277  if(flagdoplus)
1278  {
1279 #ifdef unimul
1280  serv.reinit_multiple();
1281 #endif
1282 #ifdef uninf
1283  serv.reinit_nf();
1284 #endif
1285 
1286  //list<mon> dejavu;
1287  //construction des pol ord sup
1288 //
1289 // Problewme de gestion des accumulateurs ici
1290 int i;
1291 //#pragma omp parallel for shared(tmpPk,tmpMk,exceed,sizeexceed) private(i)
1292 for(i=0;i<b.nbvar();i++)
1293  {
1294 
1295  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1296  {
1297  //cout<<"avant gooddir l'ind "<<iter->ind<<" et i "<<i<<endl;
1298  if(GoodDir((*iter).ind,i,b))
1299  {
1300  mon tmpmon=iter->ind*mon(i,1);
1301  tmpmon.SetCoeff(1);
1302  //cout<<"tmpmon ici "<<tmpmon<<endl;
1303  if(!member(tmpMk,tmpmon))
1304  {
1305  //
1306  //ici aussi rendre les op atomic ne suffit pas
1307  //il faut aussi faire l'ajout.
1308  //#pragma omp atomic
1309  typename typrecall::iterator iterrec;
1310 
1311  mon * tmp=NULL;
1312  int tmpsize;
1313  //cout<<"avant mult"<<endl;
1314  pol stockmult=mult(i,*iter,dump,b,&tmp,tmpsize,w
1315  ,serv);
1316 
1317 
1318 
1319  //attention le coefficient de ind est la taille de
1320  // l'exceed correspondant
1321 #ifdef DEB
1322  cout<<"apres mult "<<tmpsize<<endl;
1323 #endif
1324 //#pragma omp critical
1325  {
1326  tmpMk.push_back(tmpmon);
1327  tmpPk.push_back(stockmult);
1328  exceed.push_back(tmp);
1329  sizeexceed.push_back(tmpsize);
1330  }
1331  }
1332  }
1333  }
1334  }
1335  // recall=verytmp;
1336  }
1337  // cout<<"tmpPK.size "<<tmpPk.size()<<endl;
1338  //Constructyion de pol terminee
1339  //cout<<"ttmpP.size "<<ttmpP.size()<<endl;
1340  //cout<<"avant conv merge"<<endl;
1341  conv_merge(tmpPk,ttmpP,exceed,sizeexceed,b,serv);
1342  //cout<<"apres conv merge"<<endl;
1343  //cout<<"tmpMK==empty?? "<<tmpMk.empty()<<endl;
1344 #ifdef DEB
1345  for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
1346  cout<<"invocn"<<invconv<Poly>(*iter)<<endl;
1347 #endif
1348  // {
1349  // cout<<"iter->ind.GetCoeff() "<<iter->ind.GetCoeff()-1
1350  // <<" et ind "<<iter->ind<<endl;
1351  // }
1352  //cout<<"tmpPK.size "<<tmpPk.size()<<endl;
1353 
1354  //Tue Nov 27 15:57:25 MET 2001
1355  /*
1356  for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
1357 
1358  {
1359  mon tmp=iter->ind;
1360  tmp.SetCoeff(1);
1361  if((iter->ind.GetDegree()!=0)&&(!member(tmpMk,tmp)))
1362  {
1363  //cout<<"iter->ind.GetCoeff()"<<iter->ind.GetCoeff()-(coeff)1<<" "
1364  // <<tmp<<endl;
1365  tmpMk.push_back(tmp);
1366  //tmpMk.back().SetCoeff(1);
1367  }
1368  }
1369  */
1370  //construction de la matrice maintenant
1371  //positionnement des pointeurs de matrices pour gagner en tps
1372  {
1373  int nnz=0;
1374  //-----------------
1375  //for(typename typMk::iterator iter=tmpMk.begin();iter!=tmpMk.end();iter++)
1376  // cout<<"mon "<<*iter<<endl;
1377  //-----------------
1378  // cout<<"nb proj "<<nbproj<<endl;
1379  //for(list<int>::iterator iter=sizeexceed.begin();iter!=sizeexceed.end()
1380  // ;iter++)
1381  // {
1382  // nnz+=*iter;
1383  // cout<<"on a donc de monme pour celui la "<<
1384  // (int)((iter->ind).GetCoeff()-1)<<" d'ou nnz "<<nnz<<endl;
1385  // }
1386  //for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
1387  // {
1388  // int tmp=0;
1389  // for(;(iter->ind).GetCoeff()>(coeff)tmp;tmp++);
1390  // nnz+=tmp-1;
1391  // cout<<"on a donc de monme pour celui la "<<
1392  // (int)((iter->ind).GetCoeff()-1)<<" d'ou nnz "<<nnz<<endl;
1393  // }
1394  // nnz+=tmpPk.size()-nbproj;//le 10/05/2001 avant: nnz+=tmpMk.size()-nbproj;
1395  //le -nbproj rajoute le 23/01/2001!!
1396  // #define DEBUG
1397 #ifdef DEBUG
1398  typename typPk::iterator tmpiter=tmpPk.begin();
1399  list<int>::iterator itersize=sizeexceed.begin();
1400  for(typename list<mon*>::iterator iter=exceed.begin();iter!=exceed.end()
1401  ;tmpiter++,iter++,itersize++)
1402  {
1403  cout<<"pour un exceeed la taille attendue est "
1404  <<*itersize<<endl;
1405  for(int i=0;*itersize>i;i++)//;tmpiter->ind.GetCoeff()>i+1;i++)
1406  {
1407  cout<<"le gus que je regarde "<<(*iter)[i]<<endl;
1408  if(!member(tmpMk,(*iter)[i]))
1409  {
1410  cout<<(*iter)[i]<<endl;
1411  cout<<"dans ce pol "<<invconv<Poly>(*tmpiter)<<endl;
1412  cout<<"l'ind "<<tmpiter->ind<<endl;
1413  exit(-10);
1414  }
1415  }
1416  }
1417 #endif
1418  // #undef DEBUG
1419  mat.nrow=tmpPk.size();
1420  mat.ncol=tmpMk.size();
1421  ncol=(int*)calloc(mat.ncol,sizeof(int));
1422  //memset((void*)ncol,0,(*mat)->ncol*sizeof(int));
1423  map<mon,int,ord> mapint;
1424  typename typMk::iterator itermk=tmpMk.begin();
1425  typename typPk::iterator iterpk=tmpPk.begin();
1426  typename list<mon*>::iterator iterex=exceed.begin();
1427  list<int>::iterator itersize=sizeexceed.begin();
1428  int line_num=0;
1429  for(int i=0;itermk!=tmpMk.end();i++,itermk++)
1430  {
1431  mapint[*itermk]=i;
1432  }
1433  iterpk=tmpPk.begin();
1434  nnz=0;
1435  for(;iterpk!=tmpPk.end();iterpk++,iterex++,itersize++,line_num++)
1436  {
1437  nnz+=*itersize;
1438 #ifdef DEB
1439  cout<<"itesize "<<*itersize<<endl;
1440 #endif
1441  // if(iterpk->ind.GetDegree()>0)
1442  // {
1443  // mon tmpmon=iterpk->ind;
1444  // tmpmon.SetCoeff(1);
1445  // ncol[mapint[tmpmon]]++;
1446  // cout<<"on est a la ligne "<<line_num<<" ai augmente "<<mapint[(iterpk->ind*(1/iterpk->ind.GetCoeff()))]<<" a cause de son monome dom "<<endl;
1447  // cout<<"le voila "<<(iterpk->ind*(1/iterpk->ind.GetCoeff()))<<endl;
1448  //}
1449 
1450  {
1451  // coeff tmpcoeff=(iterpk->ind).GetCoeff()-(coeff)1;
1452  for(int i=0;*itersize>i;i++)
1453  {
1454  //cout<<"iterpk icici ->GetCoeff()"<<iterpk->ind.GetCoeff()<<endl;
1455  if (mapint.count((*iterex)[i]))
1456  {
1457 #ifdef DEB
1458  cout<<"iterex ici "<<(*iterex)[i]<<endl;
1459 #endif
1460  ++ncol[mapint[(*iterex)[i]]];
1461  // cout<<" ai augmente "<<mapint[(*iterex)[i]]<<"a cause de iterex "<<endl;
1462  }
1463 #ifdef FAST
1464  else
1465  {
1466  int j,tmpsize;
1467  cout<<"OUILLE OUILLE OUILLE "<<(*iterex)[i]<<endl;
1468  mat.ncol++;
1469  mat.nrow++;
1470  mapint[(*iterex)[i]]=mat.ncol-1;
1471  ncol=(int*)realloc(ncol,mat.ncol*sizeof(int));
1472  ncol[mapint[(*iterex)[i]]]=1;
1473  //reste a calculer un proj de ce monome et le tour sera joue
1474  Poly tmppolyalp;
1475  mon tmpmon=(*iterex)[i];
1476  pol tmppol;
1477  mon *tmp;
1478  tmpMk.push_back(tmpmon);
1479  for(j=0;j<b.nbvar()&&(!tmpmon.GetDegree(j))
1480  &&IsinB(my_divmon(tmpmon,j,b),b);j++);
1481  tmppolyalp=Poly(my_divmon(tmpmon,j,b));
1482  //proj(tmppolyalp,dump,b);
1483  tmppol=convert<pol>(tmppolyalp,b);
1484  tmpPk.push_back(mult(j,tmppol,dump,b,&tmp,tmpsize,w));
1485  exceed.push_back(tmp);
1486  sizeexceed.push_back(tmpsize);
1487  mat.nnz+=tmpsize;
1488  }
1489 #endif
1490  }
1491  }
1492  }
1493  //rajoute le 23/01/2001
1494  //enleve le 17.05/2001
1495  // for(int i=mat.nrow-nbproj;i<mat.nrow;i++)
1496  // ncol[i]--;
1497  //fin rajout c pour prendre en compte que lors de
1498  //de la proj le monome de tete se trouve dans exceed
1499  //fin enlevement
1500  cout<<"nnz of matrix "<<nnz<<endl;
1501  //en general la matrice est rectangulaire
1502  void * toto=MAC_REV_MALLOC<coeff>(nnz*sizeof(typename typMat::coeff_t));
1503  //+nnz*sizeof(int)+((*mat)->ncol+1)*sizeof(int));
1504  if (mat.nzval!=NULL) MAC_REV_FREE<typename typMat::coeff_t>
1505  (mat.nzval,mat.nnz
1506  *sizeof(typename typMat::coeff_t));
1507  mat.nnz=nnz;
1508  mat.nzval=toto;
1509 
1510 
1511  //for(int i=0;i<nnz;i++)
1512  // ((typename typMat::coeff_t*)mat.nzval)[i]=(coeff)1000000000000.0;
1513 
1514 
1515  // mstore->rowind=(int*)((double*)toto+nnz);
1516  if(mat.rowind!=NULL) free(mat.rowind);
1517  mat.rowind=(int*)malloc(nnz*sizeof(int));
1518  //mstore->colptr=(int*)(mstore->rowind+nnz);//
1519  if(mat.colptr!=NULL) free(mat.colptr);
1520  mat.colptr=(int*)malloc((mat.ncol+1)*sizeof(int));
1521  cout<<"matrix of size "<<mat.nrow<<"x"<<mat.ncol<<endl;
1522  //matrice cree rest plus qu'a ecrire dedans ca
1523  typename typMat::coeff_t* nzval=(typename typMat::coeff_t*)mat.nzval;
1524  int *rowind=mat.rowind;
1525  int *colptr=mat.colptr;
1526  //mise en place des colptr
1527  *colptr=0;
1528  for(int i=0;i<mat.ncol-1;i++)
1529  {
1530  colptr[i+1]=colptr[i]+ncol[i];
1531  //cout<<"nb element colonne "<<i<<" "<<ncol[i]<<endl;
1532  //cout<<"les valeurs de debut de colonne "<<8*colptr[i+1]<<endl;
1533  }
1534  colptr[mat.ncol]=mat.nnz;
1535 
1536  //cout<<"mat.nnz "<<mat.nnz<<" "<<mat.nnz*8<<endl;
1537  //fin mise en place
1538  //la on fait des manip symboliques pour savoir ou ecrire
1539  //les coeffs de chaques colonnes ca evite d'avoir a les
1540  //recopier 50000 fois pour construire la matrice
1541  //c bcp plus rapide
1542  itermk=tmpMk.begin();
1543  iterpk=tmpPk.begin();
1544  iterex=exceed.begin();
1545  itersize=sizeexceed.begin();
1546  line_num=0;
1547  //cout<<"nbproj "<<nbproj<<endl;
1548  for(;0&&(line_num < (int)(tmpPk.size()-nbproj));
1549  iterpk++,iterex++,itersize++,line_num++)
1550  //les polynome projette sont foutut au bout de la liste!!
1551  //d'ou le tmpPk.size()-nbproj
1552  {
1553  mon tmpmon=iterpk->ind;
1554  tmpmon.SetCoeff(1);
1555  //const unsigned int tmpplus=line_num+1,tmp=line_num;
1556  const unsigned int tmpplus
1557  =mapint[tmpmon]+1,tmp=tmpplus-1;
1558  // cout<<"ici line_num"<<line_num<<" le mon dom est col "<<tmp<<endl;
1559  //ici couille car le ind n'est pas forcement le mon diag
1560  nzval[colptr[tmpplus]-ncol[tmp]]=1;
1561  //fin couille changer un truc
1562  // cout<<"mat.nnz "<<mat.nnz<<endl;
1563  //cout<<"colptr[...]"<<colptr[tmpplus]<<endl;
1564  //cout<<"ncol[....]"<<ncol[tmp]<<endl;
1565  //cout<<"1 a la pos "<<colptr[tmpplus]-ncol[tmp]<<endl;
1566  rowind[colptr[tmpplus]-ncol[tmp]]=line_num;
1567  //cout<<"1 a la ligne "<<rowind[colptr[tmpplus]-ncol[tmp]]<<endl;
1568  ncol[tmp]--;
1569  {
1570  //coeff tmpcoeff=iterpk->ind.GetCoeff()-(coeff)1;
1571  for(int i=0;*itersize>i;i++)
1572  {
1573  const coeff stock=(*iterex)[i].GetCoeff();
1574  (*iterex)[i].SetCoeff(1);
1575  const unsigned int tmpplusex=mapint[(*iterex)[i]]+1;
1576  const unsigned int tmpex=mapint[(*iterex)[i]];
1577  nzval[colptr[tmpplusex]-ncol[tmpex]]
1578  =stock;
1579  rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
1580  ncol[tmpex]--;
1581  // cout<<"valeur de ncol["<<tmpex<<"] "<<ncol[tmpex]<<endl;
1582  }
1583  }
1584  MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
1585  }
1586  for(;(iterpk!=tmpPk.end());iterpk++,iterex++,itersize++,line_num++)
1587  {
1588  //const unsigned int tmpplus=line_num+1,tmp=line_num;
1589  {
1590  //coeff tmpcoeff=iterpk->ind.GetCoeff()-(coeff)1;
1591  for(int i=0;*itersize>i;i++)
1592  {
1593  const coeff stock=(*iterex)[i].GetCoeff();
1594  (*iterex)[i].SetCoeff(1);
1595  const unsigned int tmpplusex=mapint[(*iterex)[i]]+1;
1596  const unsigned int tmpex=mapint[(*iterex)[i]];
1597  nzval[colptr[tmpplusex]-ncol[tmpex]]
1598  =stock;
1599  rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
1600  ncol[tmpex]--;
1601  }
1602  }
1603  MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
1604  //free(*iterex);
1605  }
1606  free(ncol);
1608  for(typename typPk::iterator iterpk=tmpPk.begin()
1609  ;iterpk!=tmpPk.end();iterpk++)
1610  iterpk->ind.SetCoeff(1);
1611  //iterpk->ind*=1/iterpk->ind.GetCoeff();
1612  // cout<<"la matrice dans newpkmkmatrixof"<<endl;
1613  //cout<<" nombre de non zero "<<mat.nnz<<endl;
1614 #ifdef DEB
1615  affdebug(mat);
1616 #endif
1617  //cout<<"le colptr "<<endl;
1618  //for(int i=0;i<mat.ncol;i++)
1619  // cout<<mat.colptr[i]<<" "<<endl;
1620  // cout<<"les indices de lignes et le nnz"<<endl;
1621  //for(int i=0;i<mat.nnz;i++)
1622  // cout<<mat.rowind[i]<<" "<<((typename typMat::coeff_t*)mat.nzval)[i]<<endl;
1623  //cout<<"fin matrice"<<endl;
1624  Pk.swap(tmpPk);
1625  Mk.swap(tmpMk);
1626  }
1627  // for(int i=0;i<mat.nnz;i++)
1628  // cout<<"coeff mat "<<((typename typMat::coeff_t*)mat.nzval)[i]<<" et i "<<i<<endl;
1629  return flagdoplus;
1630 }
1631 //newpkmkmatrixof termine reste plus qu'a tester .... ;-(
1632 
1633 template<typename typdump,typename mon,typename pol>
1634 void findcorresppol(const mon & m,const typdump &dump,pol &res)
1635 {
1636  int i,d=m.GetDegree();
1637  typename typdump::const_iterator iter=dump.begin();
1638  for(;(iter!=dump.end())&&(iter->k!=d);iter++);
1639  //localise la dump struct de bon degre
1640  if(iter!=dump.end())
1641  {
1642  for(i=0;(i<iter->size)&&(iter->nf[i].ind.rep!=m.rep);i++);
1643  //cout<<"monomes passe en revue pour chercher "<<m<<" : "<<iter->nf[i].ind<<endl;;
1644  //trouve dans la dump struct le pol qui marche
1645  if (i<iter->size)//estce que je connais?
1646  //oui super
1647  {
1648  //cout<<"g trouve un gus qui convient"<<endl;
1649  //for(int j=0;j<iter->nf[i].size;j++)
1650  // cout<<"et ses coeff sont "<<iter->nf[i].nf[j]<<endl;
1651  //Tue Dec 4 16:12:10 MET 2001
1652  //densify(iter->nf[i],res);}
1653  //Tue Dec 4 16:12:10 MET 2001
1654  res=iter->nf[i];}
1655  else {
1656  //non ben alors il se reecrit en lui meme
1657  res.ind=mon(0);//m*(1/m.GetCoeff());
1658  res.size=-1;//pour proj avant ct -1
1659  res.nf=NULL;
1660  res.nfind=NULL;
1661  res.sizenf=0;
1662  }
1663  }
1664  return;
1665 }
1666 template<typename iterator, typename mon,typename Base>
1667 void varmult(iterator iter1,iterator iter2,mon &var1, mon &var2,const Base &b)
1668 {
1669  for(int i=0;i<b.nbvar();i++)
1670  {
1671  if(iter1->ind.GetDegree(i)>iter2->ind.GetDegree(i))
1672  var2=mon(i,1);
1673  if(iter2->ind.GetDegree(i)>iter1->ind.GetDegree(i))
1674  var1=mon(i,1);
1675  }
1676 }
1677 
1678 template <typename mon,typename pol, typename typdump,typename Base,
1679  typename monomial_server>
1680 pol halfred(const mon &targetind, const pol & p, const typdump & dump
1681  , const Base & b, monomial_server & serv)
1682 {
1683  typedef typename pol::coeff_t coeff;
1684  static const mon monzero=mon(0);
1685  static const typename pol::coeff_t zero(0);
1686  int *place=(int*)MAC_REV_MALLOC<int>(p.size*sizeof(int)),comp=0;
1687  pol res;
1688 #ifdef uninf
1689  int varref;
1690 #else
1691  mon varref;
1692 #endif
1693  int i,maxref=0,ppp=0,nbbitsun=0;
1694  coeff *tmpspace;
1695  for(i=0;i<b.nbvar();i++)
1696  {
1697  if(targetind.GetDegree(i)>p.ind.GetDegree(i))
1698  break;
1699  }
1700 #ifdef uninf
1701  varref=i;
1702 #else
1703  varref=mon(i,1);
1704 #endif
1705 
1706  // for(i=0;i<p.size;i++)
1707  // cout<<p.nf[i]<<" ";
1708  //cout<<endl;
1709  //cout<<"ppp "<<ppp<<" p.size "<<p.size<<endl;
1710  //cout<<"p en entree"<<invconv<Poly>(p)<<endl;
1711  //cout<<"mulind(0,1,b) "<<mulind(0,1,b)<<endl;
1712  //cout<<"target "<<targetind<<" et ind "<<p.ind<<" et var "<<varref<<endl;
1713 
1714  for(i=0;i<p.sizenf;i++)
1715  {
1716  if(p.nfind[i])
1717  {
1718 #ifdef DEB
1719  cout<<nbbitsun<<" p.nfind[i] "<<(int)p.nfind[i]<<endl;
1720 #endif
1721  nbbitsun+=nbbits[p.nfind[i]];
1722  for(int j=0;j<8;j++)
1723  {
1724  if((p.nfind[i]>>j)&1)
1725  {
1726 #ifdef unimul
1727 
1728  place[comp]=serv.mulind(8*i+j,varref,b);
1729  if(place[comp]<0)
1730  place[comp]=-1*(8*i+j+1);
1731  if (place[comp]>maxref)
1732  maxref=place[comp];
1733 
1734 #else
1735  //ATTENTION UNIQUEMENT UNIMUL SINON PAS DEBUGGE
1736  int indtmpmon;
1737  mon tmpmon;
1738  int2mon(8*i+j,tmpmon);
1739  tmpmon*=varref;
1740  if(IsinB(tmpmon,b))
1741  {
1742  //int j;
1743  indtmpmon=mon2int(tmpmon);
1744  //for(j=0;j<p.size&&p.nfind[j]!=indtmpmon;j++);
1745  //if(j<p.size)
1746  maxref++;
1747  place[comp]=indtmpmon;
1748  }
1749  else
1750  {
1751  place[comp]=-1*(8*i+j);
1752  }
1753 #endif
1754  comp++;
1755  }
1756  }
1757  }
1758  }
1759  tmpspace=(coeff*)MAC_REV_MALLOC<coeff>((maxref/8+1)*8*sizeof(coeff));
1760 #ifdef DEB
1761  cout<<"comp "<<comp<<" et p.size "<<p.size<<endl;
1762 #endif
1763  res.sizenf=(maxref/8+1);
1764  for(int j=0;j<8*res.sizenf;j++)
1765  tmpspace[j]=0;
1766  res.nfind=(unsigned char*)MAC_REV_MALLOC<unsigned char>(res.sizenf);
1767  memset(res.nfind,0,res.sizenf);
1768  for(int j=0;j<nbbitsun;j++)
1769  if(place[j]>=0)
1770  {
1771 #ifdef DEB
1772  mon tmpmm;
1773  int2mon(place[j],tmpmm);
1774  cout<<"le monome la "<<tmpmm<<" "<<p.nf[j]<<endl;
1775 #endif
1776  tmpspace[place[j]]+=p.nf[j];
1777  res.nfind[place[j]/8]|=1<<(place[j]%8);
1778  }
1779  else
1780  {
1781  pol tmp;
1782 #ifdef unimul
1783  tmp=serv.nf(varref,-1*place[j]-1,dump,b);
1784 #else
1785  mon tmpmon;
1786  int2mon(-1*place[j],tmpmon);
1787  tmpmon*=mon(i,1);
1788  tmp=nf<typpol>(tmpmon,dump,b);
1789 #endif
1790 
1791  if (tmp.size>=0)
1792  {
1793  int compteurtmp=0;
1794  //cout<<" je reduit prr lui"<<endl<<invconv<Poly>(tmp)<<endl;
1795  //On fait un plus dense dans tmpspace
1796  if(tmp.sizenf>res.sizenf)
1797  {
1798  res.nfind=(unsigned char*)realloc(res.nfind,tmp.sizenf);
1799  for(int k=res.sizenf;k<tmp.sizenf;k++)
1800  res.nfind[k]=0;
1801  tmpspace=(coeff*)MAC_REV_REALLOC<coeff>(tmpspace,
1802  res.sizenf*8*sizeof(coeff),
1803  tmp.sizenf*8*sizeof(coeff));
1804  for(int k=res.sizenf*8;k<tmp.sizenf*8;k++)
1805  tmpspace[k]=0;
1806  res.sizenf=tmp.sizenf;
1807 
1808  }
1809  for(int k=0;k<tmp.sizenf;k++)
1810  {
1811  if(tmp.nfind[k])
1812  {
1813  for(int l=0;l<8;l++)
1814  if((tmp.nfind[k]>>l)&1)
1815  tmpspace[8*k+l]-=p.nf[j]*tmp.nf[compteurtmp++];
1816  }
1817  res.nfind[k]|=tmp.nfind[k];
1818  }
1819  }
1820  else
1821  {
1822  mon tmpmon;
1823  serv.int2mon(-1*place[j]-1,tmpmon);
1824  tmpmon*=mon(varref,1);
1825  for(int i=0;i<serv.sizeplacemon();i++)
1826  cout<<i<<" "<<serv.int2mon_[i]<<endl;
1827  cout<<"monom "<<tmpmon<<" "<<-1*place[j]
1828  <<" "<<p.nf[j]<<endl;
1829  cerr<<"Je n'aurrai pas du passer par la "<<endl;
1830  exit(10);
1831  };
1832  }
1833  res.ind=mon(0);
1834  comp=0;
1835  for(int j=0;j<res.sizenf;j++)
1836  if(res.nfind[j])
1837  comp+=nbbits[res.nfind[j]];
1838  res.nf=(coeff*)MAC_REV_MALLOC<coeff>(comp*sizeof(coeff));
1839  res.size=comp;
1840  comp=0;
1841  for(int j=0;j<res.sizenf;j++)
1842  if(res.nfind[j])
1843  for(int k=0;k<8;k++)
1844  if((res.nfind[j]>>k)&1)
1845  if(tmpspace[8*j+k]!=0)
1846  {res.nf[comp++]=tmpspace[8*j+k];}
1847  else
1848  res.nfind[j]&=~(1<<k);
1849  res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
1850  ,comp*sizeof(coeff));
1851  res.size=comp;
1852  MAC_REV_FREE<coeff>(tmpspace,res.sizenf*8*sizeof(coeff));
1853  free(place);
1854  //cout<<" apres reduction "<<invconv<Poly>(res)<<endl;
1855  return res;
1856 }
1857 
1858 template <typename typPk, typename typdump,typename Base,
1859  typename workspace ,typename monomial_server>//,typename typMk>
1860 void ReduceSpol(typPk &S,const typdump & dump,typPk &redspol,const Base &b
1861  ,workspace &w, monomial_server &serv)
1862  //, typMk & Spoldejavu)
1863 {
1864  typedef typename typPk::value_type pol;
1865  typedef typename pol::monom_t mon;
1866  typedef typename pol::coeff_t coeff;
1867  list<mon> leadmon;
1868  list<typPk> membermon;
1869  cout<<"en entree de RedSpol S.size "<<S.size()/2<<endl;
1870 
1871  for(typename typPk::iterator iterS=S.begin();iterS!=S.end();iterS++,iterS++)
1872  {
1873  typename typPk::iterator iterS2=iterS;
1874  typename list<mon>::iterator itermon=leadmon.begin();
1875  typename list<typPk>::iterator itermemb=membermon.begin();
1876  mon var1,var2,tmpleadmon;
1877  iterS2++;
1878  varmult(iterS,iterS2,var1,var2,b);
1879  tmpleadmon=iterS->ind*var1;
1880  // Spoldejavu.push_back(tmpleadmon);
1881  for(;itermon!=leadmon.end()&&itermon->rep!=tmpleadmon.rep;
1882  itermon++,itermemb++);
1883  if(itermon!=leadmon.end())
1884  {
1885  int yes1=1,yes2=1;
1886  for(typename typPk::iterator tmpiter=itermemb->begin();
1887  tmpiter!=itermemb->end();tmpiter++)
1888  {
1889  if(tmpiter->ind.rep==iterS->ind.rep) yes1=0;
1890  if(tmpiter->ind.rep==iterS2->ind.rep) yes2=0;
1891  }
1892  if(yes1) itermemb->push_back(*iterS);
1893  if(yes2) itermemb->push_back(*iterS2);
1894  }
1895  else
1896  {
1897  typPk verytmp;
1898  leadmon.push_back(tmpleadmon);
1899  //cout<<"le tmpleadmon "<<tmpleadmon<<endl;
1900  membermon.push_back(verytmp);
1901  membermon.back().push_back(*iterS);
1902  membermon.back().push_back(*iterS2);
1903  }
1904  }
1905  //maintenant on a mis en place la structure de Redspol
1906  //reste plus qu'a calculer les bons et a reduire tout ca!!
1907  {
1908  typename list<mon>::iterator itermon=leadmon.begin();
1909  typename list<typPk>::iterator itermemb=membermon.begin();
1910  for(;itermon!=leadmon.end();itermon++,itermemb++)
1911  {
1912  typename typPk::value_type ref;
1913  typename typPk::iterator tmpiter=itermemb->begin();
1914  ref=halfred(*itermon,*tmpiter,dump,b,serv);
1915  // /cout<<"ref.size "<<ref.size<<" "<<ref.ind<<endl;
1916  //cout<<"ref en entier"<<endl<<invconv<Poly>(ref)<<endl;
1917  tmpiter++;
1918  for(;tmpiter!=itermemb->end();tmpiter++)
1919  {
1920  typename typPk::value_type redcur;
1921  redcur=halfred(*itermon,*tmpiter,dump,b,serv);
1922  my_plus(redcur,ref,(coeff)1,&w,serv);//ICIOMP
1923  if(!Ispolzero(redcur))
1924  {
1925  redspol.push_back(redcur);
1926  //cout<<"redcur "<<endl<<invconv<Poly>(redcur)<<endl;
1927  //cout<<"le leadmon qui donne un non zero "<<*itermon<<endl;
1928  }
1929  else
1930  {
1931  MAC_REV_FREE<coeff>(redcur.nf,redcur.size*sizeof(coeff));
1932  MAC_REV_FREE<unsigned char>(redcur.nfind,redcur.sizenf);
1933  }
1934  }
1935  MAC_REV_FREE<coeff>(ref.nf,ref.size*sizeof(coeff));
1936  MAC_REV_FREE<unsigned char>(ref.nfind,ref.sizenf);
1937  }
1938  }
1939 }
1940 
1941 template<typename typPk,typename monomial_server>
1942 int mindeg(const typPk &l,monomial_server &serv)
1943 {
1944  typedef typename typPk::value_type::monom_t mon;
1945  typedef typename mon::coeff_t coeff;
1946  int res=-1;
1947  // cout<<"dans mindeg res au debut"<<res<<endl;
1948  for(typename typPk::const_iterator iter=l.begin() ;iter!=l.end();iter++)
1949  {
1950  int mmax=-1;
1951  // cout<<"tour de boucle de mindeg "<<endl;
1952  for(int i=0;i<iter->sizenf;i++)
1953  if(iter->nfind[i])
1954  for(int j=0;j<8;j++)
1955  if((iter->nfind[i]>>j)&1)
1956  {
1957  mon tmpmon;
1958  serv.int2mon(8*i+j,tmpmon);
1959  mmax=(mmax<tmpmon.GetDegree())?tmpmon.GetDegree():mmax;
1960  }
1961  // cout<<"mmax ici "<<mmax<<endl;
1962  if (iter->ind.GetCoeff()==(coeff)1)
1963  mmax=(mmax<iter->ind.GetDegree())?iter->ind.GetDegree():mmax;
1964  //cout<<"les gens que je regarde "<<iter->ind<<endl;
1965  if(mmax!=-1)
1966  {
1967  if(res==-1) res=mmax;
1968  res=(mmax>res)?res:mmax;
1969  }
1970  }
1971  //cout<<"resultat de mindeg "<<res<<endl;
1972  return res;
1973 }
1974 
1975 template<typename coeff,typename typiterpk, typename workspace,typename typserv>
1976 void inline update_crochetchoix(typiterpk &iterPk, typiterpk &iter,int tmpind
1977  ,workspace &w, typserv &serv)
1978 {
1979 
1980  if((iterPk->sizenf>tmpind/8)&&(((iterPk->nfind[tmpind/8])>>(tmpind%8))&1))
1981  {
1982  // cout<<"g trouve un gus qui a un coeff du mon choisi "<<endl;
1983  //cout<<"le voila "<<invconv<Poly>(*iterPk)<<endl;
1984  int i=0;
1985  coeff tmp;
1986  for(int j=0;8*j<=tmpind;j++)
1987  i+=nbbits[iterPk->nfind[j]];
1988  for(int j=7;j>=(tmpind % 8);j--)
1989  if((iterPk->nfind[tmpind/8]>>j)&1)
1990  i--;
1991 
1992 #ifdef DEB
1993  cout<<"i ici "<<i<<" et iterPk->size "<<iterPk->size<<endl;
1994 #endif
1995  tmp=iterPk->nf[i];
1996  // cout<<"le coeff "<<tmp<<" tmpind "<<tmpind<<endl;
1997  //cout<<"les voisins "<<iterPk->nf[i-1]<<" "<<iterPk->nf[i+1]<<endl;
1998 
1999  //cout<<"les voisins plus loin"<<iterPk->nf[i-2]<<" "<<iterPk->nf[i+2]<<endl;
2000  for(int j=i;j<iterPk->size-1;j++){
2001  iterPk->nf[j]=iterPk->nf[j+1];
2002  }
2003  iterPk->nfind[tmpind/8]&=~(1<< (tmpind%8));
2004  iterPk->nf=(coeff*)MAC_REV_REALLOC<coeff>(iterPk->nf,
2005  iterPk->size*sizeof(coeff),(iterPk->size-1)*sizeof(coeff));
2006  iterPk->size--;
2007  //iterPk->nf[i]=0;
2008  my_plus(*iterPk,*iter,tmp,&w,serv);//ICIOMP
2009 
2010  //cout<<"apres plus le coeff vaut "
2011  // <<iterPk->nf[mon2int(iter->ind)]<<endl;
2012  }
2013  //cout<<"apres mise a jour"<<endl<<invconv<Poly>(*iterPk)<<endl;
2014 }
2015 template<typename typP,typename typPk,typename typMk
2016  ,typename Base,typename typdump, typename typrecall,
2017  typename workspace ,typename monomial_server>
2018 void NewCrochetchoix(typP & P,typPk & Pk,typMk & Mk, typPk & redspol
2019  ,int &k,typdump &dump, Base &b, typrecall & recall
2020  ,workspace &w, monomial_server &serv)
2021  //,typMk &Spoldejavu)
2022  //template<typename typP,typename typPk,typename typMk,typename Base,typename typdump>
2023 //void NewCrochetchoix(const typP & P,typPk & Pk,typMk & Mk, typPk & redspol
2024 // ,int &k,typdump &dump, Base &b)
2025  {
2026  typedef typename typP::value_type polyalp;
2027  typedef typename polyalp::monom_t mon;
2028  typedef typename polyalp::coeff_t coeff;
2029  //for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
2030  // P.push_back(invconv<Poly>(*iter));
2031  //cout<<"dans newcrochetchoix"<<endl;
2032  /*
2033 
2034  //cout<<"les sizes "<<iter->size<<endl;
2035  {
2036  int cpt=0;
2037  cout<<invconv<typename typP::value_type>(*iter)<<endl;
2038  for(int i=0;i<iter->sizenf;i++)
2039  for(int j=0;j<8;j++)
2040  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
2041  {
2042  cout<<"ici ca couille a la place "<<8*i+j<<endl;
2043  exit(1);
2044  }
2045  }
2046  */
2047  typPk res=Crochet(redspol,k,serv),tmpres;
2048  //cout<<"redspol.size "<<redspol.size()<<endl;
2049  //cout<<"res.size "<<res.size()<<endl;
2050  for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
2051  {
2052  for(typename typPk::iterator iterredspol=redspol.begin();
2053  iterredspol!=redspol.end();iterredspol++)
2054  if(iter->nf==iterredspol->nf)
2055  {
2056  redspol.erase(iterredspol);
2057  break;
2058  }
2059  }
2060  NewDestroyredspol(redspol,Pk);
2061  redspol.erase(redspol.begin(),redspol.end());
2062  //for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
2063  // cout<<"res->sizenf<< "<<iter->sizenf<<endl;
2064  for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
2065  {
2066  //cout<<"un nouveau tour de boucle "<<endl;
2067  if (!Ispolzero(*iter))
2068  {
2069  int tmpind,i;
2070  iter->ind=choice(*iter,b,serv);
2071  //cout<<"le pol pas zero "<<(invconv<polyalp>(*iter))<<endl;
2072  //cout<<"iter -> size "<<iter->size<<" "<<iter->ind<<endl;
2073  //for (int i=0;i<iter->size;i++)
2074  // cout<<iter->nf[i]<<" "<<iter->nfind[i]<<endl;
2075  if(iter->ind.GetDegree()<k)
2076  {
2077  //cout<<"le pol qui fait chuter"<<(invconv<polyalp>(*iter))<<endl;
2078  k=iter->ind.GetDegree();
2079  iter->ind=mon(0);
2080  //cout<<"passage par bout de code en plus "<<endl;
2081  my_merge(res,tmpres);
2082  my_merge(redspol,res);
2083  tmpres.erase(tmpres.begin(),tmpres.end());
2084  res.erase(res.begin(),res.end());
2085  res=Crochet(redspol,k,serv);
2086  //cout<<"newres.size "<<res.size()<<endl;
2087  for(typename typPk::iterator iterres=res.begin()
2088  ;iterres!=res.end();iterres++)
2089  {
2090  for(typename typPk::iterator iterredspol=redspol.begin();
2091  iterredspol!=redspol.end();iterredspol++)
2092  if(iterres->nf==iterredspol->nf)
2093  {
2094  redspol.erase(iterredspol);
2095  break;
2096  }
2097  }
2098  for(typename typPk::iterator iterredspol=redspol.begin();
2099  iterredspol!=redspol.end();iterredspol++)
2100  if(Degree(*iterredspol,serv)<=k)
2101  {
2102  tmpres.push_back(*iterredspol);
2103  redspol.erase(iterredspol--);
2104  }
2105  NewDestroyredspol(redspol,Pk);
2106  redspol.erase(redspol.begin(),redspol.end());
2107  my_merge(redspol,tmpres);
2108  tmpres.erase(tmpres.begin(),tmpres.end());
2109  iter=res.begin();
2110  iter->ind=choice(*iter,b,serv);
2111 
2112  Dump(Pk,dump);//c pour detruire Pk dans forget
2113  //ca ne respecte pas la structure du dump!!!
2114  recover(Pk,Mk,dump,k);
2115  // Listedejafait(Mk,Spoldejavu);
2116  forget(b,dump,k,recall);
2117  //forget(b,dump,k);
2118  // cout<<"un coup de compress"<<endl;
2119  //ce compresss la vire le 06 10 2006
2120  serv.compress(Pk,redspol,dump,b,k);
2121  //pose un probleme de oherence pour le int2mon
2122  //si on le laisse
2123  //swap(*iter,*res.rbegin());//on veut ne plus
2124 
2125 
2126  //iter=--res.end();//refaire d'autre tours
2127  }
2128  //cout<<"g choisi dans Crochetchoix "<<iter->ind<<endl;
2129  //cout<<"a t'il un mon2int ?"<<IsinB(iter->ind,b)<<endl;
2130  //mon tmp10,tmp11;
2131  // int2mon(10,tmp10);int2mon(11,tmp11);
2132  //cout<<"qu'en est il de int2mon(10) et 11 "<<tmp10<<" "<<tmp11<<endl;
2133  //
2134  //
2135  //
2136  //UGLY HACK
2137  remiseenforme(*iter);
2138  //SALE HACK
2139  //
2140  //
2141  //
2142  //
2143  //
2144  *iter/=iter->ind.GetCoeff();//pour la "nf"
2145  //cout<<"le coeff "<<iter->ind<<endl;
2146  iter->ind*=(coeff)1/iter->ind.GetCoeff();//pour l'ind
2147  tmpind=serv.mon2int(iter->ind);
2148  i=0;
2149  for(int j=0;8*j<=tmpind;j++)
2150  i+=nbbits[iter->nfind[j]];
2151  for(int j=7;j>=(tmpind % 8);j--)
2152  if((iter->nfind[tmpind/8]>>j)&1)
2153  i--;
2154  for(int j=i;j<iter->size-1;j++)
2155  iter->nf[j]=iter->nf[j+1];
2156  iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf,
2157  iter->size*sizeof(coeff),
2158  (iter->size-1)*sizeof(coeff));
2159  iter->nfind[tmpind/8]&=~(1<<(tmpind%8));
2160  iter->size--;
2161 #ifdef DEB
2162  cout<<"apres tambouille"<<endl<<invconv<Poly>(*iter)<<endl;
2163 #endif
2164 
2165  //
2166  //
2167  //
2168  //UGLY HACK
2169  remiseenforme(*iter);
2170  //SALE HACK
2171  //
2172  //
2173  //
2174  //
2175  //
2176 
2177  tmpres.push_back(*iter);
2178  //on met a 0 le coeff du mon passe en ind
2179  //maintenant on a une regle en forme comme il faut reste a:
2180  //-reduire les regles deja existantes par rapport a celle ci
2181  //-reduire les autres redspol par rapport a celle ci
2182  for(typename typPk::iterator iterPk=Pk.begin();iterPk!=Pk.end();iterPk++)
2183  update_crochetchoix<coeff>(iterPk,iter,tmpind,w,serv);
2184  typename typPk::iterator iterredspol=iter;
2185  iterredspol++;
2186  for(;iterredspol!=res.end();iterredspol++)
2187  {
2188  //cout<<"redspol.size() "<<redspol.size()<<endl;
2189  //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl;
2190  update_crochetchoix<coeff>(iterredspol,iter,tmpind,w,serv);
2191  }
2192  //au tour de tmpres...
2193  typename typPk::iterator iterend=tmpres.end();
2194  iterend--;
2195  for(iterredspol=tmpres.begin();iterredspol!=iterend;iterredspol++)
2196  {
2197  //cout<<"redspol.size() "<<redspol.size()<<endl;
2198  //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl;
2199  update_crochetchoix<coeff>(iterredspol,iter,tmpind,w,serv);
2200  }
2201 
2202  //voila c fait
2203  //maintenant on met a jour la Base b.
2204  for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
2205  {
2206  int tmptaille1=0;
2207  mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iterb->taille1*sizeof(mon));
2208  for(int i=0;i<iterb->taille1;i++)
2209  if(!isdivisible(iter->ind,iterb->accept[i],b))
2210  tmp[tmptaille1++]=iterb->accept[i];
2211  tmp=(mon*)MAC_REV_REALLOC<mon>(tmp,iterb->taille1*sizeof(mon)
2212  ,tmptaille1*sizeof(mon));
2213  MAC_REV_FREE<mon>(iterb->accept,iterb->taille1*sizeof(mon));
2214  iterb->accept=tmp;
2215  iterb->taille1=tmptaille1;
2216  if(iterb->taille1==0)
2217  {
2218  MAC_REV_FREE<mon>(iterb->refuse,iterb->taille2*sizeof(mon));
2219  b.erase(iterb--);
2220  continue;
2221  }
2222  iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
2223  (iterb->refuse,(iterb->taille2)*sizeof(mon),
2224  (iterb->taille2+1)*sizeof(mon));
2225  iterb->refuse[iterb->taille2]=iter->ind;
2226  // cout<<"reffuse rajoute "<<iter->ind<<endl;
2227  iterb->refuse[iterb->taille2].SetCoeff(1);
2228  iterb->taille2++;
2229  }
2230  res.erase(iter--);
2231  }
2232  //break;//comme ca on fait pas 50 tours.
2233  }
2234  for (typename typPk::iterator iterpk=Pk.begin();iterpk!=Pk.end();iterpk++)
2235  {
2236  //cout<<"iterpk->ind "<<iterpk->ind<<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl;
2237  //cout<<"le pol "<<invconv<Poly>(*iterpk)<<endl;
2238  if (IsinB(iterpk->ind,b))
2239  {
2240  for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
2241  {
2242  iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
2243  (iterb->refuse,(iterb->taille2)*sizeof(mon),
2244  (iterb->taille2+1)*sizeof(mon));
2245  iterb->refuse[iterb->taille2]=iterpk->ind;
2246  iterb->refuse[iterb->taille2].SetCoeff(1);
2247  iterb->taille2++;
2248  }
2249  }
2250  }
2251 #ifdef NO_TWICE_FALL
2252  for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
2253  P.push_back(invconv<polyalp>(*iter));
2254 #endif
2255 #ifdef BONRAJOUT
2256  for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
2257  P.push_back(invconv<polyalp>(*iter));
2258  cout<<"a la fin de §New"<<endl;
2259 #endif
2260 #ifdef DEB
2261  for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
2262  cout<<"tmpres"<<endl<<invconv<polyalp>(*iter)<<endl;
2263  cout<<"tmpres.size "<<tmpres.size()<<endl;
2264 #endif
2265  my_merge(Pk,tmpres);//les gens dans res\tmpres ne sont pas detruits ici!!
2266  my_merge(redspol,res);
2267 
2268 
2269  /* for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2270  //cout<<"les sizes "<<iter->size<<endl;
2271  {
2272  int cpt=0;
2273  cout<<invconv<typename typP::value_type>(*iter)<<endl;
2274  for(int i=0;i<iter->sizenf;i++)
2275  for(int j=0;j<8;j++)
2276  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
2277  {
2278  cout<<"ici ca couille a la place "<<8*i+j<<endl;
2279  exit(1);
2280  }
2281  }
2282  */
2283  return;
2284 }
2285 //#undef DEB
2286 template<typename typPk>
2287 void NewDestroyredspol(typPk &redspol,const typPk &Pk)
2288 {
2289 // typename typPk::const_iterator iterpk=--Pk.end();
2290  for(typename typPk::iterator iter=redspol.begin();
2291  iter!=redspol.end();iter++)
2292  {
2293  // if(iter->nf!=iterpk->nf)
2294  MAC_REV_FREE<typename typPk::value_type::coeff_t>(iter->nf,iter->size*sizeof(typename typPk::value_type::coeff_t));
2295  MAC_REV_FREE<unsigned char>(iter->nfind,iter->sizenf);
2296  }
2297 }
2298 
2299 template<typename typMk>
2300 void Listedejafait(const typMk &Mk,typMk &Spoldejavu)
2301 {
2302  Spoldejavu.erase(Spoldejavu.begin(),Spoldejavu.end());
2303  for(typename typMk::const_iterator iter1=Mk.begin();iter1!=Mk.end();
2304  iter1++)
2305  for(typename typMk::const_iterator iter2=iter1;iter2!=Mk.end();
2306  iter2++)
2307  {
2308  typename typMk::value_type tmp=lcm(*iter1,*iter2);
2309  if (tmp.GetDegree()==iter1->GetDegree()+1)
2310  Spoldejavu.push_back(tmp);
2311  }
2312 }
2313 
2314 template<typename typP,typename typPk,typename typdump,typename Base
2315  , template<typename T> class tmptypmat ,typename monomial_server>
2316 void algo(typP P,typdump &dump,Base &b, monomial_server &serv)
2317 {
2318 #ifdef PEQUAN
2319  int toto=0;
2320  FILE *fic;
2321  char name[8];
2322 #endif
2323  typedef typename typP::value_type polyalp;
2324  typedef list<typename typPk::value_type::monom_t> typMk;
2325  typedef typename typMk::value_type mon;
2326  typedef typename typPk::value_type pol;
2327 
2328  typMk Mk;
2329  typMk Spoldejavu;
2330  typPk Pk,S;
2331  //typP recall
2332  typPk recall;
2333  //Base b;
2335  typedef tmptypmat<typename typP::value_type::coeff_t> typMat;
2336  typMat Mat,L;
2337  int nouveaumon,allpolused=0,maxdeg,k,*pr,*pc;
2338  //cout<<"avant init"<<endl;
2339 
2340  init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv);
2341  //cout<<"apres init"<<endl;
2342 #ifndef GROEBNER
2343 
2344  // while((critere(b,k)==-1)||(k<=maxdeg))
2345  while(nouveaumon||(k<=maxdeg))
2346 #else
2347  while(!GB_stop(k)||(k<=maxdeg))
2348 #endif
2349 
2350  {
2351  //if (toto>=5) {exit(0);}
2352  //toto++;
2353 
2354  int killspol;
2355 #ifdef BONRAJOUT
2356  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
2357  {
2358  for(int i=0;i<p->taille1;i++)
2359  {
2360  cout<<"p.accept[i] "<<p->accept[i]<<endl;
2361  }
2362  for(int i=0;i<p->taille2;i++)
2363  {
2364  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
2365  }
2366  }
2367 #endif
2368 #ifdef DEB
2369 
2370  //cout<<"mon a la fin de la boulcle de l'algo "<<Mk.size()<<endl;
2371  //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
2372  // cout<<*iter<<endl;
2373  cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl;
2374  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2375  //cout<<"les sizes "<<iter->size<<endl;
2376  {
2377  int cpt=0;
2378  cout<<invconv<typename typP::value_type>(*iter)<<endl;
2379  for(int i=0;i<iter->sizenf;i++)
2380  for(int j=0;j<8;j++)
2381  if (((iter->nfind[i]>>j)&1) && (iter->nf[cpt++]==0))
2382  {
2383  cout<<"ici ca couille a la place"<<8*i+j<<endl;
2384  cout<<iter->sizenf<<" "<<iter->size<<endl;
2385  exit(1);
2386  }
2387  }
2388 #endif
2389 
2390  //cout<<"Spolordsup"<<endl;
2391  S=Spolordsup(Pk,b,Spoldejavu);
2392  //S.erase(S.begin(),S.end());
2393  //S=Spolordsup(Pk,b);
2394  cout<<endl;
2395  //<<endl<<"newpkmkmatrixof"<<endl;
2396  //cout<<"Pk.size() "<<Pk.size()<<endl;
2397  //killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu);
2398  killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,w,serv);
2399 #ifdef PEQUAN
2400  sprintf(name,"mat%d",toto);
2401  fic=fopen(name,"w");
2402  printmatfile_pequan(Mat,fic);
2403  fclose(fic);
2404  toto++;
2405 #endif
2406  // if (toto>=5) {cout<<"killredspol "<<killspol<<endl; exit(0);}
2407  // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump);
2408  if(killspol) S.erase(S.begin(),S.end());
2409  if (k+1>=maxdeg) allpolused=1;
2410  if(Mk.size()==0) nouveaumon=0;
2411  //cout<<"j'en suis a k="<<k<<endl;
2412  //cout<<"Ici dans algo Mat"<<endl;
2413 #ifdef BONRAJOUT
2414  affdebug(Mat);
2415 #endif
2416  //Solve affecte a Mat la valeur U
2417  //cout<<"solve"<<endl;
2418  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2419  // cout<<"avant solve les ind "<<iter->ind<<endl;
2420  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2421  // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl;
2422  //if(k==3) exit(-10);
2423  //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
2424  // cout<<"monomes dans Mk "<<*iter<<endl;
2425 
2426  if (Mat.ncol!=0)
2427  {
2428  //cout<<"debut du solve"<<endl;
2429  Solve(Mat,L,Pk,&pr,&pc,w);
2430  cout<<"fin du solve"<<endl;
2431  //for(int kk=0;kk<Mk.size();kk++)
2432  // cout<<"permc "<<kk<<" "<<pc[kk]<<endl;
2433  inverse(pc,Mk.size());
2434  Dopermu(Mk,pc);
2435  {
2436  //ici on remet les ind a la bonne valuer
2437  //a inclure dans une petite fonction inline apres
2438  int j=0;
2439  typename typMk::iterator itermon=Mk.begin();
2440  typename typPk::iterator iter;
2441  for(iter=Pk.begin();
2442  itermon!=Mk.end();iter++,itermon++,j++)
2443  {
2444  if(!Iszero(Mat(j,j)))
2445  {
2446  // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl;
2447  iter->ind=*itermon*(iter->ind.GetCoeff());
2448  }
2449  else
2450  {
2451  iter->ind=mon(0);
2452  }
2453  }
2454  //for(;itermon!=Mk.end();iter++,itermon++)
2455  // iter->ind=mon(0);
2456  }
2457 
2458  free(pr);
2459  free(pc);
2460  }
2461 
2462  //appliquer les permutation a MK!!!!!!!!
2463  // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2464  // cout<<"apres solve les ind "<<iter->ind<<endl;
2465  //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
2466  // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl;
2467  //
2468  //
2469  //APPLIQUER LES PERMUTYATIONS A MK!!
2470  //
2471  //
2472  //
2473  //
2474  if ((unsigned)rank(Mat)==Mk.size())
2475  //matrice de rang plein
2476  {
2477  typMk tmpSpoldejavu;
2478  typPk redspol,secd=secondmembre(Mat,Pk);;
2479  //secondmembre2(Mat,Pk,secd);
2480  //typename typPk::iterator iter=Pk.begin();
2481  cout<<"matrice de rang plein "<<endl;
2482  //for(unsigned int i=0;i<Mk.size();i++,iter++);
2483  //Pk.erase(iter,Pk.end());
2484  //cout<<"Dump "<<endl;
2485  Dump(Pk,dump);
2486  //cout<<"Reduce Spol "<<endl;
2487 
2488  ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu);
2489  //cout<<"secd.size() "<<secd.size()<<endl;
2490  my_merge(redspol,secd);
2491  if(redspol.size()==0)
2492  {
2493  //a voir.... Dump(Pk,dump);
2494  k++;
2495  my_merge(Spoldejavu,tmpSpoldejavu);
2496  L.destroystore();
2497  continue;
2498  //la matrice a rang plein
2499  //ET les Spol\secondmembre de ce niveau se ,reduisent a 0
2500  }
2501  else
2502  {
2503  //on a des spol\secondmembre qui se reduisent pas a 0
2504  //cad un defaut de commuatation
2505  int tmpdeg=mindeg(redspol,serv);
2506  max_degppcm=k+2;
2507  nouveaumon=1;
2508  cout<<"redspol.size() "<<redspol.size()<<endl;
2509  //cout<<invconv<typename typP::value_type>(redspol.front())<<endl;
2510  if (tmpdeg==(k+1))
2511  my_merge(Spoldejavu,tmpSpoldejavu);
2512  k=tmpdeg;
2513  //cout<<"le mindeg ici vaut "<<k<<endl;
2514  //cout<<"Pk.size() avant recover "<<Pk.size()<<endl;
2515  recover(Pk,Mk,dump,k);
2516 
2517  //Listedejafait(Mk,Spoldejavu);
2518  //cout<<"Pk.size() apres recover "<<Pk.size()<<endl;
2519  forget(b,dump,k,recall);
2520  //forget(b,dump,k);
2521 #ifdef DEB
2522  cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl;
2523 #endif
2524  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
2525  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
2526  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b);
2527 #ifdef DEB
2528  cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl;
2529 #endif
2530  NewDestroyredspol(redspol,Pk);
2531  serv.compress(Pk,dump,b,k);
2532  Dump(Pk,dump);
2533  L.destroystore();
2534  //misa jour de B dans crochet choix!!
2535  continue;
2536  }
2537  }
2538  else
2539  //la matrice n'est pas de rang plein
2540  {
2541  cout<<"matrice de rang pas plein "<<endl;
2542  typPk secd;
2543 #ifdef BONRAJOUT
2544  AddB_dim(Mat,L,P,Pk,Mk,dump,b);
2545 #else
2546  AddB(Mat,Pk,Mk,dump,b,serv);
2547 #endif
2548  //
2549  //secondmembre supprime des trucs dans Pk!!
2550  //
2551  secd=secondmembre(Mat,Pk);
2552  rajoute_voisins(Pk,Mk,dump,b,w,serv);
2553  //ne selectionne que les non nuls
2554  if(secd.size()==0)
2555  {
2556  typPk redspol;
2557  //for(int i=Pk.size();i>rank(Mat);i--)
2558  //{
2559  // if(Pk.back().size!=0)
2560  // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf
2561  // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t));
2562  // Pk.pop_back();
2563  //}//on vire les 0 avant de dumper
2564  // AddB(Mat,Pk,Mk,dump,b);
2565  Dump(Pk,dump);
2566  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
2567 #ifdef NO_TWICE
2568 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
2569  P.push_back(invconv<polyalp>(*iter));
2570 #endif
2571  if(redspol.size()==0)
2572  {
2573  // forget(b,dump,k);
2574  //AddB(Mat,Pk,Mk,b);
2575  //Dump(Pk,dump);
2576  //ici on modifie Pk dans AddB
2577  //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump);
2578  k++;
2579  L.destroystore();
2580  continue;
2581  //la matrice a pas rang plein second membre =0
2582  //ET les Spol de ce niveau se ,reduisent a 0
2583  }
2584  else
2585  {
2586  //on a des spol qui se reduisent pas a 0
2587  //cad un defaut de commutation
2588  k=mindeg(redspol,serv);
2589  recover(Pk,Mk,dump,k);
2590  //Listedejafait(Mk,Spoldejavu);
2591  forget(b,dump,k,recall);
2592  //forget(b,dump,k);
2593  cout<<"il ya un passage par mat rang pas"
2594  <<"plein et pol non zero"<<endl;
2595  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
2596  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
2597  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b);
2598  NewDestroyredspol(redspol,Pk);
2599  serv.compress(Pk,dump,b,k);
2600  Dump(Pk,dump);
2601  L.destroystore();
2602  continue;
2603  }
2604  }
2605  else
2606  {
2607  //on a des pol qui se reduisent pas a 0
2608  //cad un defaut de commuatation dans les coins
2609  typPk redspol;
2610  //for(int i=Pk.size();i>rank(Mat);i--)
2611  // Pk.pop_back();
2612  //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl;
2613  //cout<<"rank(Mat) "<<rank(Mat)<<endl;
2614  //int j=0;
2615  //cout<<"avant recover et meme avant le dump "<<endl;
2616  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
2617  // ;iter++,j++)
2618  // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl;
2619  // AddB(Mat,Pk,Mk,b);
2620  //cout<<"apres ADDB le dump "<<endl;
2621  //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
2622  // ;iter++)
2623  // cout<<invconv<Poly>(*iter)<<endl;
2624  Dump(Pk,dump);
2625  //cout<<"secd.size()" <<secd.size()<<endl;
2626  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
2627  my_merge(secd,redspol);
2628 #ifdef NO_TWICE
2629 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
2630  P.push_back(invconv<polyalp>(*iter));
2631 #endif
2632  k=mindeg(secd,serv);
2633  recover(Pk,Mk,dump,k);
2634  //cout<<"k "<<k<<endl;
2635  //Listedejafait(Mk,Spoldejavu);
2636  //cout<<"apres recover"<<endl;
2637  // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
2638  // ;iter++)
2639  // cout<<invconv<Poly>(*iter)<<endl;
2640  //cout<<"les Spol non reduits"<<endl;
2641  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
2642  // ;iter++)
2643  // cout<<invconv<Poly>(*iter)<<endl;
2644  forget(b,dump,k,recall);
2645 
2646  //forget(b,dump,k);
2647  //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl;
2648  //for(typename typPk::iterator iter = secd.begin();iter!=secd.end()
2649  // ;iter++)
2650  // cout<<invconv<Poly>(*iter)<<endl;
2651  //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
2652  NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv);
2653  //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b);
2654  NewDestroyredspol(secd,Pk);
2655 #ifdef BONRAJOUT
2656  cout<<"Apres NewCrochetchoix"<<endl;
2657 
2658  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
2659  {
2660  for(int i=0;i<p->taille1;i++)
2661  {
2662  cout<<"p.accept[i] "<<p->accept[i]<<endl;
2663  }
2664  for(int i=0;i<p->taille2;i++)
2665  {
2666  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
2667  }
2668  }
2669 #endif
2670  //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end()
2671  // ;iter++)
2672  // cout<<invconv<Poly>(*iter)<<endl;
2673  serv.compress(Pk,dump,b,k);
2674  Dump(Pk,dump);
2675  L.destroystore();
2676  continue;
2677  }
2678 
2679  }
2680  }
2681 
2682  Mat.destroystore();
2683  //while nouveau mon etc...
2684  // Pk=recomposePk(dump);
2685  //return Pk;
2686  // return;
2687 #ifdef DEBUG
2688  for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
2689  {
2690  for(int i=0;i<p->taille1;i++)
2691  {
2692  cout<<"p.accept[i] "<<p->accept[i]<<endl;
2693  }
2694  for(int i=0;i<p->taille2;i++)
2695  {
2696  cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
2697  }
2698  }
2699 #endif
2700  destroy_space(&w);
2701  cout<<"sortie d'algo flash et dimension "<<endl;//<<critere(b,k)<<endl;
2702  return ;//dump;
2703  //comme ca on conserve le tri par degre des formes normales et
2704  //donc la construction des operateurs de multiplication se
2705  //fait plus vite.. :-)
2706 
2707 }
2708 
2709 #endif //ALREADY_corealgo3
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
int GoodDir(const typmon &m, int i, const Base &b)
Definition: corealgo3_omp.hpp:1064
Definition: workspace.hpp:11
void remiseenforme(typpol &p)
Definition: ugly.hpp:2
Definition: dump.hpp:2
Multivariate polynomials.
Definition: MPoly.hpp:28
void ReduceSpol(typPk &S, const typdump &dump, typPk &redspol, const Base &b, workspace &w, monomial_server &serv)
Definition: corealgo3_omp.hpp:1860
void AddB(const typmat &mat, typPk &Pk, const typMk &Mk, const typexceed &exceed, const typsizeexceed &sizeexceed, const typdump &dump, typB &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2470
void affdebug(const typmat &m)
Definition: io.hpp:30
#define max(a, b)
Definition: alp_f2c.H:167
list< polbis< mono, T > > & Solve(typmat &S, std::list< polbis< mono, T > > &TildePk, int **pr, int **pc, workspace &w)
Definition: pol2bisspecial.hpp:609
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
int isdivisible(const mon &m1, const mon &m2, int nbvar)
Definition: isdivisible.hpp:5
void proj(T &Crochet, const typdump &dump, const Base &b)
Definition: proj.hpp:51
int lvar(const dynamicexp< X, E > &A)
Definition: dynamicexp.hpp:178
void free(void *)
void setorder(ptrfun tmpord)
Definition: placemon3.hpp:301
mon * int2mon_
Definition: placemon3.hpp:21
Definition: pol.hpp:6
void varmult(iterator iter1, iterator iter2, mon &var1, mon &var2, const Base &b)
Definition: corealgo3_omp.hpp:1667
void algo(typP P, typdump &dump, Base &b, monomial_server &serv)
Definition: corealgo3_omp.hpp:2316
list< predicat >::iterator iterator
Definition: types.hpp:20
void init_multiple(int n)
Definition: placemon3.hpp:59
int Ispolzero(const pol &p)
Definition: Iszero.hpp:30
int minmaxdegP(typP P, int &maxdeg)
Definition: corealgo3_omp.hpp:187
mon * accept
Definition: types.hpp:6
int my_ord(const mon &m1, const mon &m2)
Definition: ord.hpp:2
int indice2(int i, int j, const Base &b)
Definition: corealgo3_omp.hpp:730
long flag
Definition: alp_f2c.H:52
void inverse(int *&, int)
list< predicat >::const_iterator const_iterator
Definition: types.hpp:21
void update_crochetchoix(typiterpk &iterPk, typiterpk &iter, int tmpind, workspace &w, typserv &serv)
Definition: corealgo3_omp.hpp:1976
void * malloc(YYSIZE_T)
void recover(typPk &Pk, typMk &Mk, const typdump &dump, int k)
Definition: dump.hpp:192
int member(const typMk &tmpMk, const typename typMk::value_type mon)
Definition: corealgo3_omp.hpp:1186
Mon my_divmon(const Mon &mon, int i, const Base &b)
Definition: corealgo3_omp.hpp:1048
coeff * tabcoeff
Definition: workspace.hpp:12
Definition: types.hpp:3
void Dump(const typPk &Pk, typdump &dump)
Definition: dump.hpp:48
T coeff_t
Definition: pol.hpp:9
typmat * MatrixOf(const typPk &L, const typMk &lm, const typmat &mat)
Definition: corealgo3_omp.hpp:282
typpol nf(int var, int indmon, const typdump &dump, const Base &b)
Definition: corealgo3_omp.hpp:750
int taille1
Definition: types.hpp:5
void selectnozero(typP &ttmp)
Definition: Iszero.hpp:40
void stab(typPk &Pk)
Definition: corealgo3_omp.hpp:10
void NewDestroyredspol(typPk &redspol, const typPk &Pk)
Definition: corealgo3_omp.hpp:2287
int nbvar()
Definition: types.hpp:37
int mon2int(const mon &mm)
Definition: placemon.hpp:294
void reinit_multiple()
Definition: placemon3.hpp:85
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
void init_algo(typP &P, int &nouveaumon, int &maxdeg, int &k, typPk &Pk, typMk &Mk, Base &b, typdump &dump, workspace &w, monomial_server &serv)
Definition: corealgo3_omp.hpp:315
void Crochetchoix(const typP &P, typPk &Pk, typPk &redspol, int k, Base &b)
unsigned char * tabnf
Definition: workspace.hpp:13
typPk Spolordsup(const typPk &Pk, const Base &b, const typMk &Spoldejavu)
Definition: corealgo3_omp.hpp:167
void destroy_space(workspace< coeff > *w)
Definition: workspace.hpp:34
void int2mon(const int &i, mon &res)
Definition: placemon.hpp:288
MSKint32t k
Definition: mosek.h:2713
R rep
Definition: Monom.hpp:30
void rajoute_voisins(typPk &Pk, const typMk &Mk, const typdump &dump, Base &b, workspace &w, monomial_server &serv)
Definition: IsinB3.hpp:111
void getperm(int *perm, int sizeperm, int *indextab)
Definition: corealgo3_omp.hpp:795
C coeff_t
Definition: Monom.hpp:26
void init_space(workspace< coeff > *w)
Definition: workspace.hpp:43
int nbbits[256]
Definition: pol2ter.hpp:4
mon lcm(const mon &m1, const mon &m2)
Definition: corealgo3_omp.hpp:34
int goodspol(const mon &m1, const mon &m2, typppcm &ppcm, const Base &b, const typMk &Spoldejavu)
Definition: corealgo3_omp.hpp:129
Definition: placemon3.hpp:14
void NewCrochetchoix(typP &P, typPk &Pk, typMk &Mk, typPk &redspol, int &k, typdump &dump, Base &b, typrecall &recall, workspace &w, monomial_server &serv)
Definition: corealgo3_omp.hpp:2018
MSKCONST char MSKint32t MSKint32t * index
Definition: mosek.h:2860
int compute_ppcm(typppcm &ppcm, const Base &b)
Definition: corealgo3_omp.hpp:46
dynamicexp< X, E >::degree_t Degree(const dynamicexp< X, E > &t)
Definition: dynamicexp.hpp:91
void printmatfile_pequan(const typmat< Scl< MPF > > &m, FILE *fic)
Definition: io.hpp:381
iterator end()
Definition: types.hpp:30
void my_merge(T &l1, const T &l2)
Definition: corealgo3_omp.hpp:27
int IsinB(const mon &m, const Base &b)
Definition: IsinB3.hpp:68
list< predicat > def
Definition: types.hpp:16
Mon mon
Definition: solver_bb_floating.cpp:136
int nbvars
Definition: types.hpp:17
int sizeplacemon()
Definition: placemon3.hpp:313
void increase_space(workspace< coeff > *w)
Definition: workspace.hpp:19
int taille2
Definition: types.hpp:7
Definition: types.hpp:14
exponent_t GetDegree() const
Definition: Monom.hpp:70
void DoBaseMk(const typP &tmpPk, typMk &Mk, Base &b, monomial_server &serv)
Definition: corealgo3_omp.hpp:235
MSKrealt * c
Definition: mosek.h:2678
void conv_merge(typPk &Pk, typP &P, typexceed &ex, typsize &sizeex, const Base &b, monomial_server &serv)
Definition: corealgo3_omp.hpp:1084
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
typP Crochet(const typP &P, int k)
Definition: corealgo3_omp.hpp:199
MPoly< vector< Mon >, my_Dlex< Mon > > Poly
Definition: solver_bb_floating.cpp:138
int sizenf
Definition: workspace.hpp:15
typpol mult(int i, const typpol &pol, const typdump &dump, const Base &b, mon **exce, int &exsize, workspace &w, monomial_server &serv)
Definition: corealgo3_omp.hpp:815
int mindeg(const typPk &l, monomial_server &serv)
Definition: corealgo3_omp.hpp:1942
Monom< COEFF, dynamicexp<'x'> > Mon
Definition: solver_bb_floating.cpp:134
void my_plus(pol &res, const pol &nf, const coeff toto, workspace *w, typserv &serv)
Definition: corealgo3_omp.hpp:361
void Setnbvars(const typP &tmpPk, Base &b)
Definition: corealgo3_omp.hpp:223
int size
Definition: pol.hpp:10
#define COEFF
Definition: symbo2.hpp:8
void Listedejafait(const typMk &Mk, typMk &Spoldejavu)
Definition: corealgo3_omp.hpp:2300
void forget(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump.hpp:75
int newPkMkMatrixof(typMat &mat, typPk &Pk, typP &P, typMk &Mk, int &k, Base &b, typdump &dump, typrecall &recall, workspace &w, monomial_server &serv)
Definition: corealgo3_omp.hpp:1198
mon * refuse
Definition: types.hpp:8
int mulind(int indexbase, int var, const typBase &b)
Definition: placemon3.hpp:126
void AddB_dim(const typmat &mat, const typmat &L, typP &P, typPk &Pk, const typMk &Mk, const typdump &dump, typB &b)
Definition: IsinB3.hpp:545
iterator begin()
Definition: types.hpp:25
list< predicat >::const_reverse_iterator const_reverse_iterator
Definition: types.hpp:23
predicat::monom_t mon
Definition: types.hpp:19
#define pol
Definition: pol2ter.hpp:3
void SetCoeff(const C &c)
Definition: Monom.hpp:68
void compress(typPk &Pk, typdump &dump, const Base &b, int k)
Definition: placemon3.hpp:1076
mon ind
Definition: pol.hpp:11
Multivariate monomials.
Definition: Monom.hpp:21
void findcorresppol(const mon &m, const typdump &dump, pol &res)
Definition: corealgo3_omp.hpp:1634
iterator erase(iterator first, iterator last)
Definition: types.hpp:35
T * nf
Definition: pol.hpp:12
int GB_stop(int k)
Definition: corealgo3_omp.hpp:121
reverse_iterator rbegin()
Definition: types.hpp:27
pol halfred(const mon &targetind, const pol &p, const typdump &dump, const Base &b, monomial_server &serv)
Definition: corealgo3_omp.hpp:1680
MSKint32t MSKint32t char * name
Definition: mosek.h:2853
Home  |  Download & InstallContributions