Borderbasix

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