00001 template<typename typP,typename typPk,typename Base>
00002 void Crochetchoix(const typP & P,typPk & Pk, typPk & redspol,int k,
00003 Base &b);
00004
00005 template<template<typename> class cont,typename mon, typename T>
00006 cont<pol<mon,T> > Crochet(const cont<pol<mon,T> > &P, int k)
00007 {
00008 cont<pol<mon,T> > res;
00009 for(typename cont<pol<mon,T> >::const_iterator iter=P.begin()
00010 ;iter!=P.end();iter++)
00011 {
00012 if(Degree(*iter)==k) res.push_back(*iter);
00013 }
00014 return res;
00015 }
00016
00017 template<typename typPk>
00018 void stab(typPk & Pk)
00019 {
00020 typedef typename typPk::value_type pol;
00021 for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
00022 {
00023 pol tmpres=mon(0);
00024 for(typename pol::iterator iterpol=iter->begin();iterpol!=iter->end();
00025 iterpol++)
00026 {
00027 if(!Iszero(iterpol->GetCoeff()))
00028 tmpres+=*iterpol;
00029 }
00030 *iter=tmpres;
00031 }
00032 }
00033
00034 template<typename T>
00035 void my_merge(T &l1,const T &l2)
00036 {
00037 typename T::const_iterator iter=l2.begin();
00038 for(;iter!=l2.end();iter++)
00039 l1.push_back(*iter);
00040 }
00041
00042 template<typename mon>
00043 mon lcm(const mon &m1,const mon &m2)
00044 {
00045 mon m(1);
00046 int maxi=max(lvar(m1.rep),lvar(m2.rep));
00047 for(int i=0;i<=maxi;i++)
00048 m*=mon(i,max(m1.GetDegree(i),m2.GetDegree(i)));
00049 return m;
00050 }
00051
00052 template<typename typppcm,typename Base>
00053 int compute_ppcm(typppcm &ppcm,const Base & b)
00054 {
00055 typedef typename Base::mon mon;
00056
00057 int maxdeg=-1;
00058 list<mon> list1,list2;
00059 for(typename Base::const_reverse_iterator iter=b.rbegin()
00060 ;iter==b.rbegin();iter++)
00061 {
00062 for(int i=0;i<iter->taille2;i++)
00063 for(int j=i+1;j<iter->taille2;j++)
00064 {
00065 mon tmpmon=lcm(iter->refuse[i],iter->refuse[j]);
00066 #ifndef oldppcm
00067 if((!ppcm.count(tmpmon))&&
00068 (tmpmon.GetDegree()!=
00069 (iter->refuse[i].GetDegree()+iter->refuse[j].GetDegree())))
00070 ppcm[tmpmon]=1;
00071
00072 #else
00073 if((tmpmon.GetDegree()!=
00074 (iter->refuse[i].GetDegree()+iter->refuse[j].GetDegree())))
00075 list1.push_back(tmpmon);
00076 #endif
00077 }
00078 }
00079 #ifdef oldppcm
00080 for(typename list<mon>::iterator iter1=list1.begin();
00081 iter1!=list1.end();iter1++)
00082 list2.push_back(*iter1);
00083 for(typename list<mon>::iterator iter1=list1.begin();
00084 iter1!=list1.end();iter1++)
00085 {
00086 for(typename list<mon>::iterator iter2=list2.begin();
00087 iter2!=list2.end();iter2++)
00088 if(isdivisible(*iter1,*iter2,b))
00089 list2.erase(iter2--);
00090 }
00091 maxdeg=0;
00092 #ifdef DEB
00093 cout<<"liste2.size "<<list2.size()<<endl;
00094 #endif
00095 for(typename list<mon>::iterator iter2=list2.begin();
00096 iter2!=list2.end();iter2++)
00097 {
00098 cout<<"je passe ici "<<*iter2<<endl;
00099 ppcm[*iter2]=1;
00100 if(iter2->GetDegree()>maxdeg)
00101 maxdeg=iter2->GetDegree();
00102 }
00103 #endif
00104 return maxdeg;
00105 }
00106
00107 template<typename mon,typename Base,typename typppcm>
00108 int goodspol(const mon &m1,const mon &m2, typppcm & ppcm,const Base &b
00109 #ifdef NO_TWICE
00110 ,const typMk &Spoldejavu)
00111 #else
00112 )
00113 #endif
00114 {
00115
00116 int res=0,comp=0;
00117 mon m=m1;
00118 for(int i=0;i<b.nbvar();i++)
00119 if(m1.GetDegree(i)!=m2.GetDegree(i))
00120 {
00121 comp++;
00122 if (m1.GetDegree(i)-m2.GetDegree(i)==1)
00123 res+=1;
00124 if (m1.GetDegree(i)-m2.GetDegree(i)==-1)
00125 {
00126 res+=1;
00127 m*=mon(i,1);
00128 }
00129 };
00130
00131
00132
00133
00134
00135
00136
00137
00138 #ifdef NO_TWICE
00139 return (res==2)&&(comp==2)&&ppcm[m]&&!member(Spoldejavu,m);
00140 #else
00141 return (res==2)&&(comp==2)&&ppcm[m];
00142 #endif
00143
00144 }
00145
00146 template<typename typPk,typename Base>
00147 typPk Spolordsup(typPk Pk,const Base & b
00148 #ifndef NO_TWICE
00149 )
00150 #else
00151 ,const typMk & Spoldejavu)
00152 #endif
00153 {
00154 typedef typename typPk::value_type::monom_t mon;
00155
00156 #ifdef experiment
00157 typename typPk::value_type tmp;
00158 #endif
00159 map<mon,int> ppcm;
00160 typPk res;
00161 int maxdeg;
00162
00163 maxdeg=compute_ppcm(ppcm,b);
00164
00165 for(typename typPk::iterator iter1=Pk.begin();iter1!=Pk.end();iter1++)
00166 for(typename typPk::iterator iter2=iter1;iter2!=Pk.end();iter2++)
00167 #ifndef NO_TWICE
00168 if (goodspol(iter1->ind,iter2->ind,ppcm,b))
00169 #else
00170 if (goodspol(iter1->ind,iter2->ind,ppcm,b,Spoldejavu))
00171 #endif
00172 {
00173
00174 res.push_back(*iter1);
00175 res.push_back(*iter2);
00176 }
00177 #ifdef experiment
00178 tmp.ind.SetCoeff(maxdeg);
00179 res.push_back(tmp);
00180 #endif
00181 return res;
00182 }
00183 template<typename typP>
00184 int minmaxdegP(typP P,int &maxdeg)
00185 {
00186 int res=Degree(P.front());
00187 maxdeg=res;
00188 for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
00189 {
00190 res=(res>Degree(*iter))?Degree(*iter):res;
00191 maxdeg=(maxdeg<Degree(*iter))?Degree(*iter):maxdeg;
00192 }
00193 return res;
00194 }
00195 template<typename typP>
00196 typP Crochet(const typP &P, int k)
00197 {
00198 typP res;
00199 for(typename typP::const_iterator iter=P.begin();iter!=P.end();iter++)
00200 if(Degree(*iter)==k) res.push_back(*iter);
00201 return res;
00202 }
00203 template<typename typP, typename Base>
00204 void Setnbvars(const typP &tmpPk,Base& b)
00205 {
00206 int tmpvar=0;
00207 for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
00208 for(typename typP::value_type::const_iterator iterpol=iter->begin();
00209 iterpol!=iter->end();iterpol++)
00210 if(tmpvar<lvar(iterpol->rep)) tmpvar=lvar(iterpol->rep);
00211 b.nbvars=tmpvar+1;
00212 }
00213
00214 template<typename typP, typename typMk, typename Base>
00215 void DoBaseMk(const typP &tmpPk, typMk &Mk, Base &b)
00216 {
00217 typedef typename typMk::value_type mon;
00218 typename Base::predicat_t tmp;
00219 int i=0;
00220
00221
00222 for(typename typP::const_iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
00223 {
00224 mon tmp(choice(*iter,b));
00225 int yes=1;
00226
00227 tmp.SetCoeff(1);
00228 for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++)
00229 if(*iter==tmp) {yes=0;break;};
00230 if(yes) Mk.push_back(tmp);
00231 }
00232
00233 tmp.taille2=Mk.size();
00234 tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(tmp.taille2*sizeof(mon));
00235 tmp.taille1=1;
00236 tmp.accept=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
00237 tmp.accept[0]=mon(1);
00238 i=0;
00239 for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++,i++)
00240 {
00241 tmp.refuse[i]=*iter;
00242 };
00243 if(!b.def.empty())
00244 {
00245 typename Base::predicat_t verytmp;
00246 for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
00247 {
00248 verytmp=*iter;
00249 MAC_REV_FREE<mon>(verytmp.refuse,verytmp.taille2*sizeof(mon));
00250 MAC_REV_FREE<mon>(verytmp.accept,verytmp.taille1*sizeof(mon));
00251 }
00252 b.erase(b.begin(),b.end());
00253 }
00254 b.def.push_back(tmp);
00255 return;
00256 }
00257
00258 template <typename typPk,typename typMk,typename typmat >
00259 typmat*
00260 MatrixOf(const typPk & L,
00261 const typMk & lm,const typmat &mat)
00262 {
00263 typedef typename typPk::value_type POL;
00264 typedef typename typMk::value_type monom_t;
00265 typmat *res=NULL;
00266 map<monom_t,int> index;
00267 int l=1;
00268 if (res!=NULL) {delete res;};
00269 for(typename typMk::const_iterator m = lm.begin(); m!=lm.end(); m++){
00270 index[*m]=l;
00271 l++;
00272 }
00273 int c;
00274 res=new typmat(L.size(),lm.size());
00275 l=0;
00276
00277 for(typename typPk::const_iterator pi = L.begin(); pi != L.end(); ++pi){
00278 for(typename POL::const_iterator m = pi->begin(); m!=pi->end(); m++)
00279 {
00280
00281 if((index.count(*m)))
00282 {
00283 c=index[*m];
00284 (*res)(l,c-1,m->GetCoeff());
00285 }
00286 }
00287 l++;
00288 }
00289 return res;
00290 }
00291
00292 template<typename typMat,typename typP,typename typPk,typename typMk, typename Base,typename typdump>
00293 void init_algo(typP &P,int &nouveaumon, int &maxdeg, int & k
00294 ,typPk &Pk, typMk & Mk, Base & b, typdump & dump)
00295 {
00296 typedef typename typPk::value_type pol;
00297 typedef typename pol::coeff_t coeff;
00298 typedef typename pol::monom_t mon;
00299 const typename typP::value_type::order_t (tmpord)(const mon,const mon);
00300 typP tmpPk=P;
00301 pol debugpol;
00302 typMat *Mat;
00303 int *pr,*pc,flag=1;
00304 setorder(my_ord);
00305 nouveaumon=1;
00306 Setnbvars(P,b);
00307 #ifdef unimul
00308 init_multiple(b.nbvars);
00309 #endif
00310 #ifdef uninf
00311 init_nf<pol>(b.nbvars);
00312 #endif
00313 while(flag)
00314 {
00315 Mk.erase(Mk.begin(),Mk.end());
00316
00317 k=minmaxdegP(tmpPk,maxdeg);
00318
00319
00320 tmpPk=Crochet(tmpPk,k);
00321 #ifdef DEB
00322 for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
00323 cout<<"pol pendant init"<<endl<<*iter<<endl;
00324 #endif
00326 DoBaseMk(tmpPk,Mk,b);
00327
00328
00329
00330 Mat=MatrixOf(tmpPk,Mk,typMat());
00331
00332
00333 tmpPk=Solve(*Mat,tmpPk,&pr,&pc);
00334 selectnozero(tmpPk);
00335
00336 stab(tmpPk);
00337
00338
00339
00340 if(my_rank(*Mat)==(int)tmpPk.size()) flag=0;
00341 Mat->destroystore();
00342 delete(Mat);
00343 free(pr);
00344 free(pc);
00345 }
00346
00347
00348
00349
00350
00351
00352
00353 for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++)
00354 {
00355 Pk.push_back(convert<pol>(*iter,b));
00356
00357
00358
00359 }
00360
00361
00362 debugpol=Pk.front();
00363
00364
00365
00366
00367
00368 Dump(Pk,dump);
00369
00370
00371
00372
00373 return ;
00374 }
00375
00376 template<typename pol,typename coeff>
00377 void inline my_plus2(pol &res1, pol & res2,const pol& nf,
00378 const coeff &toto1,const coeff &toto2 )
00379 {
00380 typedef typename pol::monom_t mon;
00381 unsigned int i=0,stock;;
00382 unsigned int ttmp;
00383 unsigned int tmp;
00384 register coeff *res1nf,*res2nf,*nfnf,*tmpcoeff;
00385 tmp=nf.size;
00386 if(res1.size<tmp)
00387 {
00388 res1.nf=(coeff*)MAC_REV_REALLOC<coeff>(res1.nf,res1.size*sizeof(coeff)
00389 ,tmp*sizeof(coeff));
00390 for(i=res1.size;i<tmp;i++)
00391 res1.nf[i]=0;
00392 res1.size=tmp;
00393 }
00394 if(res2.size<tmp)
00395 {
00396 res2.nf=(coeff*)MAC_REV_REALLOC<coeff>(res2.nf,res2.size*sizeof(coeff)
00397 ,tmp*sizeof(coeff));
00398 for(i=res2.size;i<tmp;i++)
00399 res2.nf[i]=0;
00400 res2.size=tmp;
00401 }
00402 tmp=nf.size;
00403 ttmp=(tmp/8)*8;
00404 tmp=tmp & 7;
00405 res1nf=res1.nf;
00406 res2nf=res2.nf;
00407 nfnf=nf.nf;
00408 for(i=0;i<ttmp;i+=8)
00409 {
00410
00411 tmpcoeff=nfnf+i;
00412 res1nf[i]-=*tmpcoeff*toto1;
00413 res2nf[i]-=*tmpcoeff*toto2;
00414
00415 tmpcoeff=nfnf+i+1;
00416 res1nf[i+1]-=*tmpcoeff*toto1;
00417 res2nf[i+1]-=*tmpcoeff*toto2;
00418
00419 tmpcoeff=nfnf+i+2;
00420 res1nf[i+2]-=*tmpcoeff*toto1;
00421 res2nf[i+2]-=*tmpcoeff*toto2;
00422
00423 tmpcoeff=nfnf+i+3;
00424 res1nf[i+3]-=*tmpcoeff*toto1;
00425 res2nf[i+3]-=*tmpcoeff*toto2;
00426
00427 tmpcoeff=nfnf+i+4;
00428 res1nf[i+4]-=*tmpcoeff*toto1;
00429 res2nf[i+4]-=*tmpcoeff*toto2;
00430
00431 tmpcoeff=nfnf+i+5;
00432 res1nf[i+5]-=*tmpcoeff*toto1;
00433 res2nf[i+5]-=*tmpcoeff*toto2;
00434
00435 tmpcoeff=nfnf+i+6;
00436 res1nf[i+6]-=*tmpcoeff*toto1;
00437 res2nf[i+6]-=*tmpcoeff*toto2;
00438
00439 tmpcoeff=nfnf+i+7;
00440 res1nf[i+7]-=*tmpcoeff*toto1;
00441 res2nf[i+7]-=*tmpcoeff*toto2;
00442 #if 0
00443
00444 tmpcoeff=nfnf+i+8;
00445 res1nf[i+8]-=*tmpcoeff*toto1;
00446 res2nf[i+8]-=*tmpcoeff*toto2;
00447
00448 tmpcoeff=nfnf+i+9;
00449 res1nf[i+9]-=*tmpcoeff*toto1;
00450 res2nf[i+9]-=*tmpcoeff*toto2;
00451
00452
00453 tmpcoeff=nfnf+i+10;
00454 res1nf[i+10]-=*tmpcoeff*toto1;
00455 res2nf[i+10]-=*tmpcoeff*toto2;
00456
00457
00458 tmpcoeff=nfnf+i+11;
00459 res1nf[i+11]-=*tmpcoeff*toto1;
00460 res2nf[i+11]-=*tmpcoeff*toto2;
00461
00462
00463 tmpcoeff=nfnf+i+12;
00464 res1nf[i+12]-=*tmpcoeff*toto1;
00465 res2nf[i+12]-=*tmpcoeff*toto2;
00466
00467
00468 tmpcoeff=nfnf+i+13;
00469 res1nf[i+13]-=*tmpcoeff*toto1;
00470 res2nf[i+13]-=*tmpcoeff*toto2;
00471
00472
00473 tmpcoeff=nfnf+i+14;
00474 res1nf[i+14]-=*tmpcoeff*toto1;
00475 res2nf[i+14]-=*tmpcoeff*toto2;
00476
00477
00478 tmpcoeff=nfnf+i+15;
00479 res1nf[i+15]-=*tmpcoeff*toto1;
00480 res2nf[i+15]-=*tmpcoeff*toto2;
00481
00482 #endif
00483 }
00484 for(register unsigned int j=i;j<nf.size;j++)
00485 {
00486 res1nf[j]-=nfnf[j]*toto1;
00487 res2nf[j]-=nfnf[j]*toto2;
00488 }
00489 }
00490
00491 template<typename pol,typename coeff>
00492 void inline my_plustmp(pol &res,const pol & nf,const coeff toto)
00493 {
00494 typedef typename pol::monom_t mon;
00495 unsigned int i=0,stock;;
00496 unsigned int ttmp;
00497 unsigned int tmp;
00498
00499
00500
00501
00502
00503 register coeff *resnf,*nfnf;
00504 if (toto==0) return;
00505 if(res.size<nf.size)
00506 {
00507
00508 res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
00509 ,nf.size*sizeof(coeff));
00510
00511 for(i=res.size;i<nf.size;i++)
00512 res.nf[i]=0;
00513 res.size=nf.size;
00514 }
00515 ttmp=nf.size/16;
00516 tmp=nf.size & 15;
00517 resnf=res.nf;
00518 nfnf=nf.nf;
00519 for(i=0;i<ttmp;++i)
00520 {
00521 *resnf++-=*nfnf++*toto;
00522 *resnf++-=*nfnf++*toto;
00523 *resnf++-=*nfnf++*toto;
00524 *resnf++-=*nfnf++*toto;
00525 *resnf++-=*nfnf++*toto;
00526 *resnf++-=*nfnf++*toto;
00527 *resnf++-=*nfnf++*toto;
00528 *resnf++-=*nfnf++*toto;
00529 *resnf++-=*nfnf++*toto;
00530 *resnf++-=*nfnf++*toto;
00531 *resnf++-=*nfnf++*toto;
00532 *resnf++-=*nfnf++*toto;
00533 *resnf++-=*nfnf++*toto;
00534 *resnf++-=*nfnf++*toto;
00535 *resnf++-=*nfnf++*toto;
00536 *resnf++-=*nfnf++*toto;
00537 }
00538 for(register unsigned j=0;j<tmp;j++)
00539 *resnf++-=*nfnf++*toto;
00540 }
00541
00542 template<typename pol,typename coeff>
00543 void inline my_plus(pol &res,const pol & nf,const coeff toto)
00544 {
00545 #ifdef DEB
00546 cout<<"dans myplus je calcul"<<endl<<invconv<Poly>(res)<<endl<<
00547 "toto "<<toto<<endl<<"nf"<<endl<<invconv<Poly>(nf)<<endl;
00548 #endif
00549 typedef typename pol::monom_t mon;
00550 register unsigned int i=0;
00551 register unsigned int ttmp,tmp;
00552 register coeff *nfnf=nf.nf,*resnf;
00553 coeff *ptr1,*ptr2;
00554
00555 tmp=nf.size;
00556 if(res.size<tmp)
00557 {
00558 res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
00559 ,tmp*sizeof(coeff));
00560 for(int i=res.size;i<tmp;i++)
00561 res.nf[i]=0;
00562 res.size=tmp;
00563 }
00564 resnf=res.nf;
00565 ttmp=(tmp/16)*16;
00566 ptr1=resnf;
00567 ptr2=nfnf;
00568
00569
00570 for(;i<ttmp;i+=16,resnf+=16,nfnf+=16)
00571 {
00572 {
00573 resnf[0]-=nfnf[0]*toto;
00574 resnf[1]-=nfnf[1]*toto;
00575 resnf[2]-=nfnf[2]*toto;
00576 resnf[3]-=nfnf[3]*toto;
00577 resnf[4]-=nfnf[4]*toto;
00578 resnf[5]-=nfnf[5]*toto;
00579 resnf[6]-=nfnf[6]*toto;
00580 resnf[7]-=nfnf[7]*toto;
00581 resnf[8]-=nfnf[8]*toto;
00582 resnf[9]-=nfnf[9]*toto;
00583 resnf[10]-=nfnf[10]*toto;
00584 resnf[11]-=nfnf[11]*toto;
00585 resnf[12]-=nfnf[12]*toto;
00586 resnf[13]-=nfnf[13]*toto;
00587 resnf[14]-=nfnf[14]*toto;
00588 resnf[15]-=nfnf[15]*toto;
00589 }
00590 }
00591 resnf=ptr1;nfnf=ptr2;
00592 for(register unsigned int j=i;j<tmp;j++)
00593 resnf[j]-=nfnf[j]*toto;
00594 #ifdef DEB
00595 cout<<"les resultat "<<endl<<invconv<Poly>(res)<<endl;
00596 #endif
00597 }
00598
00599
00600 template<typename pol>
00601 void inline my_plus(pol &res,const pol & nf)
00602 {
00603 typedef typename pol::monom_t mon;
00604 typedef typename pol::coeff_t coeff;
00605 register unsigned int i=0;
00606 register unsigned int ttmp,tmp;
00607 register coeff *nfnf=nf.nf,*resnf;;
00608
00609 tmp=nf.size;
00610 if(res.size<tmp)
00611 {
00612 res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
00613 ,tmp*sizeof(coeff));
00614 for(int i=res.size;i<tmp;i++)
00615 res.nf[i]=0;
00616 res.size=tmp;
00617 }
00618 ttmp=(tmp/16)*16;
00619 resnf=res.nf;
00620
00621 for(;i<ttmp;i+=16)
00622 {
00623 {
00624 resnf[i]-=nfnf[i];
00625 resnf[i+1]-=nfnf[i+1];
00626 resnf[i+2]-=nfnf[i+2];
00627 resnf[i+3]-=nfnf[i+3];
00628 resnf[i+4]-=nfnf[i+4];
00629 resnf[i+5]-=nfnf[i+5];
00630 resnf[i+6]-=nfnf[i+6];
00631 resnf[i+7]-=nfnf[i+7];
00632 resnf[i+8]-=nfnf[i+8];
00633 resnf[i+9]-=nfnf[i+9];
00634 resnf[i+10]-=nfnf[i+10];
00635 resnf[i+11]-=nfnf[i+11];
00636 resnf[i+12]-=nfnf[i+12];
00637 resnf[i+13]-=nfnf[i+13];
00638 resnf[i+14]-=nfnf[i+14];
00639 resnf[i+15]-=nfnf[i+15];
00640 }
00641 }
00642 for(register unsigned int j=i;j<tmp;j++)
00643 resnf[j]-=nfnf[j];
00644 }
00645
00646 template<typename pol,typename coeff>
00647 void inline myplus22(pol &res,const pol & nf,const coeff toto, const pol &nf2,const coeff toto2)
00648 {
00649 typedef typename pol::monom_t mon;
00650 register unsigned int i=0;
00651 register unsigned int ttmp;
00652 register unsigned int tmp;
00653 register coeff *resnf,*nfnf,*nf2nf;
00654 coeff tmp1,tmp2;
00655 int maxsize=max(nf.size,nf2.size);
00656 if(res.size<maxsize)
00657 {
00658 res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
00659 ,maxsize*sizeof(coeff));
00660 for(int i=res.size;i<maxsize;i++)
00661 res.nf[i]=0;
00662 res.size=maxsize;
00663 }
00664 resnf=res.nf;
00665 nfnf=nf.nf;
00666 nf2nf=nf2.nf;
00667 if(nf.size<nf2.size)
00668 {
00669 ttmp=(nf.size/16)*16;
00670 tmp=nf.size & 15;
00671 for(;i<ttmp;i+=16)
00672 {
00673 {
00674
00675
00676
00677
00678
00679 resnf[i]-=nfnf[i]*toto+nf2nf[i]*toto2;
00680
00681
00682
00683
00684
00685 resnf[i+1]-=nfnf[i+1]*toto+nf2nf[i+1]*toto2;
00686
00687
00688
00689
00690
00691 resnf[i+2]-=nfnf[i+2]*toto+nf2nf[i+2]*toto2;
00692
00693
00694
00695
00696
00697 resnf[i+3]-=nfnf[i+3]*toto+nf2nf[i+3]*toto2;
00698
00699
00700
00701
00702
00703 resnf[i+4]-=nfnf[i+4]*toto+nf2nf[i+4]*toto2;
00704
00705
00706
00707
00708
00709 resnf[i+5]-=nfnf[i+5]*toto+nf2nf[i+5]*toto2;
00710
00711
00712
00713
00714
00715 resnf[i+6]-=nfnf[i+6]*toto+nf2nf[i+6]*toto2;
00716
00717
00718
00719
00720
00721 resnf[i+7]-=nfnf[i+7]*toto+nf2nf[i+7]*toto2;
00722
00723
00724
00725
00726
00727 resnf[i+8]-=nfnf[i+8]*toto+nf2nf[i+8]*toto2;
00728
00729
00730
00731
00732
00733 resnf[i+9]-=nfnf[i+9]*toto+nf2nf[i+9]*toto2;
00734
00735
00736
00737
00738
00739 resnf[i+10]-=nfnf[i+10]*toto+nf2nf[i+10]*toto2;
00740
00741
00742
00743
00744
00745 resnf[i+11]-=nfnf[i+11]*toto+nf2nf[i+11]*toto2;
00746
00747
00748
00749
00750
00751 resnf[i+12]-=nfnf[i+12]*toto+nf2nf[i+12]*toto2;
00752
00753
00754
00755
00756
00757 resnf[i+13]-=nfnf[i+13]*toto+nf2nf[i+13]*toto2;
00758
00759
00760
00761
00762
00763 resnf[i+14]-=nfnf[i+14]*toto+nf2nf[i+14]*toto2;
00764
00765
00766
00767
00768
00769
00770 resnf[i+15]-=nfnf[i+15]*toto+nf2nf[i+15]*toto2;
00771 }
00772 }
00773 for(register unsigned int j=i;j<nf.size;j++)
00774 resnf[j]-=nfnf[j]*toto+nf2nf[j]*toto2;
00775 for(register unsigned int j=nf.size;j<nf2.size;j++)
00776 resnf[j]-=nf2nf[j]*toto2;
00777
00778 }
00779 else
00780 {
00781 ttmp=(nf2.size/16)*16;
00782 tmp=nf2.size & 15;
00783 for(;i<ttmp;i+=16)
00784 {
00785 {
00786 tmp1=nfnf[i];
00787 tmp1*=toto;
00788 tmp2=nf2nf[i];
00789 tmp2*=toto2;
00790 resnf[i]-=tmp1+tmp2;
00791
00792 tmp1=nfnf[i+1];
00793 tmp1*=toto;
00794 tmp2=nf2nf[i+1];
00795 tmp2*=toto2;
00796 resnf[i+1]-=tmp1+tmp2;
00797
00798 tmp1=nfnf[i+2];
00799 tmp1*=toto;
00800 tmp2=nf2nf[i+2];
00801 tmp2*=toto2;
00802 resnf[i+2]-=tmp1+tmp2;
00803
00804 tmp1=nfnf[i+3];
00805 tmp1*=toto;
00806 tmp2=nf2nf[i+3];
00807 tmp2*=toto2;
00808 resnf[i+3]-=tmp1+tmp2;
00809
00810 tmp1=nfnf[i+4];
00811 tmp1*=toto;
00812 tmp2=nf2nf[i+4];
00813 tmp2*=toto2;
00814 resnf[i+4]-=tmp1+tmp2;
00815
00816 tmp1=nfnf[i+5];
00817 tmp1*=toto;
00818 tmp2=nf2nf[i+5];
00819 tmp2*=toto2;
00820 resnf[i+5]-=tmp1+tmp2;
00821
00822 tmp1=nfnf[i+6];
00823 tmp1*=toto;
00824 tmp2=nf2nf[i+6];
00825 tmp2*=toto2;
00826 resnf[i+6]-=tmp1+tmp2;
00827
00828 tmp1=nfnf[i+7];
00829 tmp1*=toto;
00830 tmp2=nf2nf[i+7];
00831 tmp2*=toto2;
00832 resnf[i+7]-=tmp1+tmp2;
00833
00834 tmp1=nfnf[i+8];
00835 tmp1*=toto;
00836 tmp2=nf2nf[i+8];
00837 tmp2*=toto2;
00838 resnf[i+8]-=tmp1+tmp2;
00839
00840 tmp1=nfnf[i+9];
00841 tmp1*=toto;
00842 tmp2=nf2nf[i+9];
00843 tmp2*=toto2;
00844 resnf[i+9]-=tmp1+tmp2;
00845
00846 tmp1=nfnf[i+10];
00847 tmp1*=toto;
00848 tmp2=nf2nf[i+10];
00849 tmp2*=toto2;
00850 resnf[i+10]-=tmp1+tmp2;
00851
00852 tmp1=nfnf[i+11];
00853 tmp1*=toto;
00854 tmp2=nf2nf[i+11];
00855 tmp2*=toto2;
00856 resnf[i+11]-=tmp1+tmp2;
00857
00858 tmp1=nfnf[i+12];
00859 tmp1*=toto;
00860 tmp2=nf2nf[i+12];
00861 tmp2*=toto2;
00862 resnf[i+12]-=tmp1+tmp2;
00863
00864 tmp1=nfnf[i+13];
00865 tmp1*=toto;
00866 tmp2=nf2nf[i+13];
00867 tmp2*=toto2;
00868 resnf[i+13]-=tmp1+tmp2;
00869
00870 tmp1=nfnf[i+14];
00871 tmp1*=toto;
00872 tmp2=nf2nf[i+14];
00873 tmp2*=toto2;
00874 resnf[i+14]-=tmp1+tmp2;
00875
00876 tmp1=nfnf[i+15];
00877 tmp1*=toto;
00878 tmp2=nf2nf[i+15];
00879 tmp2*=toto2;
00880 resnf[i+15]-=tmp1+tmp2;
00881 }
00882 }
00883 for(register unsigned int j=i;j<nf2.size;j++)
00884 resnf[j]-=nfnf[j]*toto+nf2nf[j]*toto2;
00885 for(register unsigned int j=nf2.size;j<nf.size;j++)
00886 resnf[j]-=nfnf[j]*toto;
00887
00888 }
00889 }
00890
00891 template<typename pol,typename coeff>
00892 void inline myplus44(pol &res,const pol & nf,const coeff toto,
00893 const pol &nf2,const coeff toto2,
00894 const pol &nf3,const coeff toto3,
00895 const pol &nf4,const coeff toto4)
00896 {
00897 typedef typename pol::monom_t mon;
00898 register unsigned int i=0;
00899 register unsigned int ttmp;
00900 register unsigned int tmp;
00901 coeff *resnf,*nfnf,*nf2nf,*nf3nf,*nf4nf;
00902 int maxsize=max(max(nf.size,nf2.size),max(nf3.size,nf4.size));
00903 int minsize=min(min(nf.size,nf2.size),min(nf3.size,nf4.size));
00904 if(res.size<maxsize)
00905 {
00906 res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff)
00907 ,maxsize*sizeof(coeff));
00908 for(int i=res.size;i<maxsize;i++)
00909 res.nf[i]=0;
00910 res.size=maxsize;
00911 }
00912 resnf=res.nf;
00913 nfnf=nf.nf;
00914 nf2nf=nf2.nf;
00915 nf3nf=nf3.nf;
00916 nf4nf=nf4.nf;
00917 ttmp=(minsize/16)*16;
00918 tmp=minsize & 15;
00919 for(;i<ttmp;i+=16)
00920 {
00921 {
00922 resnf[i]-=nfnf[i]*toto+nf2nf[i]*toto2
00923 +nf3nf[i]*toto3+nf4nf[i]*toto4;
00924 resnf[i+1]-=nfnf[i+1]*toto+nf2nf[i+1]*toto2
00925 +nf3nf[i+1]*toto3+nf4nf[i+1]*toto4;
00926 resnf[i+2]-=nfnf[i+2]*toto+nf2nf[i+2]*toto2
00927 +nf3nf[i+2]*toto3+nf4nf[i+2]*toto4;
00928 resnf[i+3]-=nfnf[i+3]*toto+nf2nf[i+3]*toto2
00929 +nf3nf[i+3]*toto3+nf4nf[i+3]*toto4;
00930 resnf[i+4]-=nfnf[i+4]*toto+nf2nf[i+4]*toto2
00931 +nf3nf[i+4]*toto3+nf4nf[i+4]*toto4;
00932 resnf[i+5]-=nfnf[i+5]*toto+nf2nf[i+5]*toto2
00933 +nf3nf[i+5]*toto3+nf4nf[i+5]*toto4;
00934 resnf[i+6]-=nfnf[i+6]*toto+nf2nf[i+6]*toto2
00935 +nf3nf[i+6]*toto3+nf4nf[i+6]*toto4;
00936 resnf[i+7]-=nfnf[i+7]*toto+nf2nf[i+7]*toto2
00937 +nf3nf[i+7]*toto3+nf4nf[i+7]*toto4;
00938 resnf[i+8]-=nfnf[i+8]*toto+nf2nf[i+8]*toto2
00939 +nf3nf[i+8]*toto3+nf4nf[i+8]*toto4;
00940 resnf[i+9]-=nfnf[i+9]*toto+nf2nf[i+9]*toto2
00941 +nf3nf[i+9]*toto3+nf4nf[i+9]*toto4;
00942 resnf[i+10]-=nfnf[i+10]*toto+nf2nf[i+10]*toto2
00943 +nf3nf[i+10]*toto3+nf4nf[i+10]*toto4;
00944 resnf[i+11]-=nfnf[i+11]*toto+nf2nf[i+11]*toto2
00945 +nf3nf[i+11]*toto3+nf4nf[i+11]*toto4;
00946 resnf[i+12]-=nfnf[i+12]*toto+nf2nf[i+12]*toto2
00947 +nf3nf[i+12]*toto3+nf4nf[i+12]*toto4;
00948 resnf[i+13]-=nfnf[i+13]*toto+nf2nf[i+13]*toto2
00949 +nf3nf[i+13]*toto3+nf4nf[i+13]*toto4;
00950 resnf[i+14]-=nfnf[i+14]*toto+nf2nf[i+14]*toto2
00951 +nf3nf[i+14]*toto3+nf4nf[i+14]*toto4;
00952 resnf[i+15]-=nfnf[i+15]*toto+nf2nf[i+15]*toto2
00953 +nf3nf[i+15]*toto3+nf4nf[i+15]*toto4;
00954 }
00955 }
00956 for(register unsigned int j=i;j<nf.size;j++)
00957 resnf[j]-=nfnf[j]*toto;
00958 for(register unsigned int j=i;j<nf2.size;j++)
00959 resnf[j]-=nf2nf[j]*toto2;
00960 for(register unsigned int j=i;j<nf3.size;j++)
00961 resnf[j]-=nf3nf[j]*toto3;
00962 for(register unsigned int j=i;j<nf4.size;j++)
00963 resnf[j]-=nf4nf[j]*toto4;
00964
00965 }
00966
00967
00968 template<typename mon,typename Base>
00969 int indice2(int i,int j,const Base & b)
00970 {
00971 int res=-1;
00972 mon tmp;
00973 int2mon(j,tmp);
00974 tmp*=mon(i,1);
00975
00976 if(IsinB(tmp,b))
00977 {
00978 res=mon2int(tmp);
00979
00980 }
00981 return res;
00982 }
00983
00984 template<typename mon,typename Base>
00985 int indice2(const mon &tmp,const Base & b)
00986 {
00987 int res=-1;
00988 if(IsinB(tmp,b))
00989 {
00990 res=mon2int(tmp);
00991
00992 }
00993 return res;
00994 }
00995
00996
00997
00998
00999 #ifndef uninf
01000 template<typename typpol,typename typdump,typename Base>
01001 typpol nf(int var ,int indmon,const typdump &dump,const Base & b)
01002 {
01003
01004
01005 typedef typename typdump::value_type dumpstruct;
01006 typedef typpol pol;
01007 typedef typename pol::monom_t mon;
01008 pol res;
01009 res.nf=NULL;
01010 res.size=-1;
01011 mon tmpmon;
01012 int deg=0;
01013 typename typdump::const_iterator iter;
01014 int2mon(indmon,tmpmon);
01015 deg=tmpmon.GetDegree()+1;
01016
01017 tmpmon*=mon(var,1);
01018 for(iter=dump.begin();
01019 (iter!=dump.end()) && (iter->k!=deg);iter++);
01020
01021
01022
01023
01024
01025 if(iter!=dump.end())
01026 {
01027 int i;
01028 for(i=0;i<iter->size;i++)
01029 {
01030
01031 if(iter->nf[i].ind.rep==tmpmon.rep)
01032 break;
01033 }
01034 if(i!=iter->size)
01035
01036
01037
01038 res=(iter->nf[i]);
01039 }
01040
01041
01042 return res;
01043 }
01044 #endif
01045
01046 template<typename typpol,typename typdump,typename Base, typename mon>
01047 typpol nf(const mon &ind,const typdump &dump,const Base & b)
01048 {
01049
01050
01051 typedef typename typdump::value_type dumpstruct;
01052 typedef typpol pol;
01053 pol res;
01054 res.nf=NULL;
01055 res.size=-1;
01056 int deg=0;
01057 typename typdump::const_iterator iter;
01058 deg=ind.GetDegree();
01059 for(iter=dump.begin();
01060 (iter!=dump.end()) && (iter->k!=deg);iter++);
01061 if(iter!=dump.end())
01062 {
01063 int i;
01064 for(i=0;i<iter->size;i++)
01065 {
01066 if(iter->nf[i].ind.rep==ind.rep)
01067 break;
01068 }
01069 if(i!=iter->size)
01070 res=(iter->nf[i]);
01071 }
01072 return res;
01073 }
01074
01075
01076 template<typename typpol,typename typdump,typename Base,typename mon>
01077 typpol inline mult(int i,const typpol &pol,const typdump &dump,
01078 const Base &b,mon **exce,int &exsize)
01079 {
01080 typedef typename typpol::coeff_t coeff;
01081
01082 typpol ret;
01083 coeff *res=NULL,*polnf;
01084 #ifndef unimul
01085 mon *stockmontab=(mon*)MAC_REV_MALLOC<mon>(pol.size*sizeof(mon));
01086 #endif
01087 ret.nf=res;
01088 (*exce)=(mon*)MAC_REV_MALLOC<mon>((pol.size+1)*sizeof(mon));
01089 int *stockindicetab=(int*)malloc(pol.size*sizeof(int)),*tmpptr;
01090 int noquo=0;
01091 static int nbmyplus=0;
01092 #ifdef plus2
01093 int flagplus=0;
01094 coeff stockcoeffplus;
01095 typpol stockpolplus;
01096 #endif
01097 #ifdef plus4
01098 int flagplus=0;
01099 coeff stockcoeffplus[4];
01100 typpol stockpolplus[4];
01101 #endif
01102 int maxind=0;
01103 tmpptr=stockindicetab;
01104
01105 for(int j=0;j<pol.size;++j)
01106 if (!Iszero(pol.nf[j]))
01107 {
01108 #ifdef unimul
01109 int stockindice2=mulind(j,i,b);
01110 *tmpptr++=stockindice2;
01111 #else
01112 mon tmpmon;
01113 int2mon(j,tmpmon);
01114 tmpmon*=mon(i,1);
01115 stockmontab[j]=tmpmon;
01116 int stockindice2=indice2<mon>(tmpmon,b);
01117 *tmpptr++=stockindice2;
01118 #endif
01119
01120
01121
01122
01123 if (maxind<stockindice2)
01124 maxind=stockindice2;
01125 }
01126
01127
01128 ret.nf=(coeff*)MAC_REV_MALLOC<coeff>((maxind+1)*sizeof(coeff));
01129 for(int j=0;j<=maxind;j++)
01130 ((coeff*)(ret.nf))[j]=0;
01131 ret.size=maxind+1;
01132
01133 tmpptr=stockindicetab;
01134 polnf=pol.nf;
01135 for(int j=0;j<pol.size;++j,polnf++)
01136 {
01137 const coeff stockpol=*polnf;
01138 if (!Iszero(stockpol))
01139 {
01140 int stockindice2=*tmpptr++;
01141
01142 if (stockindice2>=0)
01143 {
01144 ret.nf[stockindice2]+=stockpol;
01145
01146
01147 }
01148 else
01149 {
01150
01151
01152
01153
01154
01155
01156
01157
01158 typpol tmp;
01159
01160 #ifdef unimul
01161 tmp=nf<typpol>(i,j,dump,b);
01162 #else
01163 tmp=nf<typpol>(stockmontab[j],dump,b);
01164 #endif
01165
01166
01167
01168
01169 if (tmp.size!=-1)
01170 {
01171 #ifdef plus4
01172 if(flagplus==3)
01173 {
01174 flagplus=0;
01175 myplus44(ret,tmp,stockpol,
01176 stockpolplus[0],stockcoeffplus[0],
01177 stockpolplus[1],stockcoeffplus[1],
01178 stockpolplus[2],stockcoeffplus[2]);
01179 }
01180 else
01181 {
01182 stockcoeffplus[flagplus]=stockpol;
01183 stockpolplus[flagplus]=tmp;
01184 flagplus++;
01185 }
01186 #endif
01187
01188 #ifdef plus2
01189 if(flagplus==1)
01190 {
01191 flagplus=0;
01192 myplus22(ret,tmp,stockpol,stockpolplus,stockcoeffplus);
01193 }
01194 else
01195 {
01196 stockcoeffplus=stockpol;
01197 stockpolplus=tmp;
01198 flagplus=1;
01199 }
01200 #else
01201
01202
01203
01204
01205 my_plus(ret,tmp,stockpol);
01206
01207
01208
01209 #endif
01210 }
01211 else
01212 {
01213 mon tmpmon;
01214 (*exce)[noquo]=mon(i,1);
01215 int2mon(j,tmpmon);
01216
01217 (*exce)[noquo]*=tmpmon;
01218 (*exce)[noquo]*=stockpol;
01219 ++noquo;
01220 };
01221
01222
01223 }
01224 }
01225 }
01226
01227
01228
01229 #ifdef plus4
01230 for(int ii=0;ii<flagplus;ii++)
01231 my_plus(ret,stockpolplus[ii],stockcoeffplus[ii]);
01232 #endif
01233
01234 #ifdef plus2
01235 if(flagplus)
01236 {
01237 my_plus(ret,stockpolplus,stockcoeffplus);
01238 }
01239 #endif
01240
01241 ret.ind=pol.ind;
01242 ret.ind*=mon(i,1);
01243
01244 (*exce)[noquo++]=ret.ind;
01245 exsize=noquo;
01246 (*exce)=(mon*)MAC_REV_REALLOC<mon>((*exce),(pol.size+1)*sizeof(mon)
01247 ,(noquo)*sizeof(mon));
01248 ret.ind.SetCoeff(noquo+1);
01249 #ifndef unimul
01250 MAC_REV_FREE<mon>(stockmontab,pol.size*sizeof(mon));
01251 #endif
01252 free(stockindicetab);
01253
01254
01255
01256 return ret;
01257
01258 }
01259
01260
01261 template <typename Mon,typename Base>
01262 Mon my_divmon(const Mon &mon,int i,const Base& b)
01263 {
01264 Mon res(1);
01265 for(int j=0;j<b.nbvar();j++)
01266 if(i==j)
01267 {
01268 res*=Mon(j,mon.GetDegree(j)-1);
01269 }
01270 else
01271 {
01272 res*=Mon(j,mon.GetDegree(j));
01273 }
01274 return res;
01275 }
01276
01277 template<typename typmon,typename Base>
01278 int GoodDir(const typmon &m,int i, const Base & b)
01279 {
01280 int res=0;
01281 mon tmpm=m*mon(i,1);
01282
01283
01284 for(int j=0;j<b.nbvar();j++)
01285 {
01286 if(tmpm.GetDegree(j)>=1)
01287 if(IsinB(my_divmon(tmpm,j,b),b)) {res=1;break;};
01288 }
01289
01290 return res;
01291 }
01292
01293
01294
01295 template<typename typPk,typename typP,typename typexceed,
01296 typename typsize ,typename Base>
01297 void conv_merge(typPk &Pk,typP &P,typexceed &ex,typsize &sizeex,const Base &b)
01298 {
01299 typedef typename typP::value_type polalp;
01300 typedef typename polalp::order_t ord;
01301 typedef typename polalp::monom_t mon;
01302 typedef typename typPk::value_type pol;
01303 typedef typename pol::coeff_t coeff;
01304 coeff * tabcoeff=NULL;
01305 int * tabindices=NULL;
01306 int tabsize=0;
01307 #ifdef DEBUG
01308 cout<<"entree dans conv_merge"<<endl;
01309 for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
01310 {
01311 for(int i=0;i<p->taille1;i++)
01312 {
01313 cout<<"p.accept[i] "<<p->accept[i]<<endl;
01314 }
01315 for(int i=0;i<p->taille2;i++)
01316 {
01317 cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
01318 }
01319 }
01320 cout<<"p-taille2 "<<b.begin()->taille2<<" "<<b.begin()->taille2-1<<endl;
01321 cout<<"I=ideal("<<endl;
01322 {
01323 typename Base::const_iterator p=b.begin();
01324 for(int i=0;i<p->taille2-1;i++)
01325 {
01326 cout<<p->refuse[i]<<","<<endl;
01327 }
01328 if(p->taille2>=1) cout<<p->refuse[p->taille2-1]<<")"<<endl;
01329 }
01330 #endif //DEBUG
01331 for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
01332 {
01333
01334 pol tmp;
01335 int max=0;
01336 tmp.ind=mon(1);
01337
01338 tabcoeff=(coeff*)MAC_REV_REALLOC<coeff>((void*)tabcoeff,
01339 tabsize*sizeof(coeff),
01340 iter->size()*sizeof(coeff));
01341 tabindices=(int*)realloc((void*)tabindices,iter->size()*sizeof(int));
01342 tabsize=iter->size();
01343
01344 for(int i=0;i<tabsize;i++)
01345 {
01346 tabcoeff[i]=0;
01347 }
01348
01349
01350 mon * tmpex=NULL;
01351 tmpex=(mon*)MAC_REV_REALLOC<mon>((void*)tmpex,0,tabsize*sizeof(mon));
01352 {
01353 int comp=0;int i=0;
01354 for(typename polalp::iterator iterpol=iter->begin();
01355 iterpol!=iter->end();iterpol++)
01356 {
01357
01358 if (IsinB(*iterpol,b))
01359 {
01360 tabcoeff[i]=iterpol->GetCoeff();
01361 tabindices[i]=mon2int(*iterpol);
01362 if(tabindices[i]>max) max=tabindices[i];
01363 i++;
01364 }
01365 else
01366 {
01367
01368 if(!Iszero(iterpol->GetCoeff()))
01369 tmpex[comp++]=*iterpol;
01370 }
01371 }
01372 tmpex=(mon*)MAC_REV_REALLOC<mon>((void*)tmpex,tabsize*sizeof(mon)
01373 ,(comp+1)*sizeof(mon));
01374 tmp.size=max+1;
01375 tmp.nf=(coeff*)MAC_REV_MALLOC<coeff>(tmp.size*sizeof(coeff));
01376 for(int j=0;j<tmp.size;j++)
01377 tmp.nf[j]=0;
01378 for(int j=0;j<i;j++)
01379 tmp.nf[tabindices[j]]=tabcoeff[j];
01380 tmp.ind=mon(comp+1);
01381 Pk.push_back(tmp);
01382 ex.push_back(tmpex);
01383 sizeex.push_back(comp);
01384 }
01385 }
01386 MAC_REV_FREE<coeff>(tabcoeff,tabsize*sizeof(coeff));
01387 free(tabindices);
01388 }
01389
01390 template<typename typMk>
01391 int member(const typMk & tmpMk,const typename typMk::value_type mon)
01392 {
01393 int res=0;
01394 for(typename typMk::const_iterator iter=tmpMk.begin();
01395 iter!=tmpMk.end();iter++)
01396 if(iter->rep==mon.rep) {res=1;break;}
01397 return res;
01398 }
01399
01400 template<typename typP,typename typPk, typename typMk,typename typexceed
01401 ,typename typsize,typename typdump,typename Base>
01402 void putingoodshape(const typP & P,typPk &workvect,const typMk & tmpMk
01403 ,typexceed & exceed,typsize & sizeex
01404 ,const typdump & dump,const Base & b)
01405 {
01406 typedef typename typPk::value_type pol;
01407 typedef typename pol::coeff_t coeff;
01408 typedef typename typexceed::value_type typex;
01409 typedef typename typMk::value_type mon;
01410 typedef typename typP::value_type polyalp;
01411 typP tobeproj;
01412 for(typename typPk::iterator iter=workvect.begin();
01413 iter!=workvect.end();iter++)
01414 {
01415 int sizeexceed=0;
01416 polyalp projpol(0);
01417 typex tmpex=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon)*tmpMk.size());
01418 for(unsigned int i=0;i<tmpMk.size();i++)
01419 tmpex[i]=mon(0);
01420
01421 for(int i=0;i<iter->size;i++)
01422 {
01423 if(!Iszero(iter->nf[i]))
01424 {
01425 mon tmpmon;
01426 int2mon(i,tmpmon);
01427 if(!IsinB(tmpmon,b))
01428 {
01429 if(member(tmpMk,tmpmon))
01430 {
01431 tmpex[sizeexceed++]=tmpmon*iter->nf[i];
01432 iter->nf[i]=0;
01433 }
01434 else
01435 {
01436 projpol+=tmpmon*iter->nf[i];
01437 iter->nf[i]=0;
01438 };
01439 }
01440 }
01441 }
01442 if(iter->ind.GetDegree()>0)
01443 tmpex[sizeexceed++]=iter->ind;
01444 exceed.push_back(tmpex);
01445 tobeproj.push_back(projpol);
01446
01447
01448 sizeex.push_back(sizeexceed);
01449 }
01450
01451 proj(tobeproj,dump,b);
01452 {
01453 typename typPk::iterator iter=workvect.begin();
01454 typename typexceed::iterator iterex=exceed.begin();
01455 typename typsize::iterator itersize=sizeex.begin();
01456 for(typename typP::iterator iterproj=tobeproj.begin();
01457 iterproj!=tobeproj.end();iterproj++,iter++,iterex++,itersize++)
01458 {
01459
01460 int maxend=iter->size-1;
01461 for(typename polyalp::iterator iterpol=iterproj->begin();
01462 iterpol!=iterproj->end();iterpol++)
01463 {
01464 if(IsinB(*iterpol,b)&&maxend<mon2int(*iterpol))
01465 maxend=mon2int(*iterpol);
01466 }
01467 iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf
01468 ,iter->size*sizeof(coeff)
01469 ,(maxend+1)*sizeof(coeff));
01470 for(int i=iter->size;i<=maxend;i++)
01471 iter->nf[i]=0;
01472 for(typename polyalp::iterator iterpol=iterproj->begin();
01473 iterpol!=iterproj->end();iterpol++)
01474 {
01475 if(IsinB(*iterpol,b))
01476 {
01477 iter->nf[mon2int(*iterpol)]+=iterpol->GetCoeff();
01478 }
01479 else
01480 {
01481 int i=0;
01482
01483 for(;(i<(*itersize))&&((*iterex)[i].rep!=iterpol->rep);i++);
01484 if(i<(*itersize))
01485 {
01486 (*iterex)[i]+=*iterpol;
01487 }
01488 else
01489 {
01490 (*iterex)[(*itersize)++]=*iterpol;
01491
01492 }
01493 }
01494 }
01495 *iterex=(typex)MAC_REV_REALLOC<mon>(*iterex,tmpMk.size()*sizeof(mon)
01496 ,(*itersize)*sizeof(mon));
01497 iter->size=maxend+1;
01498
01499 }
01500
01501 }
01502 }
01503
01504 template<typename typMat,typename typPk,typename typP,
01505 typename typMk,typename Base,typename typdump,typename typrecall>
01506 int newPkMkMatrixof(typMat &mat,typPk &Pk, typP &P,typMk &Mk,
01507 int &k,Base &b, typdump &dump,typrecall &recall
01508 #ifndef NO_TWICE
01509 )
01510 #else
01511 ,typMk &Spoldejavu)
01512 #endif
01513
01514
01515
01516
01517 {
01518 typedef typename typMk::value_type mon;
01519 typedef typename typP::value_type::order_t ord;
01520 typedef typename typPk::value_type pol;
01521 typedef typename pol::coeff_t coeff;
01522 typedef typename typP::value_type polyalp;
01523 typPk tmpPk,workvect;
01524 typMk tmpMk;
01525 list<mon *> exceed;
01526 list<int> sizeexceed;
01527 int nbproj=0,flagdoplus=1;
01528
01529 cout<<endl;
01530 cerr<<"k on entering newpkmkmatrixof "<<k<<endl;
01531
01532 typP ttmpP=Crochet(P,k+1);
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542 if (!ttmpP.empty())
01543 {
01544 int tmpdeg;
01545
01546 proj(ttmpP,dump,b);
01547
01548 selectnozero(ttmpP);
01549 #ifdef NO_TWICE_FALL
01550 for(typename typP::iterator iter=P.begin();iter!=P.end();iter++)
01551 if(Degree(*iter)==k+1) P.erase(iter--);
01552 for(typename typP::iterator iter=ttmpP.begin()
01553 ;iter!=ttmpP.end();iter++)
01554 P.push_back(*iter);
01555 #endif
01556
01557
01558
01559
01560
01561
01562 nbproj=ttmpP.size();
01563 if (!ttmpP.empty())
01564 {
01565
01566 tmpdeg=minmaxdegP(ttmpP,tmpdeg);
01567
01568 if(tmpdeg<k+1)
01569 {
01570 flagdoplus=0;
01571
01572
01573 typPk tmpconv;
01574
01575 recover(tmpPk,Mk,dump,tmpdeg);
01576 #ifdef NO_TWICE
01577 Listedejafait(Mk,Spoldejavu);
01578 #endif
01579
01580
01581
01582
01583 forget(b,dump,tmpdeg,recall);
01584 compress(tmpPk,dump,b,tmpdeg);
01585
01586
01587
01588
01589
01590
01591 ttmpP=Crochet(ttmpP,tmpdeg);
01592 #ifdef NO_TWICE_BUG
01593 for(typename typP::iterator iter=P.begin()
01594 ;iter!=P.end();iter++)
01595 if(Degree(*iter)==tmpdeg)
01596 P.erase(iter--);
01597 #endif
01598
01599
01600
01601 nbproj=ttmpP.size();
01602
01603
01604
01605
01606
01607
01608
01609
01610 Mk.erase(Mk.begin(),Mk.end());
01611 for (typename typPk::iterator iterpk=tmpPk.begin();
01612 iterpk!=tmpPk.end();iterpk++)
01613 {
01614
01615
01616 if (IsinB(iterpk->ind,b))
01617 {
01618 for(typename Base::iterator iterb=b.begin()
01619 ;iterb!=b.end();iterb++)
01620 {
01621 iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
01622 (iterb->refuse,(iterb->taille2)*sizeof(mon),
01623 (iterb->taille2+1)*sizeof(mon));
01624 iterb->refuse[iterb->taille2]=iterpk->ind;
01625 iterb->refuse[iterb->taille2].SetCoeff(1);
01626 iterb->taille2++;
01627 }
01628 }
01629 }
01630 for(typename typPk::iterator iter=tmpPk.begin()
01631 ;iter!=tmpPk.end();iter++)
01632 {
01633 mon *tmp=(mon*)MAC_REV_MALLOC<mon>(sizeof(mon));
01634 *tmp=iter->ind;
01635 tmpMk.push_back(*tmp);
01636 exceed.push_back(tmp);
01637 sizeexceed.push_back(1);
01638
01639 }
01640
01641
01642 k=tmpdeg-1;
01643
01644 }
01645 }
01646 }
01647 if(flagdoplus)
01648 {
01649 #ifdef unimul
01650 reinit_multiple();
01651 #endif
01652 #ifdef uninf
01653 reinit_nf<pol>();
01654 #endif
01655 map<mon,int,ord> monmember;
01656
01657
01658
01659 for(int i=0;i<b.nbvar();i++)
01660 {
01661 for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
01662 {
01663
01664 if(GoodDir((*iter).ind,i,b))
01665 {
01666 mon tmpmon=iter->ind*mon(i,1);
01667
01668
01669 if(!(monmember).count(tmpmon))
01670 {
01671 typename typrecall::iterator iterrec;
01672 (monmember)[tmpmon]=1;
01673 tmpMk.push_back(tmpmon);
01674 #if 0
01675 for(iterrec=verytmp.begin();
01676 (iterrec!=verytmp.end())
01677 &&(!(iterrec->ind.rep==tmpmon.rep));
01678 iterrec++);
01679 if(iterrec!=verytmp.end())
01680 {
01681
01682
01683 workvect.push_back(*iterrec);
01684 verytmp.erase(iterrec);
01685 continue;
01686 }
01687 #endif
01688
01689 mon * tmp=NULL;
01690 int tmpsize;
01691
01692 tmpPk.push_back(mult(i,*iter,dump,b,&tmp,tmpsize));
01693
01694
01695
01696 exceed.push_back(tmp);
01697 sizeexceed.push_back(tmpsize);
01698 #ifdef DEB
01699 cout<<"coucou"<<endl;
01700 for(int j=0;j<tmpsize;j++)
01701 cout<<" "<<tmp[j];
01702 cout<<endl;
01703 #endif
01704
01705 }
01706 }
01707 }
01708 }
01709
01710
01711 }
01712
01713
01714
01715
01716
01717 #if 1
01718 {
01719 #if 0
01720 for(typename typPk::iterator iter=verytmp.begin();iter!=verytmp.end();iter++)
01721 {
01722 int good=0;
01723 for(int i=0;i<b.nbvar();i++)
01724 {
01725 if((iter->ind.GetDegree(i)>0)&&(IsinB(my_divmon(iter->ind,i,b),b)))
01726 {
01727 good=1;break;
01728 }
01729 }
01730 if(good)
01731 {
01732
01733 if(mon2int(iter->ind)>=iter->size)
01734 {
01735 iter->nf=(coeff*)MAC_REV_REALLOC<coeff>(iter->nf,
01736 iter->size*sizeof(coeff)
01737 ,(mon2int(iter->ind)+1)*sizeof(coeff));
01738 }
01739 iter->nf[mon2int(iter->ind)]=iter->ind.GetCoeff();
01740 iter->ind=mon(0);
01741 workvect.push_back(*iter);
01742 verytmp.erase(iter--);
01743 }
01744 }
01745 #endif
01746
01747 list<mon*> tmpexceed;
01748 list<int> tmpsizeex;
01749 putingoodshape(P,workvect,tmpMk,tmpexceed,tmpsizeex,dump,b);
01750 my_merge(tmpPk,workvect);
01751 my_merge(exceed,tmpexceed);
01752 my_merge(sizeexceed,tmpsizeex);
01753 }
01754 #endif
01755 conv_merge(tmpPk,ttmpP,exceed,sizeexceed,b);
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766
01767
01768
01769
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781
01782
01783 {
01784 int nnz=0;
01785
01786
01787
01788
01789
01790 for(list<int>::iterator iter=sizeexceed.begin();iter!=sizeexceed.end()
01791 ;iter++)
01792 {
01793 nnz+=*iter;
01794
01795
01796 }
01797
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807
01808 #ifdef DEBUG
01809 typename typPk::iterator tmpiter=tmpPk.begin();
01810 list<int>::iterator itersize=sizeexceed.begin();
01811 for(typename list<mon*>::iterator iter=exceed.begin();iter!=exceed.end()
01812 ;tmpiter++,iter++,itersize++)
01813 {
01814 cout<<"pour un exceeed la taille attendue est "
01815 <<*itersize<<endl;
01816 for(int i=0;*itersize>i;i++)
01817 {
01818 cout<<"le gus que je regarde "<<(*iter)[i]<<endl;
01819 if(!member(tmpMk,(*iter)[i]))
01820 {
01821 cout<<(*iter)[i]<<endl;
01822 cout<<"dans ce pol "<<invconv<Poly>(*tmpiter)<<endl;
01823 cout<<"l'ind "<<tmpiter->ind<<endl;
01824 exit(-10);
01825 }
01826 }
01827 }
01828 #endif
01829
01830 cout<<"nnz of matrix "<<nnz<<endl;
01831
01832 void * toto=MAC_REV_MALLOC<coeff>(nnz*sizeof(typename typMat::coeff_t));
01833
01834 if (mat.nzval!=NULL) MAC_REV_FREE<typename typMat::coeff_t>
01835 (mat.nzval,mat.nnz
01836 *sizeof(typename typMat::coeff_t));
01837 mat.nrow=tmpPk.size();
01838 mat.ncol=tmpMk.size();
01839 mat.nnz=nnz;
01840 mat.nzval=toto;
01841 #ifdef DEBUG
01842 for(int i=0;i<nnz;i++)
01843 ((typename typMat::coeff_t*)mat.nzval)[i]=(coeff)1000000000000.0;
01844 #endif
01845
01846 if(mat.rowind!=NULL) free(mat.rowind);
01847 mat.rowind=(int*)malloc(nnz*sizeof(int));
01848
01849 if(mat.colptr!=NULL) free(mat.colptr);
01850 mat.colptr=(int*)malloc((mat.ncol+1)*sizeof(int));
01851 }
01852 cout<<"matrix of size "<<mat.nrow<<"x"<<mat.ncol<<endl;
01853
01854 {
01855 int *ncol=(int*)calloc(mat.ncol,sizeof(int));
01856
01857 map<mon,int,ord> mapint;
01858 typename typMk::iterator itermk=tmpMk.begin();
01859 typename typPk::iterator iterpk=tmpPk.begin();
01860 typename list<mon*>::iterator iterex=exceed.begin();
01861 list<int>::iterator itersize=sizeexceed.begin();
01862 int line_num=0;
01863 #ifdef nomap
01864 int **indmonmk=malloc(b.nbvar()*sizeof(int));
01865 for(int i=0;i<b.nbvars();i++)
01866 {
01867 indmon[i]=malloc(size*sizeof(int));
01868 }
01869 for(int i=0;itermk!=tmpMk.end();i++,itermk++)
01870 {
01871 for(int j=0;j<b.nbvars;j++)
01872 {
01873 mon tmp=my_divmon(*itermk,mon(j,1));
01874 indmon[mon2int(tmp)]=i;
01875 }
01876 }
01877 #endif
01878 for(int i=0;itermk!=tmpMk.end();i++,itermk++)
01879 {
01880 mapint[*itermk]=i;
01881 }
01882 iterpk=tmpPk.begin();
01883 for(;iterpk!=tmpPk.end();iterpk++,iterex++,itersize++,line_num++)
01884 {
01885
01886
01887
01888
01889
01890
01891
01892
01893 {
01894
01895 #ifdef nomap
01896 for(int i=0;*itersize>i;i+=2)
01897 ++ncol[indmon[(*iterex)[i]][(*iterex)[i+1]]];
01898 #else
01899 for(int i=0;*itersize>i;i++)
01900 {
01901
01902
01903 {
01904 ++ncol[mapint[(*iterex)[i]]];
01905
01906 }
01907 #endif
01908 }
01909 }
01910 }
01911
01912
01913
01914
01915
01916
01917
01918 typename typMat::coeff_t* nzval=(typename typMat::coeff_t*)mat.nzval;
01919 int *rowind=mat.rowind;
01920 int *colptr=mat.colptr;
01921
01922 *colptr=0;
01923 for(int i=0;i<mat.ncol-1;i++)
01924 {
01925 colptr[i+1]=colptr[i]+ncol[i];
01926
01927
01928 }
01929 colptr[mat.ncol]=mat.nnz;
01930
01931
01932
01933
01934
01935
01936 itermk=tmpMk.begin();
01937 iterpk=tmpPk.begin();
01938 iterex=exceed.begin();
01939 itersize=sizeexceed.begin();
01940 line_num=0;
01941
01942 #if 0
01943 for(;0&&(line_num < (int)(tmpPk.size()-nbproj));
01944 iterpk++,iterex++,itersize++,line_num++)
01945
01946
01947 {
01948 mon tmpmon=iterpk->ind;
01949 tmpmon.SetCoeff(1);
01950
01951 const unsigned int tmpplus
01952 =mapint[tmpmon]+1,tmp=tmpplus-1;
01953
01954
01955 nzval[colptr[tmpplus]-ncol[tmp]]=1;
01956
01957
01958
01959
01960
01961 rowind[colptr[tmpplus]-ncol[tmp]]=line_num;
01962
01963 ncol[tmp]--;
01964 {
01965
01966 for(int i=0;*itersize>i;i++)
01967 {
01968 const coeff stock=(*iterex)[i].GetCoeff();
01969 (*iterex)[i].SetCoeff(1);
01970 const unsigned int tmpplusex=mapint[(*iterex)[i]]+1;
01971 const unsigned int tmpex=mapint[(*iterex)[i]];
01972 nzval[colptr[tmpplusex]-ncol[tmpex]]
01973 =stock;
01974 rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
01975 ncol[tmpex]--;
01976
01977 }
01978 }
01979 MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
01980 }
01981 #endif
01982 for(;(iterpk!=tmpPk.end());iterpk++,iterex++,itersize++,line_num++)
01983 {
01984
01985 {
01986
01987 for(int i=0;*itersize>i;i++)
01988 {
01989 const coeff stock=(*iterex)[i].GetCoeff();
01990 (*iterex)[i].SetCoeff(1);
01991 const unsigned int tmpplusex=mapint[(*iterex)[i]]+1;
01992 const unsigned int tmpex=tmpplusex-1;
01993 nzval[colptr[tmpplusex]-ncol[tmpex]]
01994 =stock;
01995 rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
01996 ncol[tmpex]--;
01997 }
01998 }
01999 MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
02000
02001 }
02002 free(ncol);
02003 }
02005 for(typename typPk::iterator iterpk=tmpPk.begin()
02006 ;iterpk!=tmpPk.end();iterpk++)
02007 iterpk->ind.SetCoeff(1);
02008
02009
02010
02011 #ifdef DEB
02012 affdebug(mat);
02013 #endif
02014
02015
02016
02017
02018
02019
02020
02021 Pk.swap(tmpPk);
02022 Mk.swap(tmpMk);
02023
02024
02025
02026 return flagdoplus;
02027 }
02028
02029
02030 template<typename typdump,typename mon,typename pol>
02031 void findcorresppol(const mon & m,const typdump &dump,pol &res)
02032 {
02033 typedef typename pol::monom_t mondump;
02034 int i,d=m.GetDegree();
02035 typename typdump::const_iterator iter=dump.begin();
02036 for(;(iter!=dump.end())&&(iter->k!=d);iter++);
02037
02038 if(iter!=dump.end())
02039 {
02040 for(i=0;(i<iter->size)&&(iter->nf[i].ind.rep!=m.rep);i++);
02041
02042
02043 if (i<iter->size)
02044
02045 {
02046
02047
02048
02049
02050
02051
02052 res=iter->nf[i];}
02053 else {
02054
02055 res.ind=mondump(0);
02056 res.size=-1;
02057 res.nf=NULL;
02058 }
02059 }
02060 return;
02061 }
02062
02063 template<typename iterator, typename mon,typename Base>
02064 void varmult(iterator iter1,iterator iter2,mon &var1, mon &var2,const Base &b)
02065 {
02066 for(int i=0;i<b.nbvar();i++)
02067 {
02068 if(iter1->ind.GetDegree(i)>iter2->ind.GetDegree(i))
02069 var2=mon(i,1);
02070 if(iter2->ind.GetDegree(i)>iter1->ind.GetDegree(i))
02071 var1=mon(i,1);
02072 }
02073 }
02074
02075 template <typename mon,typename pol, typename typdump,typename Base>
02076 pol halfred(const mon &targetind, const pol & p, const typdump & dump
02077 , const Base & b)
02078 {
02079 typedef typename pol::coeff_t coeff;
02080 static const mon monzero=mon(0);
02081 static const typename pol::coeff_t zero(0);
02082 pol res;
02083 int *place=(int*)MAC_REV_MALLOC<int>(p.size*sizeof(int));
02084 #ifdef uninf
02085 int varref;
02086 int flagplus=0;
02087 pol stockpol;
02088 coeff stockcoeff;
02089 #else
02090 mon varref;
02091
02092 #endif
02093 int maxref=0,i;
02094 for(i=0;i<b.nbvar();i++)
02095 {
02096 if(targetind.GetDegree(i)>p.ind.GetDegree(i))
02097 break;
02098 }
02099 #ifdef uninf
02100 varref=i;
02101 #else
02102 varref=mon(i,1);
02103 #endif
02104 #ifdef DEB
02105 cout<<"p en entree"<<invconv<Poly>(p)<<endl;
02106 cout<<"target "<<targetind<<" et ind "<<p.ind<<" et var "<<varref<<endl;
02107 #endif
02108 #ifdef nosize
02109 maxref=size;
02110 #else
02111 for(int i=0;i<p.size;i++)
02112 {
02113 if(p.nf[i]!=zero)
02114 {
02115 #ifdef uninf
02116 place[i]=mulind(i,varref,b);
02117 if (place[i]>maxref)
02118 maxref=place[i];
02119 #else
02120 int indtmpmon;
02121 mon tmpmon;
02122 int2mon(i,tmpmon);
02123 tmpmon*=varref;
02124 if(IsinB(tmpmon,b))
02125 {
02126 indtmpmon=mon2int(tmpmon);
02127 if(maxref<indtmpmon)
02128 maxref=indtmpmon;
02129 place[i]=indtmpmon;
02130 }
02131 else
02132 {
02133 place[i]=-1;
02134 }
02135 #endif //nored
02136 }
02137 }
02138 #endif //nosize
02139 res.nf=(typename pol::coeff_t*)
02140 MAC_REV_MALLOC<typename pol::coeff_t>
02141 ((maxref+1)*sizeof(typename pol::coeff_t));
02142 for(int i=0;i<=maxref;i++)
02143 res.nf[i]=0;
02144 res.size=maxref+1;
02145 i=0;
02146 for(;i<p.size;i++)
02147 {
02148 if(p.nf[i]!=zero)
02149 {
02150 #ifdef uninf
02151 if(place[i]==-1)
02152 {
02153 pol stock=nf<pol,typdump,Base>(varref,i,dump,b);
02154 #ifdef plus2
02155 if (!flagplus)
02156 {
02157 flagplus=1;
02158 stockpol=stock;
02159 stockcoeff=p.nf[i];
02160 }
02161 else
02162 {
02163 myplus22(res,stockpol,stockcoeff,stock,p.nf[i]);
02164 flagplus=0;
02165 stockcoeff=0;
02166 }
02167 #else
02168
02169 my_plus(res,stock,p.nf[i]);
02170 #endif
02171 }
02172 else
02173 {
02174 res.nf[place[i]]+=p.nf[i];
02175 }
02176 #else
02177 mon tmpmon;
02178 int2mon(i,tmpmon);
02179 tmpmon*=varref;
02180
02181 if(place[i]==-1)
02182 {
02183 pol stock;
02184
02185 findcorresppol(tmpmon,dump,stock);
02186
02187
02188
02189 my_plus(res,stock,p.nf[i]);
02190
02191
02192
02193 }
02194 else
02195 {
02196 res.nf[mon2int(tmpmon)]+=p.nf[i];
02197 }
02198 #endif
02199 }
02200 }
02201 #ifdef uninf
02202 #ifdef plus2
02203 if(flagplus)
02204 my_plus(res,stockpol,stockcoeff);
02205 #endif
02206 #endif
02207
02208 res.ind=monzero;
02209 MAC_REV_FREE<int>(place,p.size*sizeof(int));
02210 #ifdef DEB
02211 cout<<" apres reduction "<<invconv<Poly>(res)<<endl;
02212 #endif
02213 return res;
02214 }
02215
02216 template <typename typPk, typename typdump,typename Base>
02217 void ReduceSpol(typPk &S,const typdump & dump,typPk &redspol,const Base &b)
02218 {
02219 typedef typename typPk::value_type pol;
02220 typedef typename pol::monom_t mon;
02221 typedef typename pol::coeff_t coeff;
02222 list<mon> leadmon;
02223 list<typPk> membermon;
02224
02225 cout<<"en entree de RedSpol S.size "<<S.size()/2<<endl;
02226 for(typename typPk::iterator iterS=S.begin();iterS!=S.end();iterS++,iterS++)
02227 {
02228 typename typPk::iterator iterS2=iterS;
02229 typename list<mon>::iterator itermon=leadmon.begin();
02230 typename list<typPk>::iterator itermemb=membermon.begin();
02231 mon var1,var2,tmpleadmon;
02232 iterS2++;
02233 varmult(iterS,iterS2,var1,var2,b);
02234 tmpleadmon=iterS->ind*var1;
02235 for(;itermon!=leadmon.end()&&itermon->rep!=tmpleadmon.rep;
02236 itermon++,itermemb++);
02237 if(itermon!=leadmon.end())
02238 {
02239 int yes1=1,yes2=1;
02240 for(typename typPk::iterator tmpiter=itermemb->begin();
02241 tmpiter!=itermemb->end();tmpiter++)
02242 {
02243 if(tmpiter->ind.rep==iterS->ind.rep) yes1=0;
02244 if(tmpiter->ind.rep==iterS2->ind.rep) yes2=0;
02245 }
02246 if(yes1) itermemb->push_back(*iterS);
02247 if(yes2) itermemb->push_back(*iterS2);
02248 }
02249 else
02250 {
02251 typPk verytmp;
02252 leadmon.push_back(tmpleadmon);
02253 membermon.push_back(verytmp);
02254 membermon.back().push_back(*iterS);
02255 membermon.back().push_back(*iterS2);
02256 }
02257 }
02258
02259
02260 {
02261 typename list<mon>::iterator itermon=leadmon.begin();
02262 typename list<typPk>::iterator itermemb=membermon.begin();
02263 for(;itermon!=leadmon.end();itermon++,itermemb++)
02264 {
02265 typename typPk::value_type ref;
02266 typename typPk::iterator tmpiter=itermemb->begin();
02267 ref=halfred(*itermon,*tmpiter,dump,b);
02268
02269
02270 tmpiter++;
02271 for(;tmpiter!=itermemb->end();tmpiter++)
02272 {
02273 typename typPk::value_type redcur;
02274 redcur=halfred(*itermon,*tmpiter,dump,b);
02275 my_plus(redcur,ref);
02276 if(!Ispolzero(redcur))
02277 {
02278
02279
02280
02281
02282 redspol.push_back(redcur);
02283 }
02284 else
02285 {
02286 MAC_REV_FREE<coeff>(redcur.nf,redcur.size*sizeof(coeff));
02287 }
02288 }
02289 MAC_REV_FREE<coeff>(ref.nf,ref.size*sizeof(coeff));
02290 }
02291 }
02292 }
02293
02294 template <typename typPk, typename typdump,typename Base>
02295 void OLD_ReduceSpol(typPk &S,const typdump & dump,typPk &redspol,const Base &b)
02296 {
02297 typedef typename typPk::value_type pol;
02298 typedef typename pol::monom_t mon;
02299 typedef typename pol::coeff_t coeff;
02300 const coeff zero(0);
02301
02302 for(typename typPk::iterator iterS=S.begin();iterS!=S.end();iterS++,iterS++)
02303 {
02304 typename typPk::iterator iterS2=iterS;
02305 mon var1,var2;
02306 typename typPk::value_type res;
02307 int max=0;
02308 mon tmpmon;
02309 iterS2++;
02310
02311
02312
02313
02314 varmult(iterS,iterS2,var1,var2,b);
02315
02316 res.ind=mon(zero);
02317 for(int i=0;i<iterS->size;i++)
02318 {
02319
02320 if(iterS->nf[i]!=zero)
02321 {
02322 int2mon(i,tmpmon);
02323
02324 if(IsinB(var1*tmpmon,b))
02325 if(max<mon2int(var1*tmpmon)) max=mon2int(var1*tmpmon);
02326 }
02327 }
02328 for(int i=0;i<iterS2->size;i++)
02329 {
02330
02331 if(iterS2->nf[i]!=zero)
02332 {
02333 int2mon(i,tmpmon);
02334
02335 if(IsinB(var2*tmpmon,b))
02336 if(max<mon2int(var2*tmpmon)) max=mon2int(var2*tmpmon);
02337 }
02338 }
02339 res.nf=(typename typPk::value_type::coeff_t*)
02340 MAC_REV_MALLOC<typename typPk::value_type::coeff_t>
02341 ((max+1)*sizeof(typename typPk::value_type::coeff_t));
02342 for(int i=0;i<=max;i++)
02343 res.nf[i]=0;
02344 res.size=max+1;
02345 for(int i=0;i<iterS->size;i++)
02346 {
02347
02348 if(iterS->nf[i]!=zero)
02349 {
02350 mon tmpmon;
02351 int2mon(i,tmpmon);
02352 if(!IsinB(var1*tmpmon,b))
02353 {
02354 pol stock;
02355
02356
02357 findcorresppol(var1*tmpmon,dump,stock);
02358
02359
02360 res*stock.ind.GetCoeff();
02361 my_plus(res,stock,iterS->nf[i]);
02362 }
02363 else
02364 {
02365
02366 res.nf[mon2int(var1*tmpmon)]+=iterS->nf[i];
02367 }
02368
02369 }
02370 }
02371
02372 for(int i=0;i<iterS2->size;i++)
02373 {
02374
02375 if(iterS2->nf[i]!=zero)
02376 {
02377 mon tmpmon;
02378
02379
02380 int2mon(i,tmpmon);
02381
02382
02383 if(!IsinB(var2*tmpmon,b))
02384 {
02385 pol stock;
02386 findcorresppol(var2*tmpmon,dump,stock);
02387
02388 res*stock.ind.GetCoeff();
02389 my_plus(res,stock,(coeff)((coeff)(-1)*iterS2->nf[i]));
02390 }
02391 else
02392 {
02393
02394
02395
02396
02397 res.nf[mon2int(var2*tmpmon)]-=iterS2->nf[i];
02398 }
02399 }
02400
02401 }
02402 if(!Ispolzero(res))
02403 {
02404
02405
02406
02407
02408 redspol.push_back(res);
02409
02410
02411 }
02412 else
02413 {
02414 MAC_REV_FREE<coeff>(res.nf,res.size*sizeof(coeff));
02415
02416 }
02417 }
02418
02419 }
02420
02421 template<typename typPk>
02422 int mindeg(const typPk &l)
02423 {
02424 typedef typename typPk::value_type::monom_t mon;
02425 typedef typename mon::coeff_t coeff;
02426 int res=-1;
02427
02428 for(typename typPk::const_iterator iter=l.begin() ;iter!=l.end();iter++)
02429 {
02430 int mmax=-1;
02431
02432 for(int i=0;i<iter->size;i++)
02433 if(!Iszero(iter->nf[i]))
02434 {
02435 mon tmpmon;
02436 int2mon(i,tmpmon);
02437 mmax=(mmax<tmpmon.GetDegree())?tmpmon.GetDegree():mmax;
02438 }
02439
02440 if (iter->ind.GetCoeff()==(coeff)1)
02441 mmax=(mmax<iter->ind.GetDegree())?iter->ind.GetDegree():mmax;
02442
02443 if(mmax!=-1)
02444 {
02445 if(res==-1) res=mmax;
02446 res=(mmax>res)?res:mmax;
02447 }
02448 }
02449
02450 return res;
02451 }
02452
02453 template<typename typP,typename typPk,typename typMk,typename Base
02454 ,typename typdump>
02455 void Crochetchoix(const typP & P,typPk & Pk, typMk & Mk, typPk & redspol,int k
02456 ,typdump & dump, Base &b)
02457 {
02458 typedef typename typP::value_type polyalp;
02459 typedef typename polyalp::monom_t mon;
02460 typedef typename polyalp::coeff_t coeff;
02461 typPk res=Crochet(redspol,k),tmpres;
02462
02463
02464
02465 for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
02466 {
02467 for(typename typPk::iterator iterredspol=redspol.begin();
02468 iterredspol!=redspol.end();iterredspol++)
02469 if(iter->nf==iterredspol->nf)
02470 {
02471 redspol.erase(iterredspol);
02472 break;
02473 }
02474 }
02475 for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
02476 {
02477
02478 if (!Ispolzero(*iter))
02479 {
02480 iter->ind=choice(invconv<polyalp>(*iter),b);
02481
02482
02483
02484
02485
02486
02487
02488
02489
02490 remiseenforme(*iter);
02491
02492
02493
02494
02495
02496
02497 *iter/=iter->ind.GetCoeff();
02498 iter->ind*=(coeff)1/iter->ind.GetCoeff();
02499 iter->nf[mon2int(iter->ind)]=0;
02500
02501
02502
02503
02504 remiseenforme(*iter);
02505
02506
02507
02508
02509
02510
02511
02512 tmpres.push_back(*iter);
02513
02514
02515
02516
02517 for(typename typPk::iterator iterPk=Pk.begin();iterPk!=Pk.end();iterPk++)
02518 if((mon2int(iter->ind)<iterPk->size)&&
02519 (iterPk->nf[mon2int(iter->ind)]!=(coeff)0))
02520 {
02521
02522
02523 my_plus(*iterPk,*iter,iterPk->nf[mon2int(iter->ind)]);
02524 iterPk->nf[mon2int(iter->ind)]=0;
02525
02526
02527 }
02528
02529 for(typename typPk::iterator iterredspol=iter;iterredspol!=res.end()
02530 ;iterredspol++)
02531 {
02532
02533
02534 if(mon2int(iter->ind)<iterredspol->size &&
02535 iterredspol->nf[mon2int(iter->ind)]!=(coeff)0)
02536 {
02537 my_plus(*iterredspol,*iter,iterredspol->nf[mon2int(iter->ind)]);
02538 iterredspol->nf[mon2int(iter->ind)]=0;
02539 }
02540
02541 }
02542
02543
02544 for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
02545 {
02546 iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
02547 (iterb->refuse,(iterb->taille2)*sizeof(mon),
02548 (iterb->taille2+1)*sizeof(mon));
02549 iterb->refuse[iterb->taille2]=iter->ind;
02550 iterb->refuse[iterb->taille2].SetCoeff(1);
02551 iterb->taille2++;
02552 }
02553 res.erase(iter--);
02554 break;
02555 }
02556 }
02557 for (typename typPk::iterator iterpk=Pk.begin();iterpk!=Pk.end();iterpk++)
02558 {
02559
02560 if (IsinB(iterpk->ind,b))
02561 {
02562 for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
02563 {
02564 iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
02565 (iterb->refuse,(iterb->taille2)*sizeof(mon),
02566 (iterb->taille2+1)*sizeof(mon));
02567 iterb->refuse[iterb->taille2]=iterpk->ind;
02568 iterb->refuse[iterb->taille2].SetCoeff(1);
02569 iterb->taille2++;
02570 }
02571 }
02572 }
02573 my_merge(Pk,tmpres);
02574 my_merge(redspol,res);
02575 return;
02576 }
02577
02578 template<typename typPk>
02579 void Destroyredspol(typPk &redspol,const typPk &Pk)
02580 {
02581 typename typPk::const_iterator iterpk=--Pk.end();
02582 for(typename typPk::iterator iter=redspol.begin();
02583 iter!=redspol.end();iter++)
02584 {
02585 if(iter->nf!=iterpk->nf)
02586 MAC_REV_FREE<typename typPk::value_type::coeff_t>(iter->nf
02587 ,iter->size
02588 *sizeof(typename typPk::value_type::coeff_t));
02589 }
02590 }
02591 #ifndef NO_TWICE
02592 template<typename typP,typename typPk,typename typMk
02593 ,typename Base,typename typdump, typename typrecall>
02594 void NewCrochetchoix(typP & P,typPk & Pk,typMk & Mk, typPk & redspol
02595 ,int &k,typdump &dump, Base &b, typrecall & recall)
02596 #else
02597 template<typename typP,typename typPk,typename typMk
02598 ,typename Base,typename typdump, typename typrecall>
02599 void NewCrochetchoix(typP & P,typPk & Pk,typMk & Mk, typPk & redspol
02600 ,int &k,typdump &dump, Base &b, typrecall & recall
02601 ,typMk &Spoldejavu)
02602 #endif
02603
02604
02605
02606
02607
02608 {
02609
02610 typedef typename typP::value_type polyalp;
02611 typedef typename polyalp::monom_t mon;
02612 typedef typename polyalp::coeff_t coeff;
02613
02614
02615
02616 typPk res=Crochet(redspol,k),tmpres;
02617 for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
02618 {
02619 for(typename typPk::iterator iterredspol=redspol.begin();
02620 iterredspol!=redspol.end();iterredspol++)
02621 if(iter->nf==iterredspol->nf)
02622 {
02623 redspol.erase(iterredspol);
02624 break;
02625 }
02626 }
02627
02628 for(typename typPk::iterator iter=res.begin();iter!=res.end();iter++)
02629 {
02630
02631 if (!Ispolzero(*iter))
02632 {
02633
02634 iter->ind=choice(*iter,b);
02635
02636 if(iter->ind.GetDegree()<k)
02637 {
02638
02639 k=iter->ind.GetDegree();
02640 iter->ind=mon(0);
02641 #ifdef NO_TWICE_FALL
02642 P.push_back(invconv<polyalp>(*iter));
02643 #endif
02644
02645
02646 my_merge(res,tmpres);
02647 my_merge(redspol,res);
02648 tmpres.erase(tmpres.begin(),tmpres.end());
02649 res.erase(res.begin(),res.end());
02650 res=Crochet(redspol,k);
02651
02652 for(typename typPk::iterator iterres=res.begin()
02653 ;iterres!=res.end();iterres++)
02654 {
02655 for(typename typPk::iterator iterredspol=redspol.begin();
02656 iterredspol!=redspol.end();iterredspol++)
02657 if(iterres->nf==iterredspol->nf)
02658 {
02659 redspol.erase(iterredspol);
02660 break;
02661 }
02662 }
02663 iter=res.begin();
02664
02665 iter->ind=choice(*iter,b);
02666 Dump(Pk,dump);
02667
02668 recover(Pk,Mk,dump,k);
02669 #ifdef NO_TWICE
02670 Listedejafait(Mk,Spoldejavu);
02671 #endif
02672 forget(b,dump,k,recall);
02673
02674 compress(Pk,redspol,dump,b,k);
02675
02676
02677 }
02678
02679
02680
02681
02682
02683
02684
02685
02686 #ifdef UGLY_HACK
02687 remiseenforme(*iter);
02688 #endif
02689
02690
02691
02692
02693
02694
02695 *iter/=iter->ind.GetCoeff();
02696 iter->ind*=(coeff)1/iter->ind.GetCoeff();
02697 iter->nf[mon2int(iter->ind)]=0;
02698
02699
02700
02701 #ifdef UGLY_HACK
02702 remiseenforme(*iter);
02703 #endif
02704
02705
02706
02707
02708
02709
02710
02711 tmpres.push_back(*iter);
02712
02713
02714
02715
02716 for(typename typPk::iterator iterPk=Pk.begin();iterPk!=Pk.end();iterPk++)
02717 if((mon2int(iter->ind)<iterPk->size)&&
02718 (iterPk->nf[mon2int(iter->ind)]!=(coeff)0))
02719 {
02720
02721
02722
02723 coeff tmpcoeff=iterPk->nf[mon2int(iter->ind)];
02724
02725 my_plus(*iterPk,*iter,tmpcoeff);
02726 iterPk->nf[mon2int(iter->ind)]=0;
02727
02728
02729
02730 }
02731
02732 typename typPk::iterator iterredspol=iter;
02733 iterredspol++;
02734 for(;iterredspol!=res.end();iterredspol++)
02735 {
02736
02737
02738 if(mon2int(iter->ind)<iterredspol->size &&
02739 iterredspol->nf[mon2int(iter->ind)]!=(coeff)0)
02740 {
02741 coeff tmpcoeff=iterredspol->nf[mon2int(iter->ind)];
02742 my_plus(*iterredspol,*iter,tmpcoeff);
02743 iterredspol->nf[mon2int(iter->ind)]=0;
02744
02745
02746 }
02747 }
02748
02749 for(iterredspol=tmpres.begin();iterredspol!=tmpres.end();iterredspol++)
02750 {
02751
02752
02753 if(mon2int(iter->ind)<iterredspol->size &&
02754 iterredspol->nf[mon2int(iter->ind)]!=(coeff)0)
02755 {
02756 coeff tmpcoeff=iterredspol->nf[mon2int(iter->ind)];
02757 my_plus(*iterredspol,*iter,tmpcoeff);
02758 iterredspol->nf[mon2int(iter->ind)]=0;
02759
02760
02761 }
02762 }
02763
02764
02765 for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
02766 {
02767 int tmptaille1=0;
02768 mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iterb->taille1*sizeof(mon));
02769 for(int i=0;i<iterb->taille1;i++)
02770 if(!isdivisible(iter->ind,iterb->accept[i],b))
02771 tmp[tmptaille1++]=iterb->accept[i];
02772 tmp=(mon*)MAC_REV_REALLOC<mon>(tmp,iterb->taille1*sizeof(mon)
02773 ,tmptaille1*sizeof(mon));
02774 MAC_REV_FREE<mon>(iterb->accept,iterb->taille1*sizeof(mon));
02775 iterb->accept=tmp;
02776 iterb->taille1=tmptaille1;
02777 if(iterb->taille1==0)
02778 {
02779 MAC_REV_FREE<mon>(iterb->refuse,iterb->taille2*sizeof(mon));
02780 b.erase(iterb--);
02781 continue;
02782 }
02783 iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
02784 (iterb->refuse,(iterb->taille2)*sizeof(mon),
02785 (iterb->taille2+1)*sizeof(mon));
02786 iterb->refuse[iterb->taille2]=iter->ind;
02787
02788 iterb->refuse[iterb->taille2].SetCoeff(1);
02789 iterb->taille2++;
02790 }
02791 res.erase(iter--);
02792 }
02793
02794 }
02795
02796 for (typename typPk::iterator iterpk=Pk.begin();iterpk!=Pk.end();iterpk++)
02797 {
02798
02799
02800 if (IsinB(iterpk->ind,b))
02801 {
02802 for(typename Base::iterator iterb=b.begin();iterb!=b.end();iterb++)
02803 {
02804 iterb->refuse=(mon*)MAC_REV_REALLOC<mon>
02805 (iterb->refuse,(iterb->taille2)*sizeof(mon),
02806 (iterb->taille2+1)*sizeof(mon));
02807 iterb->refuse[iterb->taille2]=iterpk->ind;
02808 iterb->refuse[iterb->taille2].SetCoeff(1);
02809 iterb->taille2++;
02810 }
02811 }
02812 }
02813 #ifdef NO_TWICE_FALL_CHOICE
02814 for(typename typPk::iterator iter=tmpres.begin();iter!=tmpres.end();iter++)
02815 P.push_back(invconv<polyalp>(*iter));
02816 #endif
02817 my_merge(Pk,tmpres);
02818 my_merge(redspol,res);
02819
02820 return;
02821 }
02822
02823 template<typename typPk>
02824 void NewDestroyredspol(typPk &redspol,const typPk &Pk)
02825 {
02826
02827 for(typename typPk::iterator iter=redspol.begin();
02828 iter!=redspol.end();iter++)
02829 {
02830
02831 MAC_REV_FREE<typename typPk::value_type::coeff_t>(iter->nf,iter->size*sizeof(typename typPk::value_type::coeff_t));
02832 }
02833 }
02834
02835 template<typename typMk>
02836 void Listedejafait(const typMk &Mk,typMk &Spoldejavu)
02837 {
02838 Spoldejavu.erase(Spoldejavu.begin(),Spoldejavu.end());
02839 for(typename typMk::const_iterator iter1=Mk.begin();iter1!=Mk.end();
02840 iter1++)
02841 for(typename typMk::const_iterator iter2=iter1;iter2!=Mk.end();
02842 iter2++)
02843 {
02844 typename typMk::value_type tmp=lcm(*iter1,*iter2);
02845 if (tmp.GetDegree()==iter1->GetDegree()+1)
02846 Spoldejavu.push_back(tmp);
02847 }
02848 }
02849
02850 template<typename typP,typename typPk,typename typdump,typename Base
02851 , template<typename T> class tmptypmat >
02852 void algo(typP P,typdump &dump,Base &b)
02853 {
02854
02855 typedef list<typename typPk::value_type::monom_t> typMk;
02856 typedef typename typMk::value_type mon;
02857 typMk Mk;
02858 typMk Spoldejavu;
02859 typPk Pk,S;
02860
02861 typPk recall;
02862
02863 int go_on=1;
02864 typedef tmptypmat<typename typP::value_type::coeff_t> typMat;
02865 typMat Mat;
02866 int nouveaumon,allpolused=0,maxdeg,k,*pr,*pc;
02867
02868 init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump);
02869
02870 #ifdef dimpos
02871 go_on=stop_degree(b);
02872 cout<<"je m'arrete a ce degre "<<go_on<<endl;
02873 while((nouveaumon||(k<=maxdeg))&& ((go_on>=k)||(k<=maxdeg)))
02874 #else
02875 while((nouveaumon||(k<=maxdeg)))
02876 #endif
02877 {
02878
02879
02880 int killspol;
02881
02882
02883
02884
02885
02886
02887
02888
02889
02890
02891
02892
02893
02894 #ifdef DEB
02895 cout<<"poly a la fin de la boulcle de l'algo"<<endl;
02896 for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
02897
02898 cout<<invconv<typename typP::value_type>(*iter)<<endl;
02899 #endif
02900
02901
02902 #ifdef NO_TWICE
02903 S=Spolordsup(Pk,b,Spoldejavu);
02904 #else
02905 S=Spolordsup(Pk,b);
02906 #endif
02907
02908 #ifdef experiment
02909 cout<<"S.back().ind.GetCoeff().rep "<<S.back().ind.GetCoeff().rep<<" k "<<k<<endl;
02910 if((S.back().ind.GetCoeff().rep<k) && (k>=maxdeg))
02911 {go_on=0;continue;}
02912 S.pop_back();
02913 #endif
02914
02915
02916 #ifdef NO_TWICE
02917 killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall,Spoldejavu);
02918 #else
02919 killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump,recall);
02920 #endif
02921
02922 if(killspol) S.erase(S.begin(),S.end());
02923 if (k+1>=maxdeg) allpolused=1;
02924 if(Mk.size()==0) nouveaumon=0;
02925
02926
02927
02928
02929
02930
02931
02932
02933
02934
02935
02936
02937 if (Mat.ncol!=0)
02938 {
02939 Solve(Mat,Pk,&pr,&pc);
02940
02941
02942 inverse(pc,Mk.size());
02943 Dopermu(Mk,pc);
02944 {
02945
02946
02947 int j=0;
02948 typename typMk::iterator itermon=Mk.begin();
02949 typename typPk::iterator iter;
02950 for(iter=Pk.begin();
02951 itermon!=Mk.end();iter++,itermon++,j++)
02952 {
02953 if(!Iszero(Mat(j,j)))
02954 {
02955
02956 iter->ind=*itermon*(iter->ind.GetCoeff());
02957 }
02958 else
02959 {
02960 iter->ind=mon(0);
02961 }
02962 }
02963
02964
02965 }
02966 free(pr);
02967 free(pc);
02968 }
02969
02970
02971
02972
02973
02974
02975
02976
02977
02978
02979
02980
02981
02982 if ((unsigned)my_rank(Mat)==Mk.size())
02983
02984 {
02985 typPk redspol,secd=secondmembre(Mat,Pk);;
02986
02987
02988 cout<<"matrice de rang plein "<<endl;
02989
02990
02991
02992 Dump(Pk,dump);
02993
02994 ReduceSpol(S,dump,redspol,b);
02995
02996 my_merge(redspol,secd);
02997 if(redspol.size()==0)
02998 {
02999
03000 k++;
03001 continue;
03002
03003
03004 }
03005 else
03006 {
03007
03008
03009 nouveaumon=1;
03010 cout<<"redspol.size() "<<redspol.size()<<endl;
03011
03012 k=mindeg(redspol);
03013
03014
03015 recover(Pk,Mk,dump,k);
03016 #ifdef NO_TWICE
03017 Listedejafait(Mk,Spoldejavu);
03018 #endif
03019
03020 forget(b,dump,k,recall);
03021
03022
03023 #ifdef NO_TWICE
03024 NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
03025 #else
03026 NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall);
03027 #endif
03028
03029
03030 NewDestroyredspol(redspol,Pk);
03031 compress(Pk,dump,b,k);
03032 Dump(Pk,dump);
03033
03034 #ifdef dimpos
03035 go_on=stop_degree(b);
03036 cout<<"go on ici vaut "<<go_on<<endl;
03037 #endif
03038
03039 continue;
03040 }
03041 }
03042 else
03043
03044 {
03045 cout<<"matrice de rang pas plein "<<endl;
03046 typPk secd;
03047 AddB(Mat,Pk,Mk,dump,b);
03048
03049
03050
03051 secd=secondmembre(Mat,Pk);
03052 rajoute_voisins(Pk,Mk,dump,b);
03053
03054 if(secd.size()==0)
03055 {
03056 typPk redspol;
03057
03058
03059
03060
03061
03062
03063
03064
03065 Dump(Pk,dump);
03066 ReduceSpol(S,dump,redspol,b);
03067 if(redspol.size()==0)
03068 {
03069
03070
03071
03072
03073
03074 k++;
03075 #ifdef dimpos
03076 go_on=stop_degree(b);
03077 cout<<"go on ici vaut "<<go_on<<endl;
03078 #endif
03079
03080 continue;
03081
03082
03083 }
03084 else
03085 {
03086
03087
03088 k=mindeg(redspol);
03089 recover(Pk,Mk,dump,k);
03090 #ifdef NO_TWICE
03091 Listedejafait(Mk,Spoldejavu);
03092 #endif
03093 forget(b,dump,k,recall);
03094
03095 cout<<"il ya un passage par mat rang pas"
03096 <<"plein et pol non zero"<<endl;
03097 #ifdef NO_TWICE
03098 NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
03099 #else
03100 NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall);
03101 #endif
03102
03103 NewDestroyredspol(redspol,Pk);
03104 compress(Pk,dump,b,k);
03105 Dump(Pk,dump);
03106 #ifdef dimpos
03107 go_on=stop_degree(b);
03108 cout<<"go on ici vaut "<<go_on<<endl;
03109 #endif
03110
03111 continue;
03112 }
03113 }
03114 else
03115 {
03116
03117
03118 typPk redspol;
03119
03120
03121
03122
03123
03124
03125
03126
03127
03128
03129
03130
03131
03132
03133 Dump(Pk,dump);
03134
03135 ReduceSpol(S,dump,redspol,b);
03136 my_merge(secd,redspol);
03137 k=mindeg(secd);
03138 recover(Pk,Mk,dump,k);
03139 #ifdef NO_TWICE
03140 Listedejafait(Mk,Spoldejavu);
03141 #endif
03142
03143
03144
03145
03146
03147
03148
03149
03150 forget(b,dump,k,recall);
03151
03152
03153
03154
03155
03156 #ifdef NO_TWICE
03157 NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,Spoldejavu);
03158 #else
03159 NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall);
03160 #endif
03161
03162 NewDestroyredspol(secd,Pk);
03163
03164
03165
03166 compress(Pk,dump,b,k);
03167 Dump(Pk,dump);
03168 #ifdef dimpos
03169 go_on=stop_degree(b);
03170 cout<<"go on ici vaut "<<go_on<<endl;
03171 #endif
03172
03173 continue;
03174 }
03175 }
03176 }
03177
03178 Mat.destroystore();
03179
03180
03181
03182
03183 #ifdef DEBUG
03184 for(typename Base::const_iterator p=b.begin();p!=b.end();p++)
03185 {
03186 for(int i=0;i<p->taille1;i++)
03187 {
03188 cout<<"p.accept[i] "<<p->accept[i]<<endl;
03189 }
03190 for(int i=0;i<p->taille2;i++)
03191 {
03192 cout<<"p.refuse[i] "<<p->refuse[i]<<endl;
03193 }
03194 }
03195 #endif
03196 cout<<"sortie d'algo flash"<<endl;
03197 return ;
03198
03199
03200
03201
03202 }