Go to the source code of this file.
void algo | ( | typP | P, | |
typdump & | dump, | |||
Base & | b | |||
) | [inline] |
Definition at line 2852 of file corealgo.cc.
References compress(), Dump(), forget(), Iszero(), Listedejafait(), mindeg(), my_merge(), NewCrochetchoix(), NewDestroyredspol(), newPkMkMatrixof(), recover(), ReduceSpol(), Spolordsup(), and stop_degree().
02853 { 02854 // int toto=0; 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 //typP recall 02861 typPk recall; 02862 //Base b; 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 //cout<<"avant init"<<endl; 02868 init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump); 02869 //cout<<"apres init"<<endl; 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 // if (toto>=3) {exit(10);} 02879 //toto++; 02880 int killspol; 02881 // for(typename Base::const_iterator p=b.begin();p!=b.end();p++) 02882 // { 02883 02884 // for(int i=0;i<p->taille1;i++) 02885 // { 02886 // cout<<"p.accept[i] "<<p->accept[i]<<endl; 02887 // } 02888 // for(int i=0;i<p->taille2;i++) 02889 // { 02890 // cout<<"p.refuse[i] "<<p->refuse[i]<<endl; 02891 // } 02892 // } 02893 //#define DEB 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 //cout<<"les sizes "<<iter->size<<endl; 02898 cout<<invconv<typename typP::value_type>(*iter)<<endl; 02899 #endif 02900 //#undef DEB 02901 //cout<<"Spolordsup"<<endl; 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 //cout<<"newpkmkmatrixof"<<endl; 02915 //cout<<"Pk.size() "<<Pk.size()<<endl; 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 // killspol=!newPkMkMatrixof(Mat,Pk,P,Mk,k,b,dump); 02922 if(killspol) S.erase(S.begin(),S.end()); 02923 if (k+1>=maxdeg) allpolused=1; 02924 if(Mk.size()==0) nouveaumon=0; 02925 //cout<<"j'en suis a k="<<k<<endl; 02926 //cout<<"Ici dans algo Mat"<<endl; 02927 //affdebug(Mat); 02928 //Solve affecte a Mat la valeur U 02929 //cout<<"solve"<<endl; 02930 //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 02931 // cout<<"avant solve les ind "<<iter->ind<<endl; 02932 //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 02933 // cout<<"avant solve les pol "<<invconv<Poly>(*iter)<<endl; 02934 //if(k==3) exit(-10); 02935 //for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) 02936 // cout<<"monomes dans Mk "<<*iter<<endl; 02937 if (Mat.ncol!=0) 02938 { 02939 Solve(Mat,Pk,&pr,&pc); 02940 //for(int kk=0;kk<Mk.size();kk++) 02941 // cout<<"permc "<<kk<<" "<<pc[kk]<<endl; 02942 inverse(pc,Mk.size()); 02943 Dopermu(Mk,pc); 02944 { 02945 //ici on remet les ind a la bonne valuer 02946 //a inclure dans une petite fonction inline apres 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 // cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<endl; 02956 iter->ind=*itermon*(iter->ind.GetCoeff()); 02957 } 02958 else 02959 { 02960 iter->ind=mon(0); 02961 } 02962 } 02963 //for(;itermon!=Mk.end();iter++,itermon++) 02964 // iter->ind=mon(0); 02965 } 02966 free(pr); 02967 free(pc); 02968 } 02969 02970 //appliquer les permutation a MK!!!!!!!! 02971 // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 02972 // cout<<"apres solve les ind "<<iter->ind<<endl; 02973 //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 02974 // cout<<"apres solve les pol "<<invconv<Poly>(*iter)<<endl; 02975 // 02976 // 02977 //APPLIQUER LES PERMUTYATIONS A MK!! 02978 // 02979 // 02980 // 02981 // 02982 if ((unsigned)my_rank(Mat)==Mk.size()) 02983 //matrice de rang plein 02984 { 02985 typPk redspol,secd=secondmembre(Mat,Pk);; 02986 //secondmembre2(Mat,Pk,secd); 02987 //typename typPk::iterator iter=Pk.begin(); 02988 cout<<"matrice de rang plein "<<endl; 02989 //for(unsigned int i=0;i<Mk.size();i++,iter++); 02990 //Pk.erase(iter,Pk.end()); 02991 //cout<<"Dump "<<endl; 02992 Dump(Pk,dump); 02993 //cout<<"Reduce Spol "<<endl; 02994 ReduceSpol(S,dump,redspol,b); 02995 //cout<<"secd.size() "<<secd.size()<<endl; 02996 my_merge(redspol,secd); 02997 if(redspol.size()==0) 02998 { 02999 //a voir.... Dump(Pk,dump); 03000 k++; 03001 continue; 03002 //la matrice a rang plein 03003 //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 03004 } 03005 else 03006 { 03007 //on a des spol\secondmembre qui se reduisent pas a 0 03008 //cad un defaut de commuatation 03009 nouveaumon=1; 03010 cout<<"redspol.size() "<<redspol.size()<<endl; 03011 //cout<<invconv<typename typP::value_type>(redspol.front())<<endl; 03012 k=mindeg(redspol); 03013 //cout<<"le mindeg ici vaut "<<k<<endl; 03014 //cout<<"Pk.size() avant recover "<<Pk.size()<<endl; 03015 recover(Pk,Mk,dump,k); 03016 #ifdef NO_TWICE 03017 Listedejafait(Mk,Spoldejavu); 03018 #endif 03019 //cout<<"Pk.size() apres recover "<<Pk.size()<<endl; 03020 forget(b,dump,k,recall); 03021 //forget(b,dump,k); 03022 //cout<<"Pk.size() avant Crochetchoix "<<Pk.size()<<endl; 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 //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); 03029 //cout<<"Pk.size apres Crochetchoix "<<Pk.size()<<" et k "<<k<<endl; 03030 NewDestroyredspol(redspol,Pk); 03031 compress(Pk,dump,b,k); 03032 Dump(Pk,dump); 03033 //misa jour de B dans crochet choix!! 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 //la matrice n'est pas de rang plein 03044 { 03045 cout<<"matrice de rang pas plein "<<endl; 03046 typPk secd; 03047 AddB(Mat,Pk,Mk,dump,b); 03048 // 03049 //secondmembre supprime des trucs dans Pk!! 03050 // 03051 secd=secondmembre(Mat,Pk); 03052 rajoute_voisins(Pk,Mk,dump,b); 03053 //ne selectionne que les non nuls 03054 if(secd.size()==0) 03055 { 03056 typPk redspol; 03057 //for(int i=Pk.size();i>rank(Mat);i--) 03058 //{ 03059 // if(Pk.back().size!=0) 03060 // MAC_REV_FREE<typename typMat::coeff_t>(Pk.rbegin()->nf 03061 // ,Pk.rbegin()->size*sizeof(typename typMat::coeff_t)); 03062 // Pk.pop_back(); 03063 //}//on vire les 0 avant de dumper 03064 // AddB(Mat,Pk,Mk,dump,b); 03065 Dump(Pk,dump); 03066 ReduceSpol(S,dump,redspol,b); 03067 if(redspol.size()==0) 03068 { 03069 // forget(b,dump,k); 03070 //AddB(Mat,Pk,Mk,b); 03071 //Dump(Pk,dump); 03072 //ici on modifie Pk dans AddB 03073 //<=> forget(b,dump,k) AddB(..) Dump(Pk,dump); 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 //la matrice a pas rang plein second membre =0 03082 //ET les Spol de ce niveau se ,reduisent a 0 03083 } 03084 else 03085 { 03086 //on a des spol qui se reduisent pas a 0 03087 //cad un defaut de commutation 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 //forget(b,dump,k); 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 //NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b); 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 //on a des pol qui se reduisent pas a 0 03117 //cad un defaut de commuatation dans les coins 03118 typPk redspol; 03119 //for(int i=Pk.size();i>rank(Mat);i--) 03120 // Pk.pop_back(); 03121 //cout<<"PK. size "<<Pk.size()<<" Mat.nbcol "<<Mat.ncol<<endl; 03122 //cout<<"rank(Mat) "<<rank(Mat)<<endl; 03123 //int j=0; 03124 //cout<<"avant recover et meme avant le dump "<<endl; 03125 //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() 03126 // ;iter++,j++) 03127 // cout<<"pol de secd num "<<j<<endl<<invconv<Poly>(*iter)<<endl; 03128 // AddB(Mat,Pk,Mk,b); 03129 //cout<<"apres ADDB le dump "<<endl; 03130 //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() 03131 // ;iter++) 03132 // cout<<invconv<Poly>(*iter)<<endl; 03133 Dump(Pk,dump); 03134 //cout<<"secd.size()" <<secd.size()<<endl; 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 //cout<<"apres recover"<<endl; 03143 // for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() 03144 // ;iter++) 03145 // cout<<invconv<Poly>(*iter)<<endl; 03146 //cout<<"les Spol non reduits"<<endl; 03147 //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() 03148 // ;iter++) 03149 // cout<<invconv<Poly>(*iter)<<endl; 03150 forget(b,dump,k,recall); 03151 //forget(b,dump,k); 03152 //cout<<"il ya un passage par mat pas rang plein et Spol non zero"<<endl; 03153 //for(typename typPk::iterator iter = secd.begin();iter!=secd.end() 03154 // ;iter++) 03155 // cout<<invconv<Poly>(*iter)<<endl; 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 //NewCrochetchoix(P,Pk,Mk,secd,k,dump,b); 03162 NewDestroyredspol(secd,Pk); 03163 //for(typename typPk::iterator iter = Pk.begin();iter!=Pk.end() 03164 // ;iter++) 03165 // cout<<invconv<Poly>(*iter)<<endl; 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 //while nouveau mon etc... 03180 // Pk=recomposePk(dump); 03181 //return Pk; 03182 // return; 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 ;//dump; 03198 //comme ca on conserve le tri par degre des formes normales et 03199 //donc la construction des operateurs de multiplication se 03200 //fait plus vite.. :-) 03201 03202 }
int compute_ppcm | ( | typppcm & | ppcm, | |
const Base & | b | |||
) | [inline] |
Definition at line 53 of file corealgo.cc.
References isdivisible(), lcm(), and Base< predicat >::rbegin().
Referenced by Spolordsup().
00054 { 00055 typedef typename Base::mon mon; 00056 //typppcm tmpppcm; 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 //cout<<"ppcm rajoute "<<tmpmon<<" "<<iter->refuse[i]<<" "<<iter->refuse[j]<<endl; 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 }
void conv_merge | ( | typPk & | Pk, | |
typP & | P, | |||
typexceed & | ex, | |||
typsize & | sizeex, | |||
const Base & | b | |||
) | [inline] |
Definition at line 1297 of file corealgo.cc.
References Base< predicat >::begin(), Base< predicat >::end(), pol< mon, T >::ind, Iszero(), mon2int(), pol< mon, T >::nf, and pol< mon, T >::size.
Referenced by newPkMkMatrixof().
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 //cout<<"dans for"<<endl; 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 //ici il faudrait un type template 01344 for(int i=0;i<tabsize;i++) 01345 { 01346 tabcoeff[i]=0; 01347 } 01348 //memset((void*)tabcoeff,0,tabsize*sizeof(coeff)); 01349 //ici aussi 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 // cout<<"IsinB("<<*iterpol<<","<<"b)"<<endl; 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 //cout<<"y en a un qu'est pas dans B "<<*iterpol<<endl; 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 }
typP Crochet | ( | const typP & | P, | |
int | k | |||
) | [inline] |
Definition at line 196 of file corealgo.cc.
References Degree().
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 }
Definition at line 6 of file corealgo.cc.
References Degree().
Referenced by Crochetchoix(), init_algo(), NewCrochetchoix(), and newPkMkMatrixof().
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 }
void Crochetchoix | ( | const typP & | P, | |
typPk & | Pk, | |||
typMk & | Mk, | |||
typPk & | redspol, | |||
int | k, | |||
typdump & | dump, | |||
Base & | b | |||
) | [inline] |
Definition at line 2455 of file corealgo.cc.
References Base< predicat >::begin(), Crochet(), Base< predicat >::end(), mon2int(), my_merge(), my_plus(), and remiseenforme().
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 //typename typPk::iterator iter=res.begin(); 02463 // cout<<"entree dans Crochetchoix et k vaut "<<k<<endl; 02464 //cout<<"res.size "<<res.size()<<endl; 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 // cout<<"un nouveau tour de boucle "<<endl; 02478 if (!Ispolzero(*iter)) 02479 { 02480 iter->ind=choice(invconv<polyalp>(*iter),b); 02481 //cout<<"g choisi dans Crochetchoix "<<iter->ind<<endl; 02482 //cout<<"a t'il un mon2int ?"<<IsinB(iter->ind,b)<<endl; 02483 //mon tmp10,tmp11; 02484 // int2mon(10,tmp10);int2mon(11,tmp11); 02485 //cout<<"qu'en est il de int2mon(10) et 11 "<<tmp10<<" "<<tmp11<<endl; 02486 // 02487 // 02488 // 02489 //UGLY HACK 02490 remiseenforme(*iter); 02491 //SALE HACK 02492 // 02493 // 02494 // 02495 // 02496 // 02497 *iter/=iter->ind.GetCoeff();//pour la "nf" 02498 iter->ind*=(coeff)1/iter->ind.GetCoeff();//pour l'ind 02499 iter->nf[mon2int(iter->ind)]=0; 02500 // 02501 // 02502 // 02503 //UGLY HACK 02504 remiseenforme(*iter); 02505 //SALE HACK 02506 // 02507 // 02508 // 02509 // 02510 // 02511 02512 tmpres.push_back(*iter); 02513 //on met a 0 le coeff du mon passe en ind 02514 //maintenant on a une regle en forme comme il faut reste a: 02515 //-reduire les regles deja existantes par rapport acelle ci 02516 //-reduire les autres redspol par rapport a celle ci 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))//test a zero!!! 02520 { 02521 // cout<<"g trouve un gus qui a un coeff du mon choisi " 02522 // <<iterPk->nf[mon2int(iter->ind)]<<endl; 02523 my_plus(*iterPk,*iter,iterPk->nf[mon2int(iter->ind)]); 02524 iterPk->nf[mon2int(iter->ind)]=0; 02525 //cout<<"apres plus le coeff vaut " 02526 // <<iterPk->nf[mon2int(iter->ind)]<<endl; 02527 } 02528 //attention plus(a,b)==a-coeff_de_ind_b_dans_a*b; 02529 for(typename typPk::iterator iterredspol=iter;iterredspol!=res.end() 02530 ;iterredspol++) 02531 { 02532 // cout<<"redspol.size() "<<redspol.size()<<endl; 02533 //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl; 02534 if(mon2int(iter->ind)<iterredspol->size && 02535 iterredspol->nf[mon2int(iter->ind)]!=(coeff)0)//test a 0 ici 02536 { 02537 my_plus(*iterredspol,*iter,iterredspol->nf[mon2int(iter->ind)]); 02538 iterredspol->nf[mon2int(iter->ind)]=0; 02539 } 02540 //cout<<"coucou je suis ici"<<endl; 02541 } 02542 //voila c fait 02543 //maintenant on met a jour la Base b. 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;//comme ca on fait pas 50 tours. 02555 } 02556 } 02557 for (typename typPk::iterator iterpk=Pk.begin();iterpk!=Pk.end();iterpk++) 02558 { 02559 // cout<<"iterpk->ind "<<iterpk->ind<<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl; 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);//les gens dans res\tmpres ne sont pas detruits!!! 02574 my_merge(redspol,res); 02575 return; 02576 }
void Crochetchoix | ( | const typP & | P, | |
typPk & | Pk, | |||
typPk & | redspol, | |||
int | k, | |||
Base & | b | |||
) | [inline] |
void Destroyredspol | ( | typPk & | redspol, | |
const typPk & | Pk | |||
) | [inline] |
Definition at line 2579 of file corealgo.cc.
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 }
void DoBaseMk | ( | const typP & | tmpPk, | |
typMk & | Mk, | |||
Base & | b | |||
) | [inline] |
Definition at line 215 of file corealgo.cc.
References predicat< monom >::accept, Base< predicat >::begin(), Base< predicat >::def, Base< predicat >::end(), Base< predicat >::erase(), predicat< monom >::refuse, predicat< monom >::taille1, and predicat< monom >::taille2.
00216 { 00217 typedef typename typMk::value_type mon; 00218 typename Base::predicat_t tmp; 00219 int i=0; 00220 //int tmpvar=0; 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 // cout<<"pol dans DoBaseMk "<<endl<<*iter<<endl<<"g choisi "<<tmp<<endl; 00227 tmp.SetCoeff(1);//*=mon(1/tmp.GetCoeff()); 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 //cout<<"Mk.size()"<<Mk.size()<<endl; 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;//pour en etre bien sur 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 }
Definition at line 2031 of file corealgo.cc.
References pol< mon, T >::ind, pol< mon, T >::nf, and pol< mon, T >::size.
Referenced by halfred(), OLD_ReduceSpol(), and rewrite().
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 //localise la dump struct de bon degre 02038 if(iter!=dump.end()) 02039 { 02040 for(i=0;(i<iter->size)&&(iter->nf[i].ind.rep!=m.rep);i++); 02041 //cout<<"monomes passe en revue pour chercher "<<m<<" : "<<iter->nf[i].ind<<endl;; 02042 //trouve dans la dump struct le pol qui marche 02043 if (i<iter->size)//estce que je connais? 02044 //oui super 02045 { 02046 //cout<<"g trouve un gus qui convient"<<endl; 02047 //for(int j=0;j<iter->nf[i].size;j++) 02048 // cout<<"et ses coeff sont "<<iter->nf[i].nf[j]<<endl; 02049 //Tue Dec 4 16:12:10 MET 2001 02050 //densify(iter->nf[i],res);} 02051 //Tue Dec 4 16:12:10 MET 2001 02052 res=iter->nf[i];} 02053 else { 02054 //non ben alors il se reecrit en lui meme 02055 res.ind=mondump(0);//m*(1/m.GetCoeff()); 02056 res.size=-1; 02057 res.nf=NULL; 02058 } 02059 } 02060 return; 02061 }
int GoodDir | ( | const typmon & | m, | |
int | i, | |||
const Base & | b | |||
) | [inline] |
Definition at line 1278 of file corealgo.cc.
References my_divmon(), and Base< predicat >::nbvar().
Referenced by newPkMkMatrixof().
01279 { 01280 int res=0; 01281 mon tmpm=m*mon(i,1); 01282 //cout<<"dans GoodDir les monomes "<<m<<"********"<<typmon(i,1)<<endl; 01283 //cout<<"b.nbvar() "<<b.nbvar()<<endl; 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 //cout<<" le verdict de GoodDir "<<res<<endl; 01290 return res; 01291 }
Definition at line 108 of file corealgo.cc.
References member().
Referenced by Spolordsup().
00114 { 00115 //list<mon> ppcm; 00116 int res=0,comp=0;//,nobplus=1; 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 //compute_ppcm(ppcm,b); 00131 //if((res==2)&&(comp==2)) 00132 // for(int i=0;i<b.nbvar();i++) 00133 // if(m.GetDegree(i)>0) 00134 // nobplus=nobplus && !IsinB(my_divmon(m,i,b),b); 00135 //cout<<"m1 "<<m1<<" m2 "<<m2<<" resultat "<<((res==2)&&(comp==2))<<endl; 00136 //return ((res==2)&&(comp==2)&&nobplus); 00137 //cout<<m1<<" < "<<m2<<" res "<<(member(ppcm,m)&&(res==2)&&(comp==2))<<endl; 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 //return (res==2)&&(comp==2)&&ppcm.count(m);//&&!member(Spoldejavu,m); 00144 }
Definition at line 2076 of file corealgo.cc.
References findcorresppol(), pol< mon, T >::ind, int2mon(), mon2int(), my_plus(), myplus22(), Base< predicat >::nbvar(), pol< mon, T >::nf, and pol< mon, T >::size.
Referenced by ReduceSpol().
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 //cout<<" je reduit prr lui"<<endl<<invconv<Poly>(stock)<<endl; 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 //cout<<"halfred "<<varref*tmpmon<<endl; 02185 findcorresppol(tmpmon,dump,stock); 02186 //cout<<"en retour "<<invconv<Poly>(stock)<<endl; 02187 //res*stock.ind.GetCoeff(); 02188 //cout<<"le coeff ici "<<stock.ind.GetCoeff()<<endl; 02189 my_plus(res,stock,p.nf[i]); 02190 //Tue Dec 4 17:29:06 MET 2001 02191 //MAC_REV_FREE<coeff>(stock.nf,stock.size*sizeof(coeff)); 02192 //Tue Dec 4 17:29:06 MET 2001 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 }
Definition at line 985 of file corealgo.cc.
References mon2int().
00986 { 00987 int res=-1; 00988 if(IsinB(tmp,b)) 00989 { 00990 res=mon2int(tmp); 00991 // cout<<"le monome "<<mon(i,1)*tmp<<" l'indice "<<res<<endl; 00992 } 00993 return res; 00994 }
int indice2 | ( | int | i, | |
int | j, | |||
const Base & | b | |||
) | [inline] |
Definition at line 969 of file corealgo.cc.
References int2mon(), and mon2int().
00970 { 00971 int res=-1; 00972 mon tmp; 00973 int2mon(j,tmp); 00974 tmp*=mon(i,1);//on suppose qd meme que j correspond a qqchose 00975 //cout<<"indice2 IsinB("<<mon(i,1)*tmp<<",b) "<<IsinB(mon(i,1)*tmp,b)<<endl; 00976 if(IsinB(tmp,b)) 00977 { 00978 res=mon2int(tmp); 00979 // cout<<"le monome "<<mon(i,1)*tmp<<" l'indice "<<res<<endl; 00980 } 00981 return res; 00982 }
void init_algo | ( | typP & | P, | |
int & | nouveaumon, | |||
int & | maxdeg, | |||
int & | k, | |||
typPk & | Pk, | |||
typMk & | Mk, | |||
Base & | b, | |||
typdump & | dump | |||
) | [inline] |
cout<<"doBaseMk"<<endl;
Definition at line 293 of file corealgo.cc.
References Crochet(), Dump(), MatrixOf(), minmaxdegP(), my_ord(), Base< predicat >::nbvars, Setnbvars(), setorder(), and stab().
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 //cout<<"mindeg"<<endl; 00317 k=minmaxdegP(tmpPk,maxdeg); 00318 //cout<<"Crochet"<<endl; 00319 //tmpPk.push_back(Crochet(P,k).front()); 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 // for(typename typMk::iterator iter=Mk.begin();iter!=Mk.end();iter++) 00328 // cout<<*iter<<endl; 00329 //cout<<"Matrixof"<<endl; 00330 Mat=MatrixOf(tmpPk,Mk,typMat()); 00331 //affdebug(*Mat); 00332 //cout<<"solve"<<endl; 00333 tmpPk=Solve(*Mat,tmpPk,&pr,&pc); 00334 selectnozero(tmpPk); 00335 //affdebug(*Mat); 00336 stab(tmpPk); 00337 //for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 00338 // cout<<"pol pendant init"<<endl<<*iter<<endl; 00339 // cout<<"deletemat"<<endl; 00340 if(my_rank(*Mat)==(int)tmpPk.size()) flag=0; 00341 Mat->destroystore(); 00342 delete(Mat); 00343 free(pr); 00344 free(pc); 00345 } 00346 //cout<<"Pk,apres solve"<<endl<<tmpPk.front()<<endl; 00347 // cout<<"convertion"<<endl; 00348 // for(typename typP::value_type::iterator iter=tmpPk.front().begin(); 00349 // iter!=tmpPk.front().end();iter++) 00350 // cout<<"*iter "<<*iter<<" IsinB "<<IsinB(*iter,b)<<endl; 00351 //for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 00352 //cout<<"pol apres les solve "<<endl<<*iter<<endl; 00353 for(typename typP::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 00354 { 00355 Pk.push_back(convert<pol>(*iter,b)); 00356 //cout<<"le pol apres invconv"<<endl 00357 // <<invconv<typename typP::value_type>(*Pk.rbegin())<<endl; 00358 // cout<<"le pol original "<<endl<<*iter<<endl; 00359 } 00360 // for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 00361 // cout<<"pol apres les solve "<<endl<<iter->ind<<endl; 00362 debugpol=Pk.front(); 00363 //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 00364 // cout<<"apres convertion "<<endl<< 00365 // invconv<typename typP::value_type>(*iter)<<endl; 00366 //cout<<"size "<<debugpol.size<<endl; 00367 //cout<<"Dump "<<Pk.front().ind.GetCoeff()<<endl; 00368 Dump(Pk,dump); 00369 //cout<<"apres Dump "<<invconv<typename typP::value_type>(Pk.front())<<endl; 00370 //cout<<"je sort d'init_algo "<<endl; 00371 //cout<<"k vaut "<<k<<endl; 00372 // cout<<" Pk.size() "<<Pk.size()<<endl; 00373 return ; 00374 }
Definition at line 43 of file corealgo.cc.
Referenced by choice_fall(), compute_ppcm(), countmon(), Listedejafait(), and stop_degree().
void Listedejafait | ( | const typMk & | Mk, | |
typMk & | Spoldejavu | |||
) | [inline] |
Definition at line 2836 of file corealgo.cc.
References lcm().
Referenced by algo(), NewCrochetchoix(), and newPkMkMatrixof().
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 }
typmat* MatrixOf | ( | const typPk & | L, | |
const typMk & | lm, | |||
const typmat & | mat | |||
) | [inline] |
Definition at line 260 of file corealgo.cc.
Referenced by init_algo().
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 // cout<<"L.size() "<<L.size()<<" lm.size() "<<lm.size()<<endl; 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 }
int member | ( | const typMk & | tmpMk, | |
const typename typMk::value_type | mon | |||
) | [inline] |
Definition at line 1391 of file corealgo.cc.
Referenced by countpoint(), goodspol(), has_b_index(), MonomialBase(), newPkMkMatrixof(), putingoodshape(), and stop_degree().
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 }
int mindeg | ( | const typPk & | l | ) | [inline] |
Definition at line 2422 of file corealgo.cc.
References int2mon(), and Iszero().
Referenced by algo().
02423 { 02424 typedef typename typPk::value_type::monom_t mon; 02425 typedef typename mon::coeff_t coeff; 02426 int res=-1; 02427 // cout<<"dans mindeg res au debut"<<res<<endl; 02428 for(typename typPk::const_iterator iter=l.begin() ;iter!=l.end();iter++) 02429 { 02430 int mmax=-1; 02431 // cout<<"tour de boucle de mindeg "<<endl; 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 // cout<<"mmax ici "<<mmax<<endl; 02440 if (iter->ind.GetCoeff()==(coeff)1) 02441 mmax=(mmax<iter->ind.GetDegree())?iter->ind.GetDegree():mmax; 02442 //cout<<"les gens que je regarde "<<iter->ind<<endl; 02443 if(mmax!=-1) 02444 { 02445 if(res==-1) res=mmax; 02446 res=(mmax>res)?res:mmax; 02447 } 02448 } 02449 //cout<<"resultat de mindeg "<<res<<endl; 02450 return res; 02451 }
int minmaxdegP | ( | typP | P, | |
int & | maxdeg | |||
) | [inline] |
Definition at line 184 of file corealgo.cc.
References Degree().
Referenced by init_algo(), and newPkMkMatrixof().
typpol mult | ( | int | i, | |
const typpol & | pol, | |||
const typdump & | dump, | |||
const Base & | b, | |||
mon ** | exce, | |||
int & | exsize | |||
) | [inline] |
Definition at line 1077 of file corealgo.cc.
References int2mon(), Iszero(), my_plus(), myplus22(), and myplus44().
Referenced by main(), newPkMkMatrixof(), and proj().
01079 { 01080 typedef typename typpol::coeff_t coeff; 01081 //static const mon monzero=mon(0); 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 //cout<<"pol.size "<<pol.size<<endl; 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 //cout<<"stockindice2 "<<stockindice2<<" pol.size "<< 01121 //pol.size<<" J "<<j<<endl; 01122 01123 if (maxind<stockindice2) 01124 maxind=stockindice2; 01125 } 01126 //cout<<"maxind "<<maxind<<endl; 01127 // maxind=size; 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 //ret.nf=res; 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))//ici introduire les epsilon si on veut gagner un peu.. 01139 {// pas necessaire pour les epsilon parce que ca marche !! 01140 int stockindice2=*tmpptr++;//indice2<mon>(i,j,b); 01141 //cout<<"stockindice2 avant le test "<<stockindice2<<endl; 01142 if (stockindice2>=0) 01143 { 01144 ret.nf[stockindice2]+=stockpol; 01145 // cout<<"stocvkindice2 "<<stockindice2<<" pol.size "<< 01146 // pol.size<<" J "<<j<<endl; 01147 } 01148 else 01149 { 01150 // 01151 // 01152 // 01153 // 01154 //typename typpol::monom_t tmpmon; 01155 //cout<<" j vaut dans mult "<<j<<endl; 01156 // cout<<"et int2mon de ce j vaut "<<tmpmon<<endl; 01157 //cout<<"je recherche la nf de "<<tmpmon<<endl; 01158 typpol tmp; 01159 //tmp.ind=monzero; 01160 #ifdef unimul 01161 tmp=nf<typpol>(i,j,dump,b); 01162 #else 01163 tmp=nf<typpol>(stockmontab[j],dump,b); 01164 #endif 01165 //cout<<"tmpind vaut alors "<<tmp.ind<<endl; 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 //nbmyplus++; 01202 //cout<<"tmp "<<tmp<<endl; 01203 //cout<<"tmp.ind "<<tmp->ind<<endl; 01204 //cout<<"tmp.nf "<<tmp->nf<<endl; 01205 my_plus(ret,tmp,stockpol); 01206 //Tue Dec 4 01207 //MAC_REV_FREE<mon>(tmp.nf,tmp.size*sizeof(coeff)); 01208 //res=ret.nf;//car my_plus realloc la chose 01209 #endif 01210 } 01211 else 01212 { 01213 mon tmpmon; 01214 (*exce)[noquo]=mon(i,1); 01215 int2mon(j,tmpmon); 01216 //cout<<"je rajoute ala fin listes exceed "<<tmpmon*mon(i,1)<<endl; 01217 (*exce)[noquo]*=tmpmon;//int2mon<mon>(j); 01218 (*exce)[noquo]*=stockpol; 01219 ++noquo; 01220 }; 01221 01222 //dans plus qd nf renvois NULL il faut rien faire!!!! 01223 } 01224 } 01225 } 01226 //(*exce)=(mon*)MAC_REV_REALLOC<mon>((*exce),pol.size*sizeof(mon) 01227 // ,(noquo)*sizeof(mon)); 01228 //cout<<"fin "<<nbmyplus<<endl; 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 //Fri Nov 16 14:42:34 MET 2001 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 // cout<<"ret.size "<<ret.size<<endl; 01254 // cout<<invconv<Poly>(ret)<<endl; 01255 //cout<<"-----------------------------------"<<endl; 01256 return ret; 01257 01258 }
Definition at line 1262 of file corealgo.cc.
References Base< predicat >::nbvar().
Referenced by GoodDir(), has_b_index(), and newPkMkMatrixof().
void my_merge | ( | T & | l1, | |
const T & | l2 | |||
) | [inline] |
Definition at line 35 of file corealgo.cc.
Referenced by algo(), Crochetchoix(), NewCrochetchoix(), and newPkMkMatrixof().
Definition at line 601 of file corealgo.cc.
References pol< mon, T >::nf, and pol< mon, T >::size.
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;//=taillequotient/16; 00607 register coeff *nfnf=nf.nf,*resnf;; 00608 //register unsigned int tmp;//=taillequotient % 16; 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 //tmp=nf.size & 15;//16 pourquoi... PARCE QUE!!!!! :-)) 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 }
Definition at line 543 of file corealgo.cc.
References pol< mon, T >::nf, and pol< mon, T >::size.
Referenced by Crochetchoix(), halfred(), mult(), NewCrochetchoix(), OLD_ReduceSpol(), and ReduceSpol().
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;//=taillequotient/16; 00552 register coeff *nfnf=nf.nf,*resnf; 00553 coeff *ptr1,*ptr2; 00554 //register unsigned int tmp;//=taillequotient % 16; 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 //resnf=res.nf; 00569 //tmp=nf.size & 15;//16 pourquoi... PARCE QUE!!!!! :-)) 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 }
void my_plus2 | ( | pol & | res1, | |
pol & | res2, | |||
const pol & | nf, | |||
const coeff & | toto1, | |||
const coeff & | toto2 | |||
) | [inline] |
Definition at line 377 of file corealgo.cc.
References pol< mon, T >::nf, and pol< mon, T >::size.
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;//15;//16 pourquoi... PARCE QUE!!!!! :-)) 00405 res1nf=res1.nf; 00406 res2nf=res2.nf; 00407 nfnf=nf.nf; 00408 for(i=0;i<ttmp;i+=8) 00409 { 00410 //1 00411 tmpcoeff=nfnf+i; 00412 res1nf[i]-=*tmpcoeff*toto1; 00413 res2nf[i]-=*tmpcoeff*toto2; 00414 //2 00415 tmpcoeff=nfnf+i+1; 00416 res1nf[i+1]-=*tmpcoeff*toto1; 00417 res2nf[i+1]-=*tmpcoeff*toto2; 00418 //3 00419 tmpcoeff=nfnf+i+2; 00420 res1nf[i+2]-=*tmpcoeff*toto1; 00421 res2nf[i+2]-=*tmpcoeff*toto2; 00422 //4 00423 tmpcoeff=nfnf+i+3; 00424 res1nf[i+3]-=*tmpcoeff*toto1; 00425 res2nf[i+3]-=*tmpcoeff*toto2; 00426 //5 00427 tmpcoeff=nfnf+i+4; 00428 res1nf[i+4]-=*tmpcoeff*toto1; 00429 res2nf[i+4]-=*tmpcoeff*toto2; 00430 //6 00431 tmpcoeff=nfnf+i+5; 00432 res1nf[i+5]-=*tmpcoeff*toto1; 00433 res2nf[i+5]-=*tmpcoeff*toto2; 00434 //7 00435 tmpcoeff=nfnf+i+6; 00436 res1nf[i+6]-=*tmpcoeff*toto1; 00437 res2nf[i+6]-=*tmpcoeff*toto2; 00438 //8 00439 tmpcoeff=nfnf+i+7; 00440 res1nf[i+7]-=*tmpcoeff*toto1; 00441 res2nf[i+7]-=*tmpcoeff*toto2; 00442 #if 0 00443 //9 00444 tmpcoeff=nfnf+i+8; 00445 res1nf[i+8]-=*tmpcoeff*toto1; 00446 res2nf[i+8]-=*tmpcoeff*toto2; 00447 //10 00448 tmpcoeff=nfnf+i+9; 00449 res1nf[i+9]-=*tmpcoeff*toto1; 00450 res2nf[i+9]-=*tmpcoeff*toto2; 00451 00452 //11 00453 tmpcoeff=nfnf+i+10; 00454 res1nf[i+10]-=*tmpcoeff*toto1; 00455 res2nf[i+10]-=*tmpcoeff*toto2; 00456 00457 //12 00458 tmpcoeff=nfnf+i+11; 00459 res1nf[i+11]-=*tmpcoeff*toto1; 00460 res2nf[i+11]-=*tmpcoeff*toto2; 00461 00462 //13 00463 tmpcoeff=nfnf+i+12; 00464 res1nf[i+12]-=*tmpcoeff*toto1; 00465 res2nf[i+12]-=*tmpcoeff*toto2; 00466 00467 //14 00468 tmpcoeff=nfnf+i+13; 00469 res1nf[i+13]-=*tmpcoeff*toto1; 00470 res2nf[i+13]-=*tmpcoeff*toto2; 00471 00472 //15 00473 tmpcoeff=nfnf+i+14; 00474 res1nf[i+14]-=*tmpcoeff*toto1; 00475 res2nf[i+14]-=*tmpcoeff*toto2; 00476 00477 //16 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 }
Definition at line 492 of file corealgo.cc.
References pol< mon, T >::nf, and pol< mon, T >::size.
00493 { 00494 typedef typename pol::monom_t mon; 00495 unsigned int i=0,stock;; 00496 unsigned int ttmp;//=taillequotient/16; 00497 unsigned int tmp;//=taillequotient % 16; 00498 // cout<<"nf.size "<<nf.size<<endl; 00499 //cout<<"nf.ind "<<nf.ind<<endl; 00500 //cout<<"nf.nf "<<nf.nf<<endl; 00501 //cout<<"res.nf "<<res.nf<<endl; 00502 //cout<<"res.size "<<res.size<<endl; 00503 register coeff *resnf,*nfnf; 00504 if (toto==0) return; 00505 if(res.size<nf.size) 00506 { 00507 // cout<<"je realloue res.nf avant "<<res.nf<<endl; 00508 res.nf=(coeff*)MAC_REV_REALLOC<coeff>(res.nf,res.size*sizeof(coeff) 00509 ,nf.size*sizeof(coeff)); 00510 //cout<<"res.nf apres "<<res.nf<<endl; 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;//16 pourquoi... PARCE QUE!!!!! :-)) 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 }
void myplus22 | ( | pol & | res, | |
const pol & | nf, | |||
const coeff | toto, | |||
const pol & | nf2, | |||
const coeff | toto2 | |||
) | [inline] |
Definition at line 647 of file corealgo.cc.
References pol< mon, T >::nf, and pol< mon, T >::size.
Referenced by halfred(), and mult().
00648 { 00649 typedef typename pol::monom_t mon; 00650 register unsigned int i=0; 00651 register unsigned int ttmp;//=taillequotient/16; 00652 register unsigned int tmp;//=taillequotient % 16; 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;//16 pourquoi... PARCE QUE!!!!! :-)) 00671 for(;i<ttmp;i+=16) 00672 { 00673 { 00674 // tmp1=nfnf[i]; 00675 // tmp1*=toto; 00676 // tmp2=nf2nf[i]; 00677 // tmp2*=toto2; 00678 // resnf[i]-=tmp1+tmp2; 00679 resnf[i]-=nfnf[i]*toto+nf2nf[i]*toto2; 00680 // tmp1=nfnf[i+1]; 00681 // tmp1*=toto; 00682 // tmp2=nf2nf[i+1]; 00683 // tmp2*=toto2; 00684 // resnf[i+1]-=tmp1+tmp2; 00685 resnf[i+1]-=nfnf[i+1]*toto+nf2nf[i+1]*toto2; 00686 // tmp1=nfnf[i+2]; 00687 // tmp1*=toto; 00688 // tmp2=nf2nf[i+2]; 00689 // tmp2*=toto2; 00690 // resnf[i+2]-=tmp1+tmp2; 00691 resnf[i+2]-=nfnf[i+2]*toto+nf2nf[i+2]*toto2; 00692 // tmp1=nfnf[i+3]; 00693 // tmp1*=toto; 00694 // tmp2=nf2nf[i+3]; 00695 // tmp2*=toto2; 00696 // resnf[i+3]-=tmp1+tmp2; 00697 resnf[i+3]-=nfnf[i+3]*toto+nf2nf[i+3]*toto2; 00698 // tmp1=nfnf[i+4]; 00699 // tmp1*=toto; 00700 // tmp2=nf2nf[i+4]; 00701 // tmp2*=toto2; 00702 // resnf[i+4]-=tmp1+tmp2; 00703 resnf[i+4]-=nfnf[i+4]*toto+nf2nf[i+4]*toto2; 00704 // tmp1=nfnf[i+5]; 00705 // tmp1*=toto; 00706 // tmp2=nf2nf[i+5]; 00707 // tmp2*=toto2; 00708 // resnf[i+5]-=tmp1+tmp2; 00709 resnf[i+5]-=nfnf[i+5]*toto+nf2nf[i+5]*toto2; 00710 // tmp1=nfnf[i+6]; 00711 // tmp1*=toto; 00712 // tmp2=nf2nf[i+6]; 00713 // tmp2*=toto2; 00714 // resnf[i+6]-=tmp1+tmp2; 00715 resnf[i+6]-=nfnf[i+6]*toto+nf2nf[i+6]*toto2; 00716 // tmp1=nfnf[i+7]; 00717 // tmp1*=toto; 00718 // tmp2=nf2nf[i+7]; 00719 // tmp2*=toto2; 00720 // resnf[i+7]-=tmp1+tmp2; 00721 resnf[i+7]-=nfnf[i+7]*toto+nf2nf[i+7]*toto2; 00722 // tmp1=nfnf[i+8]; 00723 // tmp1*=toto; 00724 // tmp2=nf2nf[i+8]; 00725 // tmp2*=toto2; 00726 // resnf[i+8]-=tmp1+tmp2; 00727 resnf[i+8]-=nfnf[i+8]*toto+nf2nf[i+8]*toto2; 00728 // tmp1=nfnf[i+9]; 00729 // tmp1*=toto; 00730 // tmp2=nf2nf[i+9]; 00731 // tmp2*=toto2; 00732 // resnf[i+9]-=tmp1+tmp2; 00733 resnf[i+9]-=nfnf[i+9]*toto+nf2nf[i+9]*toto2; 00734 // tmp1=nfnf[i+10]; 00735 // tmp1*=toto; 00736 // tmp2=nf2nf[i+10]; 00737 // tmp2*=toto2; 00738 // resnf[i+10]-=tmp1+tmp2; 00739 resnf[i+10]-=nfnf[i+10]*toto+nf2nf[i+10]*toto2; 00740 // tmp1=nfnf[i+11]; 00741 // tmp1*=toto; 00742 // tmp2=nf2nf[i+11]; 00743 // tmp2*=toto2; 00744 // resnf[i+11]-=tmp1+tmp2; 00745 resnf[i+11]-=nfnf[i+11]*toto+nf2nf[i+11]*toto2; 00746 // tmp1=nfnf[i+12]; 00747 // tmp1*=toto; 00748 // tmp2=nf2nf[i+12]; 00749 // tmp2*=toto2; 00750 // resnf[i+12]-=tmp1+tmp2; 00751 resnf[i+12]-=nfnf[i+12]*toto+nf2nf[i+12]*toto2; 00752 // tmp1=nfnf[i+13]; 00753 // tmp1*=toto; 00754 // tmp2=nf2nf[i+13]; 00755 // tmp2*=toto2; 00756 // resnf[i+13]-=tmp1+tmp2; 00757 resnf[i+13]-=nfnf[i+13]*toto+nf2nf[i+13]*toto2; 00758 // tmp1=nfnf[i+14]; 00759 // tmp1*=toto; 00760 // tmp2=nf2nf[i+14]; 00761 // tmp2*=toto2; 00762 // resnf[i+14]-=tmp1+tmp2; 00763 resnf[i+14]-=nfnf[i+14]*toto+nf2nf[i+14]*toto2; 00764 // tmp1=nfnf[i+15]; 00765 // tmp1*=toto; 00766 // tmp2=nf2nf[i+15]; 00767 // tmp2*=toto2; 00768 // resnf[i+15]-=tmp1+tmp2; 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;//16 pourquoi... PARCE QUE!!!!! :-)) 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 // resnf[i]-=nfnf[i]*toto+nf2nf[i]*toto2; 00792 tmp1=nfnf[i+1]; 00793 tmp1*=toto; 00794 tmp2=nf2nf[i+1]; 00795 tmp2*=toto2; 00796 resnf[i+1]-=tmp1+tmp2; 00797 // resnf[i+1]-=nfnf[i+1]*toto+nf2nf[i+1]*toto2; 00798 tmp1=nfnf[i+2]; 00799 tmp1*=toto; 00800 tmp2=nf2nf[i+2]; 00801 tmp2*=toto2; 00802 resnf[i+2]-=tmp1+tmp2; 00803 // resnf[i+2]-=nfnf[i+2]*toto+nf2nf[i+2]*toto2; 00804 tmp1=nfnf[i+3]; 00805 tmp1*=toto; 00806 tmp2=nf2nf[i+3]; 00807 tmp2*=toto2; 00808 resnf[i+3]-=tmp1+tmp2; 00809 // resnf[i+3]-=nfnf[i+3]*toto+nf2nf[i+3]*toto2; 00810 tmp1=nfnf[i+4]; 00811 tmp1*=toto; 00812 tmp2=nf2nf[i+4]; 00813 tmp2*=toto2; 00814 resnf[i+4]-=tmp1+tmp2; 00815 // resnf[i+4]-=nfnf[i+4]*toto+nf2nf[i+4]*toto2; 00816 tmp1=nfnf[i+5]; 00817 tmp1*=toto; 00818 tmp2=nf2nf[i+5]; 00819 tmp2*=toto2; 00820 resnf[i+5]-=tmp1+tmp2; 00821 // resnf[i+5]-=nfnf[i+5]*toto+nf2nf[i+5]*toto2; 00822 tmp1=nfnf[i+6]; 00823 tmp1*=toto; 00824 tmp2=nf2nf[i+6]; 00825 tmp2*=toto2; 00826 resnf[i+6]-=tmp1+tmp2; 00827 // resnf[i+6]-=nfnf[i+6]*toto+nf2nf[i+6]*toto2; 00828 tmp1=nfnf[i+7]; 00829 tmp1*=toto; 00830 tmp2=nf2nf[i+7]; 00831 tmp2*=toto2; 00832 resnf[i+7]-=tmp1+tmp2; 00833 // resnf[i+7]-=nfnf[i+7]*toto+nf2nf[i+7]*toto2; 00834 tmp1=nfnf[i+8]; 00835 tmp1*=toto; 00836 tmp2=nf2nf[i+8]; 00837 tmp2*=toto2; 00838 resnf[i+8]-=tmp1+tmp2; 00839 // resnf[i+8]-=nfnf[i+8]*toto+nf2nf[i+8]*toto2; 00840 tmp1=nfnf[i+9]; 00841 tmp1*=toto; 00842 tmp2=nf2nf[i+9]; 00843 tmp2*=toto2; 00844 resnf[i+9]-=tmp1+tmp2; 00845 // resnf[i+9]-=nfnf[i+9]*toto+nf2nf[i+9]*toto2; 00846 tmp1=nfnf[i+10]; 00847 tmp1*=toto; 00848 tmp2=nf2nf[i+10]; 00849 tmp2*=toto2; 00850 resnf[i+10]-=tmp1+tmp2; 00851 // resnf[i+10]-=nfnf[i+10]*toto+nf2nf[i+10]*toto2; 00852 tmp1=nfnf[i+11]; 00853 tmp1*=toto; 00854 tmp2=nf2nf[i+11]; 00855 tmp2*=toto2; 00856 resnf[i+11]-=tmp1+tmp2; 00857 // resnf[i+11]-=nfnf[i+11]*toto+nf2nf[i+11]*toto2; 00858 tmp1=nfnf[i+12]; 00859 tmp1*=toto; 00860 tmp2=nf2nf[i+12]; 00861 tmp2*=toto2; 00862 resnf[i+12]-=tmp1+tmp2; 00863 // resnf[i+12]-=nfnf[i+12]*toto+nf2nf[i+12]*toto2; 00864 tmp1=nfnf[i+13]; 00865 tmp1*=toto; 00866 tmp2=nf2nf[i+13]; 00867 tmp2*=toto2; 00868 resnf[i+13]-=tmp1+tmp2; 00869 // resnf[i+13]-=nfnf[i+13]*toto+nf2nf[i+13]*toto2; 00870 tmp1=nfnf[i+14]; 00871 tmp1*=toto; 00872 tmp2=nf2nf[i+14]; 00873 tmp2*=toto2; 00874 resnf[i+14]-=tmp1+tmp2; 00875 // resnf[i+14]-=nfnf[i+14]*toto+nf2nf[i+14]*toto2; 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 }
void myplus44 | ( | pol & | res, | |
const pol & | nf, | |||
const coeff | toto, | |||
const pol & | nf2, | |||
const coeff | toto2, | |||
const pol & | nf3, | |||
const coeff | toto3, | |||
const pol & | nf4, | |||
const coeff | toto4 | |||
) | [inline] |
Definition at line 892 of file corealgo.cc.
References min(), pol< mon, T >::nf, and pol< mon, T >::size.
Referenced by mult().
00896 { 00897 typedef typename pol::monom_t mon; 00898 register unsigned int i=0; 00899 register unsigned int ttmp;//=taillequotient/16; 00900 register unsigned int tmp;//=taillequotient % 16; 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;//16 pourquoi... PARCE QUE!!!!! :-)) 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 }
void NewCrochetchoix | ( | typP & | P, | |
typPk & | Pk, | |||
typMk & | Mk, | |||
typPk & | redspol, | |||
int & | k, | |||
typdump & | dump, | |||
Base & | b, | |||
typrecall & | recall | |||
) | [inline] |
Definition at line 2594 of file corealgo.cc.
References Base< predicat >::begin(), compress(), Crochet(), Dump(), Base< predicat >::end(), Base< predicat >::erase(), forget(), isdivisible(), Listedejafait(), mon2int(), my_merge(), my_plus(), recover(), and remiseenforme().
Referenced by algo().
02608 { 02609 //displaymon(); 02610 typedef typename typP::value_type polyalp; 02611 typedef typename polyalp::monom_t mon; 02612 typedef typename polyalp::coeff_t coeff; 02613 // for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) 02614 //cout<<"les gens dans redspol "<<endl<<invconv<polyalp>(*iter)<<endl; 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 // cout<<"un nouveau tour de boucle "<<endl; 02631 if (!Ispolzero(*iter)) 02632 { 02633 //iter->ind=choice(invconv<polyalp>(*iter)); 02634 iter->ind=choice(*iter,b); 02635 //cout<<"le pol pas zero "<<(invconv<polyalp>(*iter))<<endl; 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 //cout<<"le pol pas zero "<<(invconv<polyalp>(*iter))<<endl; 02645 //cout<<"passage par bout de code en plus "<<endl; 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 //cout<<"newres.size "<<res.size()<<endl; 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 //iter->ind=choice(invconv<polyalp>(*iter)); 02665 iter->ind=choice(*iter,b); 02666 Dump(Pk,dump);//c pour detruire Pk dans forget 02667 //ca ne respecte pas la structure du dump!!! 02668 recover(Pk,Mk,dump,k); 02669 #ifdef NO_TWICE 02670 Listedejafait(Mk,Spoldejavu); 02671 #endif 02672 forget(b,dump,k,recall); 02673 //forget(b,dump,k); 02674 compress(Pk,redspol,dump,b,k); 02675 //swap(*iter,*res.rbegin());//on veut ne plus 02676 //iter=--res.end();//refaire d'autre tours 02677 } 02678 //cout<<"g choisi dans Crochetchoix "<<iter->ind<<endl; 02679 //cout<<"a t'il un mon2int ?"<<IsinB(iter->ind,b)<<endl; 02680 //mon tmp10,tmp11; 02681 // int2mon(10,tmp10);int2mon(11,tmp11); 02682 //cout<<"qu'en est il de int2mon(10) et 11 "<<tmp10<<" "<<tmp11<<endl; 02683 // 02684 // 02685 // 02686 #ifdef UGLY_HACK 02687 remiseenforme(*iter); 02688 #endif 02689 //SALE HACK 02690 // 02691 // 02692 // 02693 // 02694 // 02695 *iter/=iter->ind.GetCoeff();//pour la "nf" 02696 iter->ind*=(coeff)1/iter->ind.GetCoeff();//pour l'ind 02697 iter->nf[mon2int(iter->ind)]=0; 02698 // 02699 // 02700 // 02701 #ifdef UGLY_HACK 02702 remiseenforme(*iter); 02703 #endif 02704 //SALE HACK 02705 // 02706 // 02707 // 02708 // 02709 // 02710 02711 tmpres.push_back(*iter); 02712 //on met a 0 le coeff du mon passe en ind 02713 //maintenant on a une regle en forme comme il faut reste a: 02714 //-reduire les regles deja existantes par rapport acelle ci 02715 //-reduire les autres redspol par rapport a celle ci 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))//test a zero!!! 02719 { 02720 //cout<<"g trouve un gus qui a un coeff du mon choisi "<<endl; 02721 //cout<<"le voila "<<invconv<Poly>(*iterPk)<<endl; 02722 //<<iterPk->nf[mon2int(iter->ind)]<<endl; 02723 coeff tmpcoeff=iterPk->nf[mon2int(iter->ind)]; 02724 //cout<<"le coeff "<<tmpcoeff<<" tmpind "<<mon2int(iter->ind)<<endl; 02725 my_plus(*iterPk,*iter,tmpcoeff); 02726 iterPk->nf[mon2int(iter->ind)]=0; 02727 //cout<<"apres plus le coeff vaut " 02728 // <<iterPk->nf[mon2int(iter->ind)]<<endl; 02729 //cout<<"apres mise a jour"<<endl<<invconv<Poly>(*iterPk)<<endl; 02730 } 02731 //attention plus(a,b)==a-coeff_de_ind_b_dans_a*b; 02732 typename typPk::iterator iterredspol=iter; 02733 iterredspol++; 02734 for(;iterredspol!=res.end();iterredspol++) 02735 { 02736 //cout<<"redspol.size() "<<redspol.size()<<endl; 02737 //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl; 02738 if(mon2int(iter->ind)<iterredspol->size && 02739 iterredspol->nf[mon2int(iter->ind)]!=(coeff)0)//test a 0 ici 02740 { 02741 coeff tmpcoeff=iterredspol->nf[mon2int(iter->ind)]; 02742 my_plus(*iterredspol,*iter,tmpcoeff); 02743 iterredspol->nf[mon2int(iter->ind)]=0; 02744 // cout<<"coucou je suis ici "<< 02745 // iterredspol->nf[mon2int(iter->ind)]<<endl; 02746 } 02747 } 02748 //au tour de tmpres... 02749 for(iterredspol=tmpres.begin();iterredspol!=tmpres.end();iterredspol++) 02750 { 02751 //cout<<"redspol.size() "<<redspol.size()<<endl; 02752 //cout<<"iterredspol-ind "<<iterredspol->ind<<" "<<iterredspol->nf<<endl; 02753 if(mon2int(iter->ind)<iterredspol->size && 02754 iterredspol->nf[mon2int(iter->ind)]!=(coeff)0)//test a 0 ici 02755 { 02756 coeff tmpcoeff=iterredspol->nf[mon2int(iter->ind)]; 02757 my_plus(*iterredspol,*iter,tmpcoeff); 02758 iterredspol->nf[mon2int(iter->ind)]=0; 02759 // cout<<"coucou je suis ici "<< 02760 // iterredspol->nf[mon2int(iter->ind)]<<endl; 02761 } 02762 } 02763 //voila c fait 02764 //maintenant on met a jour la Base b. 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 // cout<<"reffuse rajoute "<<iter->ind<<endl; 02788 iterb->refuse[iterb->taille2].SetCoeff(1); 02789 iterb->taille2++; 02790 } 02791 res.erase(iter--); 02792 } 02793 //break;//comme ca on fait pas 50 tours. 02794 } 02795 02796 for (typename typPk::iterator iterpk=Pk.begin();iterpk!=Pk.end();iterpk++) 02797 { 02798 //cout<<"iterpk->ind "<<iterpk->ind<<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl; 02799 //cout<<"le pol "<<invconv<Poly>(*iterpk)<<endl; 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);//les gens dans res\tmpres ne sont pas detruits ici!! 02818 my_merge(redspol,res); 02819 //displaymon(); 02820 return; 02821 }
void NewDestroyredspol | ( | typPk & | redspol, | |
const typPk & | Pk | |||
) | [inline] |
Definition at line 2824 of file corealgo.cc.
Referenced by algo().
02825 { 02826 // typename typPk::const_iterator iterpk=--Pk.end(); 02827 for(typename typPk::iterator iter=redspol.begin(); 02828 iter!=redspol.end();iter++) 02829 { 02830 // if(iter->nf!=iterpk->nf) 02831 MAC_REV_FREE<typename typPk::value_type::coeff_t>(iter->nf,iter->size*sizeof(typename typPk::value_type::coeff_t)); 02832 } 02833 }
int newPkMkMatrixof | ( | typMat & | mat, | |
typPk & | Pk, | |||
typP & | P, | |||
typMk & | Mk, | |||
int & | k, | |||
Base & | b, | |||
typdump & | dump, | |||
typrecall & | recall | |||
) | [inline] |
!! ATTENTION C VITAL DE PAS FAIRE N'IMPORTE QUOI AVEC LES IND
Definition at line 1506 of file corealgo.cc.
References affdebug(), Base< predicat >::begin(), compress(), conv_merge(), Crochet(), Degree(), Base< predicat >::end(), forget(), GoodDir(), Listedejafait(), member(), minmaxdegP(), mon2int(), mult(), my_divmon(), my_merge(), Base< predicat >::nbvar(), Base< predicat >::nbvars, proj(), putingoodshape(), and recover().
Referenced by algo().
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 //prise en compte des pol pas encore introduits 01529 cout<<endl; 01530 cerr<<"k on entering newpkmkmatrixof "<<k<<endl; 01531 //cout<<"crochet"<<endl; 01532 typP ttmpP=Crochet(P,k+1);// 01533 //typrecall verytmp=Crochet(recall,k+1);//verytmpP 24/08/2001 01534 //recall.erase(recall.begin(),recall.end()); 01535 //my_merge(ttmpP,verytmpP);//le 24/08/2001 01536 //nbproj=ttmpP.size(); 01537 //for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 01538 // cout<<"ind au debut"<<iter->ind<<endl; 01539 //for(typename typPk::iterator iter=verytmp.begin();iter!=verytmp.end();iter++) 01540 // cout<<"ind au debut"<<iter->ind<<endl; 01541 // cout<<"pol au debut"<<invconv<typename typP::value_type>(*iter)<<endl; 01542 if (!ttmpP.empty()) 01543 { 01544 int tmpdeg; 01545 // cout<<"proj "<<endl; 01546 proj(ttmpP,dump,b); 01547 // cout<<"selectnozero"<<endl; 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 // for(typename typP::iterator iter=P.begin();iter!=P.end();iter++) 01557 //if(Degree(*iter)==k+1) P.erase(iter--); 01558 //for(typename typP::iterator iter=ttmpP.begin();iter!=ttmpP.end();iter++) 01559 // P.push_back(*iter); 01560 // cout<<"pol mal red "<<*iter<<endl; 01561 //cout<<"passage par ici"<<endl; 01562 nbproj=ttmpP.size(); 01563 if (!ttmpP.empty()) 01564 { 01565 // cout<<"apres select non zero "<<ttmpP.size()<<endl; 01566 tmpdeg=minmaxdegP(ttmpP,tmpdeg); 01567 // cout<<"apres minmax deg "<<tmpdeg<<" "<<k<<endl; 01568 if(tmpdeg<k+1) 01569 { 01570 flagdoplus=0; 01571 // cout<<"un des pol de pretendu degre le bon se reduit mal"<<endl; 01572 //en fait a un polynome de degre inferieur 01573 typPk tmpconv; 01574 //cout<<"recover"<<endl; 01575 recover(tmpPk,Mk,dump,tmpdeg); 01576 #ifdef NO_TWICE 01577 Listedejafait(Mk,Spoldejavu); 01578 #endif 01579 // for (typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 01580 // cout<<"pol ICI "<<invconv<typename typP::value_type>(*iter)<<endl; 01581 // cout<<"forget "<<tmpdeg<<endl; 01582 // recall=verytmp; 01583 forget(b,dump,tmpdeg,recall); 01584 compress(tmpPk,dump,b,tmpdeg); 01585 //verytmp.erase(verytmp.begin(),verytmp.end()); 01586 01587 01588 01589 //forget(b,dump,tmpdeg); 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 // for(typename typP::iterator iter=ttmpP.begin() 01599 // ;iter!=ttmpP.end();iter++) 01600 //P.push_back(*iter); 01601 nbproj=ttmpP.size(); 01602 //for(typename typP::iterator iter=ttmpP.begin();iter!=ttmpP.end();iter++) 01603 // tmpconv.push_back(convert<pol>(*iter,b)); 01604 //ttmpP.erase(ttmpP.begin(),ttmpP.end());//samedi 24 aout 01605 //nbproj=1;// samedi 24 aout 01606 //Crochetchoix(P,Pk,tmpconv,tmpdeg,b); 01607 //ttmpP.push_back(invconv<typename typP::value_type>(Pk.back())); 01608 //Pk.pop_back();//on elimine de Pk le pol de proj choisi 01609 //pour se ramner au cas ou proj != 0 et P ok 01610 Mk.erase(Mk.begin(),Mk.end()); 01611 for (typename typPk::iterator iterpk=tmpPk.begin(); 01612 iterpk!=tmpPk.end();iterpk++) 01613 { 01614 // cout<<"iterpk->ind "<<iterpk->ind 01615 // <<"et Isinb(iterpk-ind,b) "<<IsinB(iterpk->ind,b)<<endl; 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 // cout<<"pour Mk iter->ind "<<iter->ind<<endl; 01639 } 01640 //on vient de chuter de 01641 //degre et on a reconstitue les bons mk et pk 01642 k=tmpdeg-1; 01643 //Dump(Pk,dump); 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 // int nbmult=0; 01657 //list<mon> dejavu; 01658 //consttruction des pol ord sup 01659 for(int i=0;i<b.nbvar();i++) 01660 { 01661 for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) 01662 { 01663 //cout<<"avant gooddir l'ind "<<iter->ind<<endl; 01664 if(GoodDir((*iter).ind,i,b)) 01665 { 01666 mon tmpmon=iter->ind*mon(i,1); 01667 //tmpmon.SetCoeff(1); 01668 //if(!member(tmpMk,tmpmon)) 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 // cout<<"g un candidat "<<tmpmon<<" son ind "<<iterrec->ind<<"la comparaison "<<(iterrec->ind.rep==tmpmon.rep)<<endl; 01682 // putingoodshape(P,workvect,Mk,exceed,sizeex,dump,b); 01683 workvect.push_back(*iterrec); 01684 verytmp.erase(iterrec); 01685 continue; 01686 } 01687 #endif 01688 //cout<<"aprfes gooddir"<<endl; 01689 mon * tmp=NULL; 01690 int tmpsize; 01691 //cout<<"avant mult"<<endl; 01692 tmpPk.push_back(mult(i,*iter,dump,b,&tmp,tmpsize)); 01693 //attention le coefficient de ind est la taille de 01694 // l'exceed correspondant 01695 // cout<<"apres mult"<<endl; 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 // nbmult++; 01705 } 01706 } 01707 } 01708 } 01709 // recall=verytmp; 01710 // cout<<"nbmult "<<nbmult<<endl; 01711 } 01712 01713 // cout<<"tmpPK.size "<<tmpPk.size()<<endl; 01714 //Constructyion de pol terminee 01715 //cout<<"ttmpP.size "<<ttmpP.size()<<endl; 01716 //cout<<"avant conv merge"<<endl; 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 //NON il faut virer les ind de B avant de les pushbacker 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 //recall=verytmp; 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 //cout<<"apres conv merge"<<endl; 01757 //cout<<"tmpMK==empty?? "<<tmpMk.empty()<<endl; 01758 // for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 01759 // { 01760 // cout<<"iter->ind.GetCoeff() "<<iter->ind.GetCoeff()-1 01761 // <<" et ind "<<iter->ind<<endl; 01762 // } 01763 //cout<<"tmpPK.size "<<tmpPk.size()<<endl; 01764 01765 //Tue Nov 27 15:57:25 MET 2001 01766 /* 01767 for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 01768 01769 { 01770 mon tmp=iter->ind; 01771 tmp.SetCoeff(1); 01772 if((iter->ind.GetDegree()!=0)&&(!member(tmpMk,tmp))) 01773 { 01774 //cout<<"iter->ind.GetCoeff()"<<iter->ind.GetCoeff()-(coeff)1<<" " 01775 // <<tmp<<endl; 01776 tmpMk.push_back(tmp); 01777 //tmpMk.back().SetCoeff(1); 01778 } 01779 } 01780 */ 01781 //construction de la matrice maintenant 01782 //positionnement des pointeurs de matrices pour gagner en tps 01783 { 01784 int nnz=0; 01785 //----------------- 01786 //for(typename typMk::iterator iter=tmpMk.begin();iter!=tmpMk.end();iter++) 01787 // cout<<"mon "<<*iter<<endl; 01788 //----------------- 01789 // cout<<"nb proj "<<nbproj<<endl; 01790 for(list<int>::iterator iter=sizeexceed.begin();iter!=sizeexceed.end() 01791 ;iter++) 01792 { 01793 nnz+=*iter; 01794 // cout<<"on a donc de monme pour celui la "<< 01795 // (int)((iter->ind).GetCoeff()-1)<<" d'ou nnz "<<nnz<<endl; 01796 } 01797 //for(typename typPk::iterator iter=tmpPk.begin();iter!=tmpPk.end();iter++) 01798 // { 01799 // int tmp=0; 01800 // for(;(iter->ind).GetCoeff()>(coeff)tmp;tmp++); 01801 // nnz+=tmp-1; 01802 // cout<<"on a donc de monme pour celui la "<< 01803 // (int)((iter->ind).GetCoeff()-1)<<" d'ou nnz "<<nnz<<endl; 01804 // } 01805 // nnz+=tmpPk.size()-nbproj;//le 10/05/2001 avant: nnz+=tmpMk.size()-nbproj; 01806 //le -nbproj rajoute le 23/01/2001!! 01807 // #define DEBUG 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++)//;tmpiter->ind.GetCoeff()>i+1;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 // #undef DEBUG 01830 cout<<"nnz of matrix "<<nnz<<endl; 01831 //en general la matrice est rectangulaire 01832 void * toto=MAC_REV_MALLOC<coeff>(nnz*sizeof(typename typMat::coeff_t)); 01833 //+nnz*sizeof(int)+((*mat)->ncol+1)*sizeof(int)); 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 // mstore->rowind=(int*)((double*)toto+nnz); 01846 if(mat.rowind!=NULL) free(mat.rowind); 01847 mat.rowind=(int*)malloc(nnz*sizeof(int)); 01848 //mstore->colptr=(int*)(mstore->rowind+nnz);// 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 //matrice cree rest plus qu'a ecrire dedans ca 01854 { 01855 int *ncol=(int*)calloc(mat.ncol,sizeof(int)); 01856 //memset((void*)ncol,0,(*mat)->ncol*sizeof(int)); 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 // if(iterpk->ind.GetDegree()>0) 01886 // { 01887 // mon tmpmon=iterpk->ind; 01888 // tmpmon.SetCoeff(1); 01889 // ncol[mapint[tmpmon]]++; 01890 // cout<<"on est a la ligne "<<line_num<<" ai augmente "<<mapint[(iterpk->ind*(1/iterpk->ind.GetCoeff()))]<<" a cause de son monome dom "<<endl; 01891 // cout<<"le voila "<<(iterpk->ind*(1/iterpk->ind.GetCoeff()))<<endl; 01892 //} 01893 { 01894 // coeff tmpcoeff=(iterpk->ind).GetCoeff()-(coeff)1; 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 //cout<<"iterpk icici ->GetCoeff()"<<iterpk->ind.GetCoeff()<<endl; 01902 // if (mapint.count((*iterex)[i])) 01903 { 01904 ++ncol[mapint[(*iterex)[i]]]; 01905 // cout<<" ai augmente "<<mapint[(*iterex)[i]]<<"a cause de iterex "<<endl; 01906 } 01907 #endif 01908 } 01909 } 01910 } 01911 //rajoute le 23/01/2001 01912 //enleve le 17.05/2001 01913 // for(int i=mat.nrow-nbproj;i<mat.nrow;i++) 01914 // ncol[i]--; 01915 //fin rajout c pour prendre en compte que lors de 01916 //de la proj le monome de tete se trouve dans exceed 01917 //fin enlevement 01918 typename typMat::coeff_t* nzval=(typename typMat::coeff_t*)mat.nzval; 01919 int *rowind=mat.rowind; 01920 int *colptr=mat.colptr; 01921 //mise en place des colptr 01922 *colptr=0; 01923 for(int i=0;i<mat.ncol-1;i++) 01924 { 01925 colptr[i+1]=colptr[i]+ncol[i]; 01926 //cout<<"nb element colonne "<<i<<" "<<ncol[i]<<endl; 01927 //cout<<"les valeurs de debut de colonne "<<8*colptr[i+1]<<endl; 01928 } 01929 colptr[mat.ncol]=mat.nnz; 01930 //cout<<"mat.nnz "<<mat.nnz<<" "<<mat.nnz*8<<endl; 01931 //fin mise en place 01932 //la on fait des manip symboliques pour savoir ou ecrire 01933 //les coeffs de chaques colonnes ca evite d'avoir a les 01934 //recopier 50000 fois pour construire la matrice 01935 //c bcp plus rapide 01936 itermk=tmpMk.begin(); 01937 iterpk=tmpPk.begin(); 01938 iterex=exceed.begin(); 01939 itersize=sizeexceed.begin(); 01940 line_num=0; 01941 //cout<<"nbproj "<<nbproj<<endl; 01942 #if 0 01943 for(;0&&(line_num < (int)(tmpPk.size()-nbproj)); 01944 iterpk++,iterex++,itersize++,line_num++) 01945 //les polynome projette sont foutut au bout de la liste!! 01946 //d'ou le tmpPk.size()-nbproj 01947 { 01948 mon tmpmon=iterpk->ind; 01949 tmpmon.SetCoeff(1); 01950 //const unsigned int tmpplus=line_num+1,tmp=line_num; 01951 const unsigned int tmpplus 01952 =mapint[tmpmon]+1,tmp=tmpplus-1; 01953 // cout<<"ici line_num"<<line_num<<" le mon dom est col "<<tmp<<endl; 01954 //ici couille car le ind n'est pas forcement le mon diag 01955 nzval[colptr[tmpplus]-ncol[tmp]]=1; 01956 //fin couille changer un truc 01957 // cout<<"mat.nnz "<<mat.nnz<<endl; 01958 //cout<<"colptr[...]"<<colptr[tmpplus]<<endl; 01959 //cout<<"ncol[....]"<<ncol[tmp]<<endl; 01960 //cout<<"1 a la pos "<<colptr[tmpplus]-ncol[tmp]<<endl; 01961 rowind[colptr[tmpplus]-ncol[tmp]]=line_num; 01962 //cout<<"1 a la ligne "<<rowind[colptr[tmpplus]-ncol[tmp]]<<endl; 01963 ncol[tmp]--; 01964 { 01965 //coeff tmpcoeff=iterpk->ind.GetCoeff()-(coeff)1; 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 // cout<<"valeur de ncol["<<tmpex<<"] "<<ncol[tmpex]<<endl; 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 //const unsigned int tmpplus=line_num+1,tmp=line_num; 01985 { 01986 //coeff tmpcoeff=iterpk->ind.GetCoeff()-(coeff)1; 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 //free(*iterex); 02001 } 02002 free(ncol); 02003 } 02005 for(typename typPk::iterator iterpk=tmpPk.begin() 02006 ;iterpk!=tmpPk.end();iterpk++) 02007 iterpk->ind.SetCoeff(1); 02008 //iterpk->ind*=1/iterpk->ind.GetCoeff(); 02009 // cout<<"la matrice dans newpkmkmatrixof"<<endl; 02010 //cout<<" nombre de non zero "<<mat.nnz<<endl; 02011 #ifdef DEB 02012 affdebug(mat); 02013 #endif 02014 //cout<<"le colptr "<<endl; 02015 //for(int i=0;i<mat.ncol;i++) 02016 // cout<<mat.colptr[i]<<" "<<endl; 02017 // cout<<"les indices de lignes et le nnz"<<endl; 02018 //for(int i=0;i<mat.nnz;i++) 02019 // cout<<mat.rowind[i]<<" "<<((typename typMat::coeff_t*)mat.nzval)[i]<<endl; 02020 //cout<<"fin matrice"<<endl; 02021 Pk.swap(tmpPk); 02022 Mk.swap(tmpMk); 02023 02024 // for(int i=0;i<mat.nnz;i++) 02025 // cout<<"coeff mat "<<((typename typMat::coeff_t*)mat.nzval)[i]<<" et i "<<i<<endl; 02026 return flagdoplus; 02027 }
Definition at line 1047 of file corealgo.cc.
References pol< mon, T >::nf, and pol< mon, T >::size.
01048 { 01049 //on cherche dans dump... 01050 //a optimiser plus tard 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;//=tmpmon.GetDegree()+1; 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())//on cherche pas n'importe quoi qd meme 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 }
typpol nf | ( | int | var, | |
int | indmon, | |||
const typdump & | dump, | |||
const Base & | b | |||
) | [inline] |
Definition at line 1001 of file corealgo.cc.
References int2mon(), pol< mon, T >::nf, and pol< mon, T >::size.
01002 { 01003 //on cherche dans dump... 01004 //a optimiser plus tard 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;//=mon(1,var)*int2mon<mon>(indmon); 01012 int deg=0;//=tmpmon.GetDegree()+1; 01013 typename typdump::const_iterator iter; 01014 int2mon(indmon,tmpmon); 01015 deg=tmpmon.GetDegree()+1; 01016 //cout<<"mon("<<var<<",1) "<<mon(var,1)<<" et deg "<<deg<<endl; 01017 tmpmon*=mon(var,1); 01018 for(iter=dump.begin(); 01019 (iter!=dump.end()) && (iter->k!=deg);iter++); 01020 // cout<<"iter-k "<<iter->k<<endl; 01021 // if(iter!=dump.end()) cout<<"iter->k en sortie "<<iter->k<<" et deg "<<deg<<endl; 01022 //cout<<"valuer a la sortie "<<(--iter)++->k<<endl; 01023 // cout<<"iter!=dump.end() "<<(iter!=dump.end()) 01024 // <<" dump.empty() "<<dump.empty()<<endl; 01025 if(iter!=dump.end())//on cherche pas n'importe quoi qd meme 01026 { 01027 int i; 01028 for(i=0;i<iter->size;i++) 01029 { 01030 // cout<<"dans nf iter->nf[i].ind "<<iter->nf[i].ind<<endl; 01031 if(iter->nf[i].ind.rep==tmpmon.rep) 01032 break; 01033 } 01034 if(i!=iter->size) 01035 //Tue Dec 4 16:39:25 MET 2001 01036 // densify(iter->nf[i],res); 01037 01038 res=(iter->nf[i]); 01039 } 01040 //cout<<"la gueule de res "<<res<<endl; 01041 //if (res!=NULL) cout<<"suite de res "<<res->ind<<" "<<res->nf<<endl; 01042 return res; 01043 }
void OLD_ReduceSpol | ( | typPk & | S, | |
const typdump & | dump, | |||
typPk & | redspol, | |||
const Base & | b | |||
) | [inline] |
Definition at line 2295 of file corealgo.cc.
References findcorresppol(), pol< mon, T >::ind, int2mon(), mon2int(), my_plus(), pol< mon, T >::nf, and varmult().
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 //cout<<"en entree de RedSpol S.size "<<S.size()/2<<endl; 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 //cout<<"les deux pol sont dans redspol "<<endl; 02311 //cout<<invconv<Poly>(*iterS)<<endl; 02312 //cout<<"et"<<endl; 02313 //cout<<invconv<Poly>(*iterS2)<<endl; 02314 varmult(iterS,iterS2,var1,var2,b); 02315 //cout<<"les var mult "<<var1<<" "<<var2<<endl; 02316 res.ind=mon(zero); 02317 for(int i=0;i<iterS->size;i++) 02318 { 02319 //if(!Iszero(iterS->nf[i])) 02320 if(iterS->nf[i]!=zero) 02321 { 02322 int2mon(i,tmpmon); 02323 //cout<<"les mon red "<<(var1*tmpmon)<<endl; 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 //if(!Iszero(iterS2->nf[i])) 02331 if(iterS2->nf[i]!=zero) 02332 { 02333 int2mon(i,tmpmon); 02334 // cout<<"les mon red "<<(var1*tmpmon)<<endl; 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 //if(!Iszero(iterS->nf[i])) 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 //cout<<"je cheche le monome "<<(var1*tmpmon)<<" et var1 vaut " 02356 // <<var1<<endl; 02357 findcorresppol(var1*tmpmon,dump,stock); 02358 //cout<<"stock trouve "<<endl<<invconv<Poly>(stock)<<endl; 02359 //cout<<"stock.size "<<stock.size<<endl; 02360 res*stock.ind.GetCoeff(); 02361 my_plus(res,stock,iterS->nf[i]); 02362 } 02363 else 02364 { 02365 // cout<<"je rajoute a "<<var1*tmpmon<<" "<<iterS->nf[i]<<endl; 02366 res.nf[mon2int(var1*tmpmon)]+=iterS->nf[i]; 02367 } 02368 // cout<<"a ce tour de boucle res vaut"<<endl<<invconv<Poly>(res)<<endl; 02369 } 02370 } 02371 //cout<<"entre deux boucle res vaut"<<endl<<invconv<Poly>(res)<<endl; 02372 for(int i=0;i<iterS2->size;i++) 02373 { 02374 //if (!Iszero(iterS2->nf[i])) 02375 if(iterS2->nf[i]!=zero) 02376 { 02377 mon tmpmon; 02378 //cout<<"iterS2->size "<<iterS2->size<<endl; 02379 //cout<<" et i "<<i<<endl; 02380 int2mon(i,tmpmon); 02381 //cout<<"mon en cours "<<tmpmon<<" et Is in B "<< 02382 // IsinB(var2*tmpmon,b)<<endl; 02383 if(!IsinB(var2*tmpmon,b)) 02384 { 02385 pol stock; 02386 findcorresppol(var2*tmpmon,dump,stock); 02387 // cout<<"stock trouve "<<endl<<invconv<Poly>(stock)<<endl; 02388 res*stock.ind.GetCoeff(); 02389 my_plus(res,stock,(coeff)((coeff)(-1)*iterS2->nf[i])); 02390 } 02391 else 02392 { 02393 // int toto=mon2int(var2*tmpmon),tutu=mon2int(var2*tmpmon); 02394 //cout<<"res.size "<<res.size<<endl; 02395 //cout<<"et j'acced a "<<toto 02396 // <<" "<<tutu<<endl; 02397 res.nf[mon2int(var2*tmpmon)]-=iterS2->nf[i]; 02398 } 02399 } 02400 //cout<<"a ce tour de boucle res vaut"<<endl<<invconv<Poly>(res)<<endl; 02401 } 02402 if(!Ispolzero(res)) 02403 { 02404 // cout<<"un spol qui se reduiot pas a 0"<<endl; 02405 //for(int i=0;i<res.size;i++) 02406 // cout<<"les coeff du qui se reduit pas a 0 "<<res.nf[i]<<endl; 02407 // cout<<"invconv<Poly>"<<endl<<invconv<Poly>(res)<<endl; 02408 redspol.push_back(res); 02409 //break;//ca c pour pas faire 50 tours 02410 // //qd on cherche juste a extraire 1 seul sopl non 0 02411 } 02412 else 02413 { 02414 MAC_REV_FREE<coeff>(res.nf,res.size*sizeof(coeff)); 02415 // free(res.nf); 02416 } 02417 } 02418 //cout<<"en sortie redspol.size() "<<redspol.size()<<endl; 02419 }
void putingoodshape | ( | const typP & | P, | |
typPk & | workvect, | |||
const typMk & | tmpMk, | |||
typexceed & | exceed, | |||
typsize & | sizeex, | |||
const typdump & | dump, | |||
const Base & | b | |||
) | [inline] |
Definition at line 1402 of file corealgo.cc.
References int2mon(), Iszero(), member(), mon2int(), and proj().
Referenced by newPkMkMatrixof().
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 // cout<<"proj pol au debaut "<<projpol<<endl; 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 //cout<<"tobeproj avant push back "<<endl<<projpol<<endl; 01447 //cout<<"sizeexced pushbacke "<<sizeexceed<<endl; 01448 sizeex.push_back(sizeexceed); 01449 } 01450 //bon on a isole les monomes a projeter 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 // cout<<"*itersize "<<(*itersize)<<" et tmpMk.size() "<<tmpMk.size()<<endl; 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 // cout<<"rajoute "<<*iterpol<<" a la pos "<<*itersize<<endl; 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 //cout<<"relecture itersize "<<*itersize<<endl; 01499 } 01500 01501 } 01502 }
void ReduceSpol | ( | typPk & | S, | |
const typdump & | dump, | |||
typPk & | redspol, | |||
const Base & | b | |||
) | [inline] |
Definition at line 2217 of file corealgo.cc.
References halfred(), my_plus(), and varmult().
Referenced by algo().
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 //maintenant on a mis en place la structure de Redspol 02259 //reste plus qu'a calculer les bons et a reduire tout ca!! 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 // cout<<"ref.size "<<ref.size<<endl; 02269 //cout<<"ref en entier"<<endl<<invconv<Poly>(ref)<<endl; 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 // cout<<"un redspol pas 0"<<endl<<invconv<Poly>(redcur)<<endl; 02279 // for(int i=0;i<redcur.size;i++) 02280 // cout<<int2mon_[i]<<" "; 02281 // cout<<endl; 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 }
void Setnbvars | ( | const typP & | tmpPk, | |
Base & | b | |||
) | [inline] |
Definition at line 204 of file corealgo.cc.
References Base< predicat >::nbvars.
Referenced by init_algo().
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 }
typPk Spolordsup | ( | typPk | Pk, | |
const Base & | b | |||
) | [inline] |
Definition at line 147 of file corealgo.cc.
References compute_ppcm(), and goodspol().
Referenced by algo().
00153 { 00154 typedef typename typPk::value_type::monom_t mon; 00155 //typedef typename typ::order_t O; 00156 #ifdef experiment 00157 typename typPk::value_type tmp; 00158 #endif 00159 map<mon,int> ppcm; 00160 typPk res; 00161 int maxdeg; 00162 //cout<<"compute ppcm"<<endl; 00163 maxdeg=compute_ppcm(ppcm,b); 00164 //cout<<"test goodspol"<<endl; 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 //cout<<"goospol "<<iter1->ind<<" "<<iter2->ind<<endl; 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 }
void stab | ( | typPk & | Pk | ) | [inline] |
Definition at line 18 of file corealgo.cc.
References Iszero().
Referenced by init_algo().
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 }
Definition at line 2064 of file corealgo.cc.
References Base< predicat >::nbvar().
Referenced by OLD_ReduceSpol(), and ReduceSpol().