11 #define LEVELSELECT 1e-6
16 template<
typename pol_t>
21 typedef typename pol_t::monom_t
mon;
35 template<
typename typPk_t,
typename mon>
39 typedef typename typPk::value_type
pol;
46 template<
typename typPk_t,
typename mon>
57 template <
typename typcomp,
typename workspace,
typename typserv>
61 template<
typename typPk,
typename Base>
71 typedef typename typPk::value_type::monom_t
mon;
72 for (
auto &iter : tmpPk)
78 mon *candidate_ancestor=NULL;
80 for(
auto &iterbase : b)
82 mon *compancestor=NULL;
84 for(
int i=0;
i<iterbase.taille1;
i++)
89 cout<<
"je break ici"<<endl;
95 for(
int i=0;
i<iterbase.taille2;
i++)
100 candidate_ancestor=NULL;
102 cout<<
"je break ici"<<endl;
109 cout<<
"g trouvé ici un gus "<<iterbase.refuse[
i]<<endl;
111 compancestor=&iterbase.refuse[
i];
118 cout<<
"je passe ici compancestor non null"<<endl;
120 candidate_ancestor=compancestor;
123 iter.ancestor=candidate_ancestor;
126 for(
auto &&iter : tmpPk)
128 cout<<
"ancestor ---- "<<iter.ind<<endl;
130 cout<<
"\t\t -> "<<*(iter.ancestor)<<endl;
132 cout<<
"\e[31mcaca\e(B\e[m"<<endl;
137 template<
typename typgraph,
typename typPk,
138 typename typexceed,
typename typsizeexceed,
typename typmon2face,
140 void makegraph(typgraph & G,
const typPk tmpPk,
const typexceed &exceed,
141 const typsizeexceed & sizeexceed,
142 typmon2face &mon2face,
148 typedef typename typPk::value_type::monom_t
mon;
152 map<typename mon::rep_t,int> root2face;
156 for(
auto iterpk=tmpPk.begin();iterpk!=tmpPk.end();iterpk++)
158 mon root=*(iterpk->ancestor);
172 if(iterpk->ancestor->GetDegree(
i)==root.
GetDegree(
i))
177 if(root2face.count(root.
rep)==0)
178 root2face[root.
rep]=numface++;
179 mon2face[iterpk->ind.rep]=root2face[root.
rep];
182 cout<<
"roottoface"<<endl;
183 for(
auto &
i :root2face)
184 cout<<
i.first<<
" --- "<<
i.second<<endl;
185 cout<<
"mon2face"<<endl;
186 for(
auto &
i :mon2face)
187 cout<<
i.first<<
" --- "<<
i.second<<endl;
198 auto iterexceed=exceed.begin();
199 auto itersize=sizeexceed.begin();
200 auto iterpk=tmpPk.begin();
201 for(;iterpk!=tmpPk.end();iterpk++,iterexceed++,itersize++)
204 for(
int i=0;
i<*itersize;
i++)
205 G[mon2face[iterpk->ind.rep]][mon2face[(*iterexceed)[
i].rep]]=1;
211 template<
typename typstack,
typename typgraph,
typename typvec>
213 int &
index, typvec &lowlink,
int startindex)
221 for(
int j=0;
j<G[
i].size();
j++)
230 lowlink[
i]=
min(lowlink[i],lowlink[
j]);
234 if(vec[
j]>=startindex)
235 lowlink[
i]=
min(lowlink[i], vec[
j]);
243 if(lowlink[i]==vec[i])
262 template<
typename typgraph,
typename typvec>
309 vector<int> lowlink(G.size(),-1);
312 for(
int i=0;
i<G.size();
i++)
323 vector<int> translator(G.size(),-1);
325 for(
int i=0;
i<vec.size();
i++)
327 if(translator[vec[
i]]==-1)
328 translator[vec[
i]]=numcomp++;
329 vec[
i]=translator[vec[
i]];
331 copy(vec.begin(),vec.end(),ostream_iterator<int>(cout,
" "));
337 void reconstruct_pr_pc(
int *&pr,
int *&pc,
int *tmppr,
int *tmppc,
int sizetmp,
int indexinside);
340 template<
typename typMat,
typename typPk,
typename typMk,
typename typexceed,
341 typename typsizeexceed,
typename typP>
343 typMk &tmpMk, typexceed &exceed,
344 typsizeexceed &sizeexceed, typP &P)
346 typedef typename typP::value_type::order_t ord;
347 typedef typename typPk::value_type
pol;
349 typedef typename typP::value_type polyalp;
352 map<mon,int,ord> mapint;
353 typename typMk::iterator itermk=tmpMk.begin();
354 typename typPk::iterator iterpk=tmpPk.begin();
356 typename typexceed::iterator iterex=exceed.begin();
357 typename typsizeexceed::iterator itersize=sizeexceed.begin();
359 typsizeexceed tmpsizeex;
362 mat.nrow=tmpPk.size();
363 mat.ncol=tmpMk.size();
364 ncol=(
int*)calloc(mat.ncol,
sizeof(
int));
368 for(
int i=0;itermk!=tmpMk.end();
i++,itermk++)
372 iterpk=tmpPk.begin();
374 for(;iterpk!=tmpPk.end();iterpk++,iterex++,itersize++,line_num++)
381 for(
int i=0;*itersize>
i;i++)
384 if (mapint.count((*iterex)[i]))
386 ++ncol[mapint[(*iterex)[
i]]];
397 tmpsizeex.push_back(tmp);
404 cout<<
"nnz of matrix "<<nnz<<endl;
406 void * toto=MAC_REV_MALLOC<coeff>(nnz*
sizeof(
typename typMat::coeff_t));
407 if (mat.nzval!=NULL) MAC_REV_FREE<typename typMat::coeff_t>
409 *
sizeof(
typename typMat::coeff_t));
413 if(mat.rowind!=NULL)
free(mat.rowind);
414 mat.rowind=(
int*)
malloc(nnz*
sizeof(
int));
415 if(mat.colptr!=NULL)
free(mat.colptr);
416 mat.colptr=(
int*)
malloc((mat.ncol+1)*
sizeof(int));
417 cout<<
"matrix of size "<<mat.nrow<<
"x"<<mat.ncol<<endl;
419 typename typMat::coeff_t* nzval=(
typename typMat::coeff_t*)mat.nzval;
420 int *rowind=mat.rowind;
421 int *colptr=mat.colptr;
424 for(
int i=0;
i<mat.ncol-1;
i++)
426 colptr[
i+1]=colptr[
i]+ncol[
i];
428 colptr[mat.ncol]=mat.nnz;
435 itermk=tmpMk.begin();
436 iterpk=tmpPk.begin();
437 iterex=exceed.begin();
438 itersize=sizeexceed.begin();
441 auto itertmp=tmpsizeex.begin();
443 for(;(iterpk!=tmpPk.end());iterpk++,iterex++,itersize++,line_num++,itertmp++)
447 mon *tmpex=(
mon*)MAC_REV_MALLOC<mon>(*itertmp*
sizeof(
mon));
450 for(
int i=0;*itersize>
i;i++)
453 if(mapint.count((*iterex)[i]))
456 const coeff stock=(*iterex)[
i].
GetCoeff();
457 (*iterex)[
i].SetCoeff(1);
458 const unsigned int tmpplusex=mapint[(*iterex)[
i]]+1;
459 const unsigned int tmpex=mapint[(*iterex)[
i]];
460 nzval[colptr[tmpplusex]-ncol[tmpex]]
462 rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
468 tmpex[ktmp++]=(*iterex)[
i];
473 MAC_REV_FREE<mon>(*iterex,*itersize*
sizeof(
mon));
486 for(
typename typPk::iterator iterpk=tmpPk.begin()
487 ;iterpk!=tmpPk.end();iterpk++)
488 iterpk->ind.SetCoeff(1);
492 template<
typename typMat,
typename typPk,
typename typP,
493 typename typMk,
typename Base,
typename typdump,
typename typexceed,
496 int &
k,
Base &b, typdump &dump,typexceed &exceed_ret,
500 typedef typename typMk::value_type
mon;
501 typedef typename typP::value_type::order_t ord;
502 typedef typename typPk::value_type
pol;
504 typedef typename typP::value_type polyalp;
508 map<typename mon::rep_t,int> mon2face, mon2col;
509 vector<vector<int> > G;
511 typPk tmpPk,workvect,convcrochet;
514 vector<mon *> exceed,exceedcrochet;
515 list<int> sizeexceed,sizeexceedcrochet;
516 int nbproj=0,flagdoplus=1;
517 int nbcompo=0,*pr,*pc;
524 mat.destroystore();mat.ncol=0;mat.nrow=0;mat.nnz=0;
525 exceed_ret.erase(exceed_ret.begin(),exceed_ret.end());
526 sizeexceed_ret.erase(sizeexceed_ret.begin(),sizeexceed_ret.end());
528 cerr<<
"k on entering newpkmkmatrixof "<<k<<endl;
534 Mk, dump, b, flagdoplus, k, recall, exceed, sizeexceed, serv);
535 cout<<
"en sortie tmpPk.size "<<tmpPk.size()<<endl;
539 cout<<
"newpol"<<endl;
540 compute_newpol(Pk,tmpPk,tmpMk,dump,exceed,sizeexceed, b, k, recall, w,serv);
541 cout<<
"fin newpol"<<endl;
551 conv_merge(convcrochet,ttmpP,exceedcrochet,sizeexceedcrochet,b,serv);
552 crochet.poly.resize(convcrochet.size());
553 crochet.sizeexceed.resize(convcrochet.size());
554 copy(convcrochet.begin(),convcrochet.end(),crochet.poly.begin());
555 crochet.exceed=exceedcrochet;
556 copy(sizeexceedcrochet.begin(),sizeexceedcrochet.end(),crochet.sizeexceed.begin());
558 cout<<
"crochet "<<endl;
559 for(
int i=0;
i<crochet.poly.size();
i++)
561 cout<<
"ind "<<crochet.poly[
i].ind<<endl;
562 copy(crochet.exceed[
i],crochet.exceed[
i]+crochet.sizeexceed[
i],ostream_iterator<mon>(cout,
" + "));
563 cout<<invconv<Poly>(crochet.poly[
i],serv)<<endl;
568 auto itersizeexceed=sizeexceed.begin();
582 makegraph(G, tmpPk, exceed, sizeexceed, mon2face,b);
585 vec.resize(G.size(),-1);
587 cout<<
"le graph"<<endl;
595 cout<<
"je rentre ds tarjan "<<G.size()<<
" "<<tmpMk.size()<<endl;
597 pr=(
int *)
malloc(tmpPk.size()*
sizeof(int));
598 pc=(
int *)
malloc(tmpMk.size()*
sizeof(int));
599 tmpMk.erase(tmpMk.begin(),tmpMk.end());
602 for_each(vec.begin(),vec.end(),[&nbcompo](
int i){nbcompo=(nbcompo<
i?
i:nbcompo);});
604 for(
int i=0;
i<=nbcompo;
i++)
607 list<mon*> tmpexceed;
608 list<int> tmpsizeexceed;
611 auto itersizeexceed=sizeexceed.begin();
612 auto iterexceed=exceed.begin();
614 for_each(tmpPk.begin(),tmpPk.end(),
616 (
typename typPk::value_type &iter)
619 cout<<
"mon2face "<<iter.ind.rep<<
" "<<mon2face[iter.ind.rep]<<endl;
620 cout<<
"vec[mon2face[iter.ind.rep]] "<<vec[mon2face[iter.ind.rep]]<<
623 if(vec[mon2face[iter.ind.rep]]==
i)
626 tmpcomp.poly.push_back(iter);
629 for(
int i=0;
i<*itersizeexceed;
i++)
630 cout<<
" "<<(*iterexceed)[
i];
633 tmpcomp.sizeexceed.push_back(*itersizeexceed);
636 tmpcomp.exceed.push_back(*iterexceed);
644 listcomp.push_back(tmpcomp);
647 for(
auto iter=listcomp.begin();iter!=listcomp.end();iter++)
649 for(
auto &m : iter->poly)
650 cout<<
"ind compo "<<m.ind<<endl;
651 cout<<
"----------------------------------------------------------"<<endl;
659 cout<<
"nb total de compo dans la loiste "<<listcomp.size()<<endl;
660 for(
auto iter=listcomp.begin();iter!=listcomp.end();iter++,numcompo++)
667 cout<<
"pour la composante "<<prout++<<endl;
669 auto toto=iter->sizeexceed.begin();
670 typename vector<pol>::iterator tutu=iter->poly.begin();
671 for(
auto m : iter->exceed)
673 cout<<
"sizeexceed ici "<<*toto<<endl;
674 copy(m,m+*(toto++),ostream_iterator<mon>(cout,
" + ")),cout<<endl;;
675 cout<<tutu->ind<<endl;
677 copy(tutu->nf,tutu->nf+tutu->size,ostream_iterator<coeff>(cout,
" ")),cout<<endl;
678 cout<<invconv<Poly>(*(tutu++),serv)<<endl;
679 cout<<
"------------------------------------ "<<endl;
683 for(
auto &&iterind : iter->poly)
685 verytmpMk.push_back(iterind.ind);
689 iter->exceed, iter->sizeexceed, P);
692 cout<<
"matrix of comp"<<endl;
694 cout<<
"\e[32mpour la composante \e[37m"<<prout<<endl;
696 auto toto=iter->sizeexceed.begin();
697 typename vector<pol>::iterator tutu=iter->poly.begin();
698 for(
auto m : iter->exceed)
700 copy(m,m+*(toto++),ostream_iterator<mon>(cout,
" - ")),cout<<endl;;
701 cout<<tutu->ind<<endl;
702 cout<<
"size tutu "<<tutu->size<<endl;
704 copy(tutu->nf,tutu->nf+tutu->size,ostream_iterator<coeff>(cout,
" "));
705 cout<<invconv<Poly>(*(tutu++),serv)<<endl;
706 cout<<
"------------------------------------ "<<endl;
711 cout<<
"la petite matrice"<<endl;
729 Solve(tmpmat,L,*iter,&tmppr,&tmppc,verytmpMk,w,serv);
731 cout<<
"\e[31mApres SOLVE \e[37m"<<prout<<endl;
733 auto toto=iter->sizeexceed.begin();
734 typename vector<pol>::iterator tutu=iter->poly.begin();
735 for(
auto m : iter->exceed)
737 copy(m,m+*(toto++),ostream_iterator<mon>(cout,
" - ")),cout<<endl;;
738 cout<<tutu->ind<<endl;
739 cout<<invconv<Poly>(*(tutu++),serv)<<endl;
748 for(
auto &m :verytmpMk)
759 typename typMk::iterator itermon=verytmpMk.begin();
761 for(
auto iter_in_poly=iter->poly.begin();
762 itermon!=verytmpMk.end();iter_in_poly++,itermon++,j++)
764 cout<<
" dans verytmp "<<*itermon<<
765 invconv<typename typP::value_type>(*iter_in_poly,serv)<<endl;
770 iter_in_poly->ind=*itermon;
771 iter_in_poly->ind.SetCoeff(1);
777 for(
int i=tmpmat.colptr[j];
i<tmpmat.colptr[j+1];
i++)
778 if(!(((coeff*)tmpmat.nzval)[
i]==0))
783 coeff tmpcoeff=((coeff*)tmpmat.nzval)[
i];
787 if(!
Iszero(tmpmat(tmpmat.rowind[
i],tmpmat.rowind[
i])))
788 tmpcoeff/=tmpmat(tmpmat.rowind[
i],tmpmat.rowind[
i]);
791 iter->exceed[tmpmat.rowind[
i]]=(mon*)
792 MAC_REV_REALLOC<mon>(iter->exceed[tmpmat.rowind[
i]],
793 iter->sizeexceed[tmpmat.rowind[
i]]*
sizeof(mon),
794 (iter->sizeexceed[tmpmat.rowind[
i]]+1)*
sizeof(mon));
796 iter->exceed[tmpmat.rowind[
i]][iter->sizeexceed[tmpmat.rowind[
i]]]=tmpmon;
797 iter->sizeexceed[tmpmat.rowind[
i]]++;
799 iter_in_poly->ind=
mon(0);
806 cout<<
"apres solve les poly de la compo"<<endl;
807 for(
int i=0;
i<iter->poly.size();
i++)
809 cout<<
"ind "<<iter->poly[
i].ind<<endl;
810 copy(iter->exceed[
i],iter->exceed[
i]+iter->sizeexceed[
i],
811 ostream_iterator<mon>(cout,
" + "));cout<<endl;
812 cout<<invconv<typename typP::value_type>(iter->poly[
i],serv)<<endl;
813 cout<<
"--------------------********************"<<endl;
815 for(
auto i : iter->poly)
816 cout<<
"ind "<<
i.ind<<endl;
817 copy(iter->sizeexceed.begin(),iter->sizeexceed.end(),ostream_iterator<int>(cout,
" "));
818 cout<<
"iciiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"<<endl;
822 cout<<
"update "<<endl;
825 cout<<
"la map"<<endl;
826 map<typename mon::rep_t,resmul<typename compo::typPk::value_type> > mon2pol;
828 auto iterexceed=iter->exceed.begin();
829 auto itersizeexceed=iter->sizeexceed.begin();
830 auto iterpoly=iter->poly.begin();
832 for(
auto iterpoly=iter->poly.begin();iterpoly!=iter->poly.end();
833 iterpoly++,iterexceed++,itersizeexceed++,i++)
839 if(!(tmpmat(i,i)==0)) mon2pol[iterpoly->ind.rep]=tmp;
844 cout<<
"le graphe"<<endl;
849 vector<char> toupdate(nbcompo+1,0);
852 for(
int i_vec=0;i_vec<G.size();i_vec++)
854 if(vec[i_vec]==numcompo)
858 for(
int j=0;
j<G.size();
j++)
863 if(G[
j][i_vec] && vec[
j]!=numcompo)
868 for(
int j_graph=0;j_graph<G.size();j_graph++)
869 G[
j][j_graph]|=G[i_vec][j_graph];
878 cout<<
"calcul poly"<<endl;
879 for(
auto itercomp=listcomp.begin();itercomp!=listcomp.end();
880 itercomp++,indexcompo++)
882 if(toupdate[indexcompo])
885 cout<<
"la compo a updater avant"<<endl;
886 for(
int i=0;
i<itercomp->poly.size();
i++)
888 cout<<
"ind "<<itercomp->poly[
i].ind<<endl;
889 copy(itercomp->exceed[
i],itercomp->exceed[
i]+itercomp->sizeexceed[
i],
890 ostream_iterator<mon>(cout,
" + "));cout<<endl;
891 cout<<invconv<typename typP::value_type>(itercomp->poly[
i],serv)<<endl;
892 cout<<
"--------------------********************"<<endl;
898 cout<<
"la compo apres update"<<endl;
899 for(
int i=0;
i<itercomp->poly.size();
i++)
901 cout<<
"ind "<<itercomp->poly[
i].ind<<endl;
902 copy(itercomp->exceed[
i],itercomp->exceed[
i]+itercomp->sizeexceed[
i],
903 ostream_iterator<mon>(cout,
" + "));cout<<endl;
904 cout<<invconv<typename typP::value_type>(itercomp->poly[
i],serv)<<endl;
905 cout<<
"--------------------********************"<<endl;
913 cout<<
"fin des updates "<<endl;
915 cout<<
"apres update du crochet "<<endl;
916 for(
int i=0;
i<crochet.poly.size();
i++)
918 cout<<
"ind "<<crochet.poly[
i].ind<<endl;
919 copy(crochet.exceed[
i],crochet.exceed[
i]+crochet.sizeexceed[
i],ostream_iterator<mon>(cout,
" + "));
920 cout<<invconv<Poly>(crochet.poly[
i],serv)<<endl;
927 cout<<
"indexinside "<<indexinside<<endl;
930 indexinside+=verytmpMk.size();
941 cout<<
"les pol apres process newpkmk"<<endl;
942 for(
auto &
c : listcomp)
943 for(
int i=0;
i<
c.poly.size();
i++)
945 cout<<
"ind "<<
c.poly[
i].ind<<endl;
946 copy(
c.exceed[
i],
c.exceed[
i]+
c.sizeexceed[
i],
947 ostream_iterator<mon>(cout,
" + "));cout<<endl;
948 cout<<invconv<typename typP::value_type>(
c.poly[
i],serv)<<endl;
949 cout<<
"--------------------********************------------"<<endl;
953 for(
auto c : listcomp)
956 verytmpPk.push_back(p);
957 for(
auto &p:
c.exceed)
958 exceed_ret.push_back(p);
959 for(
auto &p:
c.sizeexceed)
962 sizeexceed_ret.push_back(p);
966 cout<<
"apres reconstruction des Pk "<<endl;
968 copy(sizeexceed_ret.begin(),sizeexceed_ret.end(),ostream_iterator<int>(cout,
" **--** "));cout<<endl;
972 for(
auto &p : crochet.poly)
975 verytmpPk.push_back(p);
977 for(
auto &p : crochet.exceed)
978 exceed_ret.push_back(p);
979 for(
auto &p : crochet.sizeexceed)
980 sizeexceed_ret.push_back(p);
987 mon2col[m.rep]=indexmat++;
990 cout<<
"avant updatematrix "<<endl;
992 copy(sizeexceed_ret.begin(),sizeexceed_ret.end(),ostream_iterator<int>(cout,
" **--** "));cout<<endl;
998 for(
auto c : listcomp)
1001 indexmat+=
c.poly.size();
1004 cout<<
"apres updatematrix"<<endl;
1010 mat.nrow+=crochet.poly.size();
1012 cout<<
"verytmp"<<endl;
1013 for(
auto &p :verytmpPk)
1014 cout<<invconv<typename typP::value_type>(p,serv)<<endl;
1023 template<
typename typmat,
typename typlistcomp,
typename typmap>
1026 typedef typename typmat::coeff_t coeff;
1027 int *shiftcol=
new int[m.ncol], *addcol=
new int[m.ncol];
1031 cout<<
"en entree"<<endl;
1032 for(
int i=0;
i<m.nnz;
i++)
1033 cout<<((coeff*)m.nzval)[
i]<<
"/"<<
i<<
" ";
1035 for(
int i=0;
i<m.nnz;
i++)
1036 cout<<m.rowind[
i]<<
"/"<<
i<<
" ";
1038 cout<<
"----------------------------------------"<<endl;
1040 for(
int i=0;
i<m.ncol;
i++)
1043 for(
auto c : listcomp)
1045 auto iterexceed=
c.exceed.begin();
1046 auto itersizeexceed=
c.sizeexceed.begin();
1047 auto iterpoly=
c.poly.begin();
1048 for(;iterexceed!=
c.exceed.end();iterexceed++,itersizeexceed++, iterpoly++)
1051 for(
int i=0;
i<*itersizeexceed;
i++)
1052 if (!
Iszero((*iterexceed)[
i].GetCoeff()))
1054 shiftcol[mon2col[(*iterexceed)[
i].rep]]++;
1062 m.nzval=MAC_REV_REALLOC<coeff>(m.nzval,m.nnz*
sizeof(coeff),
1063 (m.nnz+compnnz)*
sizeof(coeff));
1064 m.rowind=(
int*)MAC_REV_REALLOC<int>((
int*)m.rowind,m.nnz*
sizeof(int),
1065 (m.nnz+compnnz)*
sizeof(int));
1069 for(
int i=0;
i<m.ncol;
i++)
1070 addcol[
i]=shiftcol[
i];
1071 for(
int i=1;
i<m.ncol;
i++)
1072 shiftcol[
i]+=shiftcol[
i-1];
1074 for(
int i=m.ncol-1;
i>0;
i--)
1076 for(
int j=m.colptr[
i+1]-1;
j>=m.colptr[
i];
j--)
1079 ((coeff*)m.nzval)[
j+shiftcol[
i-1]]=((coeff*)m.nzval)[
j];
1080 m.rowind[
j+shiftcol[
i-1]]=m.rowind[
j];
1085 for(
auto c : listcomp)
1087 auto iterexceed=
c.exceed.begin();
1088 auto itersizeexceed=
c.sizeexceed.begin();
1089 auto iterpoly=
c.poly.begin();
1090 for(;iterexceed!=
c.exceed.end();iterexceed++,itersizeexceed++, iterpoly++,tmpligne++)
1092 for(
int i=0;
i<*itersizeexceed;
i++)
1094 if(!
Iszero((*iterexceed)[
i].GetCoeff()))
1096 int numcol=mon2col[(*iterexceed)[
i].rep];
1097 m.rowind[m.colptr[numcol+1]+shiftcol[numcol]-1]=tmpligne;
1098 ((coeff*)m.nzval)[m.colptr[numcol+1]+shiftcol[numcol]-- -1]=(*iterexceed)[
i].GetCoeff();
1108 cout<<
"compnnz "<<compnnz<<endl;
1109 for(
int i=0;
i<m.nnz;
i++)
1110 cout<<((coeff*)m.nzval)[
i]<<
"/"<<
i<<
" ";
1112 for(
int i=0;
i<m.nnz;
i++)
1113 cout<<m.rowind[
i]<<
"/"<<
i<<
" ";
1116 for(
int i=1;
i<m.ncol;
i++)
1117 addcol[
i]+=addcol[
i-1];
1118 for(
int i=1;
i<=m.ncol;
i++)
1119 m.colptr[
i]+=addcol[
i-1];
1124 template<
typename typmat,
typename typcomp,
typename typmap>
1130 typedef typename typmat::coeff_t coeff;
1131 auto iterexceed=c.exceed.begin();
1132 auto itersizeexceed=c.sizeexceed.begin();
1133 auto iterpoly=c.poly.begin();
1135 for(;iterexceed!=c.exceed.end();iterexceed++,itersizeexceed++, iterpoly++,numligne++)
1138 m.nzval=MAC_REV_REALLOC<coeff>(m.nzval,m.nnz*
sizeof(coeff),
1139 (m.nnz+*itersizeexceed)*
sizeof(coeff));
1140 m.rowind=(
int*)MAC_REV_REALLOC<int>((
void*)m.rowind,m.nnz*
sizeof(int),
1141 (m.nnz+*itersizeexceed)*
sizeof(int));
1142 for(
int i=0;
i<*itersizeexceed;
i++)
1145 if((*iterexceed)[
i].rep!=iterpoly->ind.rep)
1148 for(
int j=m.nnz;
j>=m.colptr[mon2col[(*iterexceed)[
i].rep]+1];
j--)
1150 ((coeff*)m.nzval)[
j]=((coeff*)m.nzval)[
j-1];
1151 m.rowind[
j]=m.rowind[
j-1];
1155 m.rowind[m.colptr[mon2col[(*iterexceed)[
i].rep]+1]]=indexmat+numligne;
1159 ((coeff*)m.nzval)[m.colptr[mon2col[(*iterexceed)[
i].rep]+1]]=(*iterexceed)[
i].GetCoeff();
1161 cout<<
"G ecrit "<<(*iterexceed)[
i].GetCoeff()<<endl;
1162 cout<<
"en colonne "<<mon2col[(*iterexceed)[
i].rep]<<
" ligne "<<m.colptr[mon2col[(*iterexceed)[
i].rep]+1]<<
" "<<indexmat+numligne<<endl;
1164 for(
int j=mon2col[(*iterexceed)[
i].rep]+1;
j<=m.ncol;
j++)
1180 template <
typename typcomp,
typename typserv>
1181 void update_pol(typcomp &comp_to_update,typcomp &updating_comp, typserv &serv)
1183 typedef typename typcomp::typPk typPk;
1184 typedef typename typserv::monom_t
mon;
1188 if(comp_to_update==updating_comp)
1191 auto iterexceed=updating_comp.exceed.begin();
1192 auto itersizeexceed=updating_comp.sizeexceed.begin();
1193 auto iterpoly=updating_comp.poly.begin();
1197 auto myitersize=updating_comp.sizeexceed.begin();
1199 for(
auto &
i : updating_comp.poly)
1200 cout<<
"ind qui update "<<
i.ind<<
" "<<*myitersize++<<endl;
1202 myitersize=comp_to_update.sizeexceed.begin();
1204 for(
auto &
i : comp_to_update.poly)
1205 cout<<
"ind a up "<<
i.ind<<
" "<<*myitersize++<<endl;
1208 map<typename mon::rep_t,resmul<typename typPk::value_type> > mon2pol;
1209 for(;iterpoly!=updating_comp.poly.end();iterpoly++,iterexceed++,itersizeexceed++)
1215 mon2pol[iterpoly->ind.rep]=tmp;
1219 iterexceed=comp_to_update.
exceed.begin();
1220 itersizeexceed=comp_to_update.sizeexceed.begin();
1221 for(iterpoly=comp_to_update.poly.begin();
1222 iterpoly!=comp_to_update.poly.end();
1223 iterpoly++,iterexceed++,itersizeexceed++)
1228 map<typename mon::rep_t,COEFF> exceedmap;
1229 map<typename mon::rep_t,COEFF> nfmap;
1232 int newsizenfind=iterpoly->sizenf;
1236 for(
int i=0;
i<iterpoly->sizenf;
i++)
1239 for(
int j=0;
j<8;
j++)
1240 if(iterpoly->nfind[
i]>>
j&1)
1243 serv.int2mon(8*
i+
j,tmp);
1244 nfmap[tmp.
rep]=iterpoly->nf[pos_nf++];
1247 for(
int i=0;
i<*itersizeexceed;
i++)
1251 if(!mon2pol.count((*iterexceed)[
i].rep))
1252 exceedmap[(*iterexceed)[
i].rep]=
1253 (*iterexceed)[
i].GetCoeff();
1255 for(
int i=0;
i<*itersizeexceed;
i++)
1257 if(mon2pol.count((*iterexceed)[
i].rep))
1264 if(newsizenfind<tmpresmul.
poly.sizenf)
1265 newsizenfind=tmpresmul.
poly.sizenf;
1277 exceedmap[tmpresmul.
exceed[
j].rep]-=
1278 tmpresmul.
exceed[
j].GetCoeff()*(*iterexceed)[
i].GetCoeff();
1285 for(
int ii=0;ii<tmpresmul.
poly.sizenf;ii++)
1286 if(tmpresmul.
poly.nfind)
1288 for(
int j=0;
j<8;
j++)
1289 if(tmpresmul.
poly.nfind[ii]>>
j&1)
1294 serv.int2mon(8*ii+
j,tmp);
1296 cout<<
"mon mis a jour "<<tmp<<
" "<<tmpresmul.
poly.
nf[pos_nfiter]<<endl;
1297 cout<<
"nfmap "<<nfmap[tmp.
rep]<<endl;
1298 cout<<tmpresmul.
poly.
nf[pos_nfiter]<<endl;
1299 cout<<(*iterexceed)[
i].GetCoeff()<<endl;
1300 cout<<coeff_t(0)-tmpresmul.
poly.
nf[pos_nfiter]
1301 *(*iterexceed)[
i].GetCoeff()<<endl;
1302 cout<<nfmap[tmp.
rep]-tmpresmul.
poly.
nf[pos_nfiter]
1303 *(*iterexceed)[
i].GetCoeff()<<endl;
1305 nfmap[tmp.
rep]-=tmpresmul.
poly.
nf[pos_nfiter]
1306 *(*iterexceed)[
i].GetCoeff();
1313 cout<<
"exceed apres"<<endl;
1314 for(
auto &i : exceedmap)
1315 cout<<i.first<<
" "<<i.second<<
" ";
1317 cout<<
"nf apres"<<endl;
1318 for(
auto &i : nfmap)
1319 cout<<i.first<<
" "<<i.second<<
" ";
1325 cout<<
"nfmap.size() "<<nfmap.size()<<endl;
1326 cout<<
"newsizenfind "<<newsizenfind<<
" "<<(
void*)iterpoly->nfind<<endl;
1328 *iterexceed=(mon*)MAC_REV_REALLOC<mon>(*iterexceed,*itersizeexceed*
sizeof(
mon)
1329 ,exceedmap.size()*
sizeof(
mon));
1330 iterpoly->nfind=(
unsigned char *)realloc(iterpoly->nfind,newsizenfind);
1331 if(iterpoly->size != nfmap.size())
1332 iterpoly->nf=(coeff_t*)MAC_REV_REALLOC<coeff_t>(iterpoly->nf,
1333 iterpoly->size*
sizeof(coeff_t),
1334 nfmap.size()*
sizeof(coeff_t));
1335 for(
int k=0;k<newsizenfind;k++)
1336 iterpoly->nfind[k]=0;
1337 for(
auto iter : nfmap)
1341 int place=serv.mon2int(m);
1342 iterpoly->nfind[place/8]|=(1<<(place%8));
1345 for(
int k=0;k<newsizenfind;k++)
1347 if(iterpoly->nfind[k])
1349 for(
int kk=0;kk<8;kk++)
1350 if((iterpoly->nfind[k]>>kk)&1)
1353 serv.int2mon(8*k+kk,m);
1354 iterpoly->nf[posnf++]=nfmap[m.
rep];
1358 iterpoly->size=nfmap.size();
1359 iterpoly->sizenf=newsizenfind;
1360 for(
auto iter : exceedmap)
1363 tmpmon.
rep=iter.first;
1364 tmpmon.
coeff=iter.second;
1365 (*iterexceed)[k++]=tmpmon;
1367 *itersizeexceed=exceedmap.size();
1371 template <
typename typcomp,
typename typserv>
1375 update_pol(comp_to_update,updating_comp,w,serv);
1378 template <
typename typcomp,
typename typwork,
typename typserv>
1379 void update_pol(typcomp &comp_to_update,typcomp &updating_comp, typwork &w,
1382 typedef typename typcomp::typPk typPk;
1383 typedef typename typserv::monom_t
mon;
1387 if(comp_to_update==updating_comp)
1390 auto iterexceed=updating_comp.exceed.begin();
1391 auto itersizeexceed=updating_comp.sizeexceed.begin();
1392 auto iterpoly=updating_comp.poly.begin();
1396 auto myitersize=updating_comp.sizeexceed.begin();
1398 for(
auto &
i : updating_comp.poly)
1399 cout<<
"ind qui update "<<
i.ind<<
" "<<*myitersize++<<endl;
1401 myitersize=comp_to_update.sizeexceed.begin();
1403 for(
auto &
i : comp_to_update.poly)
1404 cout<<
"ind a up "<<
i.ind<<
" "<<*myitersize++<<endl;
1407 map<typename mon::rep_t,resmul<typename typPk::value_type> > mon2pol;
1408 for(;iterpoly!=updating_comp.poly.end();iterpoly++,iterexceed++,itersizeexceed++)
1414 mon2pol[iterpoly->ind.rep]=tmp;
1418 iterexceed=comp_to_update.
exceed.begin();
1419 itersizeexceed=comp_to_update.sizeexceed.begin();
1420 for(iterpoly=comp_to_update.poly.begin();
1421 iterpoly!=comp_to_update.poly.end();
1422 iterpoly++,iterexceed++,itersizeexceed++)
1427 map<typename mon::rep_t,COEFF> exceedmap;
1428 map<typename mon::rep_t,COEFF> nfmap;
1431 int newsizenfind=iterpoly->sizenf;
1435 for(
int i=0;
i<iterpoly->sizenf;
i++)
1438 w.tabnf[
i]=iterpoly->nfind[
i];
1439 tabfun1[w.tabnf[
i]](w.tabcoeff+(8*
i),iterpoly->nf+pos_nf);
1440 pos_nf+=
nbbits[iterpoly->nfind[
i]];
1442 for(
int i=0;
i<*itersizeexceed;
i++)
1446 if(!mon2pol.count((*iterexceed)[
i].rep))
1447 exceedmap[(*iterexceed)[
i].rep]=
1448 (*iterexceed)[
i].GetCoeff();
1450 for(
int i=0;
i<*itersizeexceed;
i++)
1452 if(mon2pol.count((*iterexceed)[
i].rep))
1457 if(newsizenfind<tmpresmul.
poly.sizenf)
1458 newsizenfind=tmpresmul.
poly.sizenf;
1461 exceedmap[tmpresmul.
exceed[
j].rep]-=
1462 tmpresmul.
exceed[
j].GetCoeff()*(*iterexceed)[
i].GetCoeff();
1465 for(
int ii=0;ii<tmpresmul.
poly.sizenf;ii++)
1466 if(tmpresmul.
poly.nfind)
1468 coeff_t tmp=(*iterexceed)[
i].GetCoeff();
1469 w.tabnf[ii]=tmpresmul.
poly.nfind[ii];
1470 tabfun2[w.tabnf[ii]](w.tabcoeff+(8*ii),
1472 tmpresmul.
poly.
nf+pos_nfiter);
1473 pos_nfiter+=
nbbits[tmpresmul.
poly.nfind[ii]];
1477 cout<<
"exceed apres"<<endl;
1478 for(
auto &i : exceedmap)
1479 cout<<i.first<<
" "<<i.second<<
" ";
1481 cout<<
"nf apres"<<endl;
1482 for(
auto &i : nfmap)
1483 cout<<i.first<<
" "<<i.second<<
" ";
1489 cout<<
"newsizenfind "<<newsizenfind<<
" "<<(
void*)iterpoly->nfind<<endl;
1490 cout<<
"w.sizenf "<<w.sizenf<<endl;
1492 *iterexceed=(mon*)MAC_REV_REALLOC<mon>(*iterexceed,*itersizeexceed*
sizeof(
mon)
1493 ,exceedmap.size()*
sizeof(
mon));
1494 iterpoly->nfind=(
unsigned char *)realloc(iterpoly->nfind,newsizenfind);
1496 for(
int i=0;
i<w.sizenf;newsize+=
nbbits[w.tabnf[
i++]]);
1497 iterpoly->nf=(coeff_t*)MAC_REV_REALLOC<coeff_t>(iterpoly->nf,
1498 iterpoly->size*
sizeof(coeff_t),
1499 newsize*
sizeof(coeff_t));
1500 for(
int k=0;k<newsizenfind;k++)
1502 iterpoly->nfind[
k]=w.tabnf[
k];
1505 for(
int k=0;k<newsize;k++)
1507 iterpoly->nf[
k]=w.tabcoeff[
k];
1510 iterpoly->size=newsize;
1511 iterpoly->sizenf=newsizenfind;
1512 for(
auto iter : exceedmap)
1515 tmpmon.
rep=iter.first;
1516 tmpmon.
coeff=iter.second;
1517 (*iterexceed)[k++]=tmpmon;
1519 *itersizeexceed=exceedmap.size();
1522 template <
typename typcomp,
typename typmon2pol,
typename typserv>
1524 const typmon2pol &mon2pol,
const typserv &serv)
1531 for(
auto &p : updating_comp.poly)
1533 update_pol(comp_to_update,updating_comp,mon2pol,w,serv);
1536 template <
typename typcomp,
typename typmon2pol,
typename typwork,
typename typserv>
1537 void update_pol(typcomp &comp_to_update,
const typcomp &updating_comp,
1538 const typmon2pol &mon2pol, typwork &w,
const typserv &serv)
1540 typedef typename typcomp::typPk typPk;
1541 typedef typename typserv::monom_t
mon;
1545 if(comp_to_update==updating_comp)
1548 auto iterexceed=comp_to_update.exceed.begin();
1549 auto itersizeexceed=comp_to_update.sizeexceed.begin();
1550 auto iterpoly=comp_to_update.poly.begin();
1554 auto myitersize=updating_comp.sizeexceed.begin();
1556 for(
auto &
i : updating_comp.poly)
1557 cout<<
"ind qui update "<<
i.ind<<
" "<<*myitersize++<<endl;
1559 myitersize=comp_to_update.sizeexceed.begin();
1561 for(
auto &
i : comp_to_update.poly)
1562 cout<<
"ind a up "<<
i.ind<<
" "<<*myitersize++<<endl;
1565 iterexceed=comp_to_update.exceed.begin();
1566 itersizeexceed=comp_to_update.sizeexceed.begin();
1567 for(iterpoly=comp_to_update.poly.begin();
1568 iterpoly!=comp_to_update.poly.end();
1569 iterpoly++,iterexceed++,itersizeexceed++)
1574 map<typename mon::rep_t,COEFF> exceedmap;
1577 int newsizenfind=iterpoly->sizenf;
1581 for(
int i=0;
i<iterpoly->sizenf;
i++)
1584 w.tabnf[
i]=iterpoly->nfind[
i];
1585 tabfun1[w.tabnf[
i]](w.tabcoeff+(8*
i),iterpoly->nf+pos_nf);
1586 pos_nf+=
nbbits[iterpoly->nfind[
i]];
1588 for(
int i=0;
i<*itersizeexceed;
i++)
1592 if(!mon2pol.count((*iterexceed)[
i].rep))
1593 exceedmap[(*iterexceed)[
i].rep]=
1594 (*iterexceed)[
i].GetCoeff();
1596 for(
int i=0;
i<*itersizeexceed;
i++)
1598 if(mon2pol.count((*iterexceed)[
i].rep))
1603 mon2pol.find((*iterexceed)[i].rep)->second;
1604 if(newsizenfind<tmpresmul.
poly.sizenf)
1605 newsizenfind=tmpresmul.
poly.sizenf;
1608 exceedmap[tmpresmul.
exceed[
j].rep]-=
1609 tmpresmul.
exceed[
j].GetCoeff()*(*iterexceed)[
i].GetCoeff();
1612 for(
int ii=0;ii<tmpresmul.
poly.sizenf;ii++)
1613 if(tmpresmul.
poly.nfind[ii])
1615 coeff_t tmp=(*iterexceed)[
i].GetCoeff();
1616 w.tabnf[ii]|=tmpresmul.
poly.nfind[ii];
1618 tabfun2[tmpresmul.
poly.nfind[ii]](w.tabcoeff+(8*ii),
1620 tmpresmul.
poly.
nf+pos_nfiter);
1621 pos_nfiter+=
nbbits[tmpresmul.
poly.nfind[ii]];
1627 cout<<
"newsizenfind "<<newsizenfind<<
" "<<(
void*)iterpoly->nfind<<endl;
1628 cout<<
"w.sizenf "<<w.sizenf<<endl;
1630 *iterexceed=(mon*)MAC_REV_REALLOC<mon>(*iterexceed,*itersizeexceed*
sizeof(
mon)
1631 ,exceedmap.size()*
sizeof(
mon));
1632 iterpoly->nfind=(
unsigned char *)realloc(iterpoly->nfind,newsizenfind);
1634 for(
int i=0;
i<w.sizenf;newsize+=
nbbits[w.tabnf[
i++]]);
1635 iterpoly->nf=(coeff_t*)MAC_REV_REALLOC<coeff_t>(iterpoly->nf,
1636 iterpoly->size*
sizeof(coeff_t),
1637 newsize*
sizeof(coeff_t));
1639 cout<<
"newsize "<<newsize<<endl;
1641 for(
int k=0;k<newsizenfind;k++)
1643 iterpoly->nfind[
k]=w.tabnf[
k];
1652 for(
int k=0;k<newsizenfind;k++)
1654 if(iterpoly->nfind[k])
1656 for(
int j=0;
j<8;
j++)
1657 if((iterpoly->nfind[k]>>
j)&1)
1659 iterpoly->nf[tmpcompt++]=w.tabcoeff[8*k+
j];
1660 w.tabcoeff[8*k+
j]=0;
1664 iterpoly->size=newsize;
1665 iterpoly->sizenf=newsizenfind;
1667 cout<<
"exceed apres "<<exceedmap.size()<<endl;
1668 for(
auto &
i : exceedmap)
1669 cout<<
i.first<<
" "<<
i.second<<
" ";
1672 for(
auto iter : exceedmap)
1675 tmpmon.
rep=iter.first;
1676 tmpmon.
coeff=iter.second;
1677 (*iterexceed)[k++]=tmpmon;
1679 *itersizeexceed=exceedmap.size();
1686 template<
typename typMat>
1689 typedef typename typMat::coeff_t coeff_t;
1691 cout<<
"la petitee "<<tmpmat.nnz<<endl;
1693 cout<<
"la grosse "<<endl;
1697 mat.colptr=(
int *)realloc(mat.colptr,(mat.ncol+tmpmat.ncol+1)*
sizeof(int));
1698 mat.nzval=MAC_REV_REALLOC<coeff_t>(mat.nzval,mat.nnz*
sizeof(coeff_t),
1699 (mat.nnz+tmpmat.nnz)*
sizeof(coeff_t));
1700 mat.rowind=(
int *)realloc(mat.rowind,(mat.nnz+tmpmat.nnz)*
sizeof(int));
1702 for(
int i=0;
i<=tmpmat.ncol;
i++)
1703 mat.colptr[mat.ncol+
i]=mat.nnz+tmpmat.colptr[
i];
1705 for(
int i=0;
i<tmpmat.nnz;
i++)
1706 mat.rowind[mat.nnz+
i]=mat.nrow+tmpmat.rowind[
i];
1708 for(
int i=0;
i<tmpmat.nnz;
i++)
1709 ((coeff_t *)mat.nzval)[mat.nnz+
i]=((coeff_t *)tmpmat.nzval)[
i];
1710 mat.ncol+=tmpmat.ncol;
1711 mat.nrow+=tmpmat.nrow;
1712 mat.nnz+=tmpmat.nnz;
1714 cout<<
"dans reconstruct mat.ncol en sortie "<<mat.ncol<<endl;
1715 cout<<
"dans reconstruct mat.nrow en sortie "<<mat.nrow<<endl;
1722 for(
int i=0;
i<sizetmp;
i++)
1723 pr[
i+indexinside]=tmppr[
i]+indexinside;
1725 for(
int i=0;
i<sizetmp;
i++)
1726 pc[
i+indexinside]=tmppc[
i]+indexinside;
1729 template<
typename typMat,
typename typP,
typename typPk,
typename typMk,
typename Base,
typename typdump,
class monomial_server,
typename workspace>
1730 void init_algo(typP &P,
int &nouveaumon,
int &maxdeg,
int &
k,
1731 typPk &Pk, typMk & Mk,
Base & b, typdump & dump,
workspace &w,
1734 template<
typename typP,
typename typPk,
typename typdump,
typename Base
1735 ,
template<
typename T>
class tmptypmat ,
1740 typedef typename typP::value_type polyalp;
1741 typedef list<typename typPk::value_type::monom_t> typMk;
1743 typedef typename typPk::value_type
pol;
1750 typedef tmptypmat<typename typP::value_type::coeff_t> typMat;
1752 int nouveaumon,allpolused=0,maxdeg,
k,*pr,*pc;
1753 vector<typename typMk::value_type*> exceed;
1754 list<int> sizeexceed;
1757 init_algo<typMat>(P,nouveaumon,maxdeg,
k,Pk,Mk,b,dump,w,serv);
1764 while(nouveaumon||(k<=maxdeg))
1771 for(
typename typPk::iterator iter=S.begin();iter!=S.end();iter++)
1774 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1777 #if 0//ICICICICICICICICICICCII
1778 cout<<
"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl;
1779 for(
typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1782 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1784 cout<<endl<<
"newpkmkmatrixof"<<endl;
1788 #if 0//ICICICICICICICICCI
1789 cout<<
"poly apres solve (attention exceed)"<<endl;
1790 copy(sizeexceed.begin(),sizeexceed.end(),ostream_iterator<int>(cout,
" *** "));cout<<endl;
1791 for(
typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1794 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1797 if(killspol) S.erase(S.begin(),S.end());
1798 if (k+1>=maxdeg) allpolused=1;
1799 if(Mk.size()==0) nouveaumon=0;
1804 if ((
unsigned)my_rank(Mat)==Mk.size())
1808 typMk tmpSpoldejavu;
1809 typPk redspol,secd=secondmembre(Mat,Pk);;
1812 cout<<
"matrice de rang plein "<<endl;
1817 cout<<
"secd/size() "<<secd.size()<<endl;
1820 cout<<
"redspol.size "<<redspol.size()<<endl;
1821 if(redspol.size()==0)
1824 my_merge(Spoldejavu,tmpSpoldejavu);
1834 int tmpdeg=
mindeg(redspol,serv);
1837 cout<<
"redspol.size() "<<redspol.size()<<endl;
1840 my_merge(Spoldejavu,tmpSpoldejavu);
1846 cout<<
"debut newcrochetchoix"<<endl;
1848 cout<<
"fin newcrochetchoix"<<endl;
1851 serv.compress(Pk,dump,b,k);
1864 cout<<
"matrice de rang pas plein "<<endl;
1868 cout<<
"avant addB "<<Pk.size()<<endl;
1869 auto iterexceed=exceed.begin();
1870 auto itersizeexceed=sizeexceed.begin();
1871 for(
typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++,iterexceed++,itersizeexceed++)
1873 cout<<
"ind "<<iter->ind<<
" est sikzeexceed "<<*itersizeexceed<<endl;
1874 copy(*iterexceed,*iterexceed+*itersizeexceed,ostream_iterator<mon>(cout,
" + "));
1876 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1879 AddB(Mat,Pk,Mk,exceed,sizeexceed,dump,b,serv);
1881 cout<<
"apres addB "<<Pk.size()<<endl;
1882 for(
typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1884 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1891 secd=secondmembre(Mat,Pk);
1906 for(
typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
1907 P.push_back(invconv<polyalp>(*iter));
1909 if(redspol.size()==0)
1924 cout<<
"il ya un passage par mat rang pas"
1925 <<
"plein et pol non zero"<<endl;
1928 serv.compress(Pk,dump,b,k);
1950 for(
typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
1951 P.push_back(invconv<polyalp>(*iter));
1957 cout<<
"poly avant newcrochetchoix (attention exceed)"<<endl;
1958 copy(sizeexceed.begin(),sizeexceed.end(),ostream_iterator<int>(cout,
" *** "));cout<<endl;
1959 for(
typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1962 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1968 cout<<
"poly apres newcrochetchoix (attention exceed)"<<endl;
1969 copy(sizeexceed.begin(),sizeexceed.end(),ostream_iterator<int>(cout,
" *** "));cout<<endl;
1970 for(
typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1973 cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1978 serv.compress(Pk,dump,b,k);
1994 cout<<
"sortie d'algo flash et dimension "<<endl;
2003 template<
typename mon,
typename T,
typename Base ,
typename monomial_server>
2013 for(
int j=0;
j<8;
j++)
2020 tmp.erase(tmp.begin(),tmp.end());
2026 tmp.push_back(tmpmon);
2036 template<
typename mon,
typename T,
typename Base,
typename monomial_server>
2046 for(
int j=0;
j<8;
j++)
2053 tmp.erase(tmp.begin(),tmp.end());
2059 tmp.push_back(tmpmon);
2065 for(
typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2067 if(m.
GetCoeff()<itertmp->GetCoeff()) {m=*itertmp;};
2076 template<
typename mon,
typename T,
typename Base,
typename monomial_server>
2087 for(
int j=0;
j<8;
j++)
2095 tmp.erase(tmp.begin(),tmp.end());
2101 tmp.push_back(tmpmon);
2106 for(;tmp.front().GetCoeff()==0;tmp.pop_front());
2108 for(
typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2110 if((itertmp->GetCoeff()!=0) && (
my_ord(*itertmp,m)<0)) {m=*itertmp;};
2116 template<
typename mon,
typename T,
typename Base,
typename monomial_server>
2126 for(
int j=0;
j<8;
j++)
2133 tmp.erase(tmp.begin(),tmp.end());
2139 tmp.push_back(tmpmon);
2145 for(
typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2147 if(
my_ord(*itertmp,m)>0) {m=*itertmp;};
2154 template<
typename mon,
typename T,
typename Base,
typename monomial_server>
2164 for(
int j=0;
j<8;
j++)
2171 tmp.erase(tmp.begin(),tmp.end());
2177 tmp.push_back(tmpmon);
2183 for(
typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2186 for(
int i=0;
i<=
lvar(itertmp->rep);
i++)
2188 if(itertmp->GetDegree(
i)>=maxtmpdeg)
2199 template<
typename mon,
typename T,
typename Base,
typename monomial_server>
2208 for(
int j=0;
j<8;
j++)
2214 __mpz_struct *numref,*denref;
2215 numref=mpq_numref(&(p.
nf[
k].rep()));
2216 denref=mpq_denref(&(p.
nf[
k].rep()));
2217 if(mpz_size(numref)+
2218 mpz_size(denref)<mini)
2220 mini=mpz_size(mpq_numref(&(p.
nf[
k].rep())))+
2221 mpz_size(mpq_denref(&(p.
nf[
k].rep())));
2224 stockmon=tmpmon*p.
nf[
k];
2233 template<
typename mon,
typename T,
typename Base,
typename monomial_server>
2246 cout<<
"Degree(p) "<<degp<<endl;
2250 for(
int j=0;
j<8;
j++)
2255 tmplist.push_back(tmpmon*p.
nf[k]);
2259 for(
typename list<mon>::iterator iterlist=tmplist.begin()
2260 ;iterlist!=tmplist.end();iterlist++)
2262 for(iterb=b.
begin();iterb!=b.
end();iterb++)
2265 for(
int i=0;i<iterb->taille1;i++)
2268 for(
int i=0;i<iterb->taille2;i++)
2274 for(
int i=0;i<iterb->taille2;i++)
2276 mon m=
lcm(*iterlist,iterb->refuse[i]);
2278 for(
int j=0;
j<iterb->taille2;
j++)
2298 cout<<
"le pol "<<invconv<Poly>(p,serv)<<endl<<
"le mon choisi "<<res<<endl;
2303 template<
typename typdump,
typename Base,
typename mon,
2310 static const mon monzero=
mon(0);
2311 static COEFF zero=0;
2314 (*exce)=(
mon*)MAC_REV_MALLOC<mon>((p.
size+1)*
sizeof(
mon));
2315 int *stockindicetab=(
int*)
malloc(p.
size*
sizeof(
int));
2316 int noquo=0,maxind=0,pp=0,q=0;
2320 init_pointer<COEFF>();
2321 flag=0;cout<<
"pouet pouet"<<endl;
2325 cout<<
"ds mult je traite "<<p.
ind<<
" ---- "<<i<<endl;
2326 cout<<invconv<Poly>(p,serv)<<endl;
2327 cout<<
"p.size "<<p.size<<endl;
2329 for(
int j=0;
j<p.sizenf;++
j)
2332 for(
int k=0;
k<8;
k++)
2333 if((p.nfind[
j]>>
k)&1)
2335 int stockindice2=serv.
mulind(8*
j+
k,i,b);
2337 stockindice2=-1*(8*
j+
k)-1;
2338 stockindicetab[pp++]=stockindice2;
2339 if (stockindice2>=maxind)
2340 maxind=stockindice2;
2341 cout<<
"stockindice2 "<<8*
j+
k<<
" "<<i<<stockindice2<<endl;
2345 for(
int j=0;
j<pp;
j++)
2346 if(stockindicetab[
j]>=0)
2350 w.
tabnf[stockindicetab[j]/8]|=1<<(stockindicetab[j]%8);
2355 tmp=serv.nf(i,-1*(stockindicetab[
j]+1),dump,b);
2361 unsigned long *tmpptr=(
unsigned long*)tmp.nfind;
2362 unsigned long mask=1;
2365 for(k=0;k<tmp.sizenf/
sizeof(
unsigned long);k++)
2369 ((
unsigned long*)w.
tabnf)[
k]|=mask;
2370 for(l=0;l<8*sizeof(unsigned long);l+=8,mask>>=8)
2375 w.
tabcoeff+(8*
sizeof(
unsigned long)*k+l)
2376 ,&(p.nf[
j]),tmp.
nf+compteurtmp);
2377 compteurtmp+=
nbbits[mask&255];
2380 for(
int m=0;m<8;m++)
2382 ((
unsigned long*)w.
tabnf)[
k]&=~(1<<(l+m));
2387 for(k=tmp.sizenf-(tmp.sizenf%
sizeof(
unsigned long))
2393 for(l=0;l<8;l++,mask<<=1)
2395 if(tmp.nfind[k]&mask)
2408 (*exce)[noquo]=
mon(i,1);
2409 serv.
int2mon(-1*(stockindicetab[
j]+1),tmpmon);
2410 (*exce)[noquo]*=tmpmon;
2411 (*exce)[noquo]*=p.nf[
j];
2417 ret.ancestor=p.ancestor;
2421 (*exce)[noquo++]=ret.
ind;
2423 (*exce)=(
mon*)MAC_REV_REALLOC<mon>((*exce),(p.size+1)*
sizeof(
mon)
2424 ,(noquo)*
sizeof(
mon));
2431 for(
int m=0;m<8;m++)
2442 ret.nfind=(
unsigned char *)
malloc(ret.sizenf);
2444 for(
int j=0;
j<ret.sizenf;
j++)
2447 for(
int k=0;
k<8;
k++)
2456 free(stockindicetab);
2458 cout<<
"en sortie"<<endl;
2459 cout<<invconv<Poly>(ret,serv)<<endl;
2460 copy(*exce,*exce+exsize,ostream_iterator<mon>(cout,
" + "));cout<<endl;
2461 cout<<
"----------"<<endl;
2468 template<
typename typmat,
typename typPk,
typename typMk,
typename typdump,
2470 void AddB(
const typmat & mat, typPk & Pk,
const typMk &Mk,
const typexceed & exceed,
2471 const typsizeexceed & sizeexceed,
const typdump & dump,
2474 typedef typename typPk::value_type
pol;
2477 typename typPk::iterator iterpk=Pk.begin();;
2478 auto iterexceed=exceed.begin();
2479 auto itersizeexceed=sizeexceed.begin();
2481 typename typMk::const_iterator iter=Mk.begin();
2482 int r=my_rank(mat),comprefuse=0,compaccept=0;
2487 tmp.
refuse=(mon*)MAC_REV_MALLOC<mon>(r*
sizeof(mon));
2489 tmp.
accept=(mon*)MAC_REV_MALLOC<mon>((Mk.size()-
r)*
sizeof(mon));
2494 for(i=0;i<Mk.size();i++,iter++)
2498 tmp.
accept[compaccept++]=*iter;
2503 tmp.
refuse[comprefuse++]=*iter;
2506 b.
def.push_back(tmp);
2515 for(
unsigned int i=0;i<Pk.size();i++,iterpk++,iter++,iterexceed++,itersizeexceed++)
2517 vector<sortstruct<coeff_t> > decal;
2520 for(
int j=0;
j<*itersizeexceed;
j++)
2521 if(!
Iszero((*iterexceed)[
j].GetCoeff()))
2527 maxindex=
max(maxindex,serv.
mon2int((*iterexceed)[
j]));
2529 tmp.
coeff=(*iterexceed)[
j].GetCoeff();
2530 decal.push_back(tmp);
2534 if(decal.empty())
continue;
2537 MAC_REV_REALLOC<typename mon::coeff_t>(iterpk->nf
2540 if((maxindex/8)>=iterpk->sizenf)
2542 iterpk->nfind=(
unsigned char*)
2543 MAC_REV_REALLOC<unsigned char>(iterpk->nfind
2544 ,iterpk->sizenf,maxindex/8+1);
2545 for(
int i=iterpk->sizenf;i<maxindex/8+1;i++)
2547 iterpk->sizenf=maxindex/8+1;
2553 int nbcoeff=iterpk->size-1;
2555 for(
int j=iterpk->sizenf-1;
j>=0;
j--)
2558 if(8*
j>decal.rbegin()->index)
2559 for (
int jj=0;jj<
nbbits[iterpk->nfind[
j]];jj++)
2561 iterpk->nf[nbcoeff+decal.size()]=
2562 iterpk->nf[nbcoeff];
2567 int indexnf=decal.back().index;
2568 typename typMk::value_type tmpmon;
2571 while(8*
j<=decal.back().index)
2573 indexnf=decal.back().index % 8;
2574 for (;jj>(indexnf);jj--)
2575 if(iterpk->nfind[
j]&(1<<jj))
2577 iterpk->nf[nbcoeff+decal.size()]=
2578 iterpk->nf[nbcoeff];
2584 iterpk->nf[nbcoeff+decal.size()]=decal.back().coeff;
2585 iterpk->nfind[
j]|=(1<<(indexnf));
2592 if(decal.empty())
break;
2595 if(iterpk->nfind[
j]&(1<<jj))
2597 iterpk->nf[nbcoeff+decal.size()]=
2598 iterpk->nf[nbcoeff];
2601 if(decal.empty())
break;
2605 iterpk->size+=expend;
2606 MAC_REV_FREE<mon>(*iterexceed,*itersizeexceed*
sizeof(
mon));
void int2mon(const int &i, mon &res)
Definition: placemon3.hpp:664
Definition: dlexorder.hpp:4
Definition: workspace.hpp:11
T coeff
Definition: IsinB3.hpp:232
mon choice_grevlex(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2077
void wrap_update_pol(typcomp &comp_to_update, typcomp &updating_comp, typserv &serv)
Definition: pol2terspecial.hpp:1372
Definition: pol2terspecial.hpp:36
void compute_newpol(typPk &Pk, typPk &tmpPk, typMk &tmpMk, typdump &dump, typexceed &exceed, typsizeexceed &sizeexceed, Base &b, int &k, typrecall &recall, typwork &w, typserv &serv)
Definition: corealgo3.hpp:1323
void tarjan(typgraph &G, typvec &vec)
Definition: pol2terspecial.hpp:263
void AddB(const typmat &mat, typPk &Pk, const typMk &Mk, const typexceed &exceed, const typsizeexceed &sizeexceed, const typdump &dump, typB &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2470
void affdebug(const typmat &m)
Definition: io.hpp:30
#define max(a, b)
Definition: alp_f2c.H:167
unsigned char * nfind
Definition: pol2ter.hpp:22
list< polbis< mono, T > > & Solve(typmat &S, std::list< polbis< mono, T > > &TildePk, int **pr, int **pc, workspace &w)
Definition: pol2bisspecial.hpp:609
void treat_noempty_crochet(typP &P, typttmpP &ttmpP, typPk &tmpPk, typMk &tmpMk, typPk &Pk, typMk &Mk, typdump &dump, Base &b, int &flagdoplus, int &k, typrecall &recall, typexceed &exceed, typsizeexceed &sizeexceed, typserv &serv)
Definition: corealgo3.hpp:1251
int mon2int(const mon &mm)
Definition: placemon3.hpp:679
int isdivisible(const mon &m1, const mon &m2, int nbvar)
Definition: isdivisible.hpp:5
void compute_ancestors(typPk &tmpPk, Base &b)
Definition: pol2terspecial.hpp:62
int lvar(const dynamicexp< X, E > &A)
Definition: dynamicexp.hpp:178
pol::coeff_t coeff
Definition: pol2terspecial.hpp:40
Base< predicat< mon > > typB
Definition: solver_bb_floating.cpp:142
pol_t::monom_t mon
Definition: pol2terspecial.hpp:21
C GetCoeff() const
Definition: Monom.hpp:67
int sizeexceed
Definition: pol2terspecial.hpp:24
long nextdim(std::vector< int > &coeff_mac, int k)
Definition: macaulay.hpp:45
bool operator==(const component< typPk_t, mon > &a, const component< typPk_t, mon > &b)
Definition: pol2terspecial.hpp:47
void my_merge(T &l1, const T &l2)
Definition: corealgo.hpp:35
mon * exceed
Definition: pol2terspecial.hpp:31
pol poly
Definition: pol2terspecial.hpp:22
int newpkmkMatrixofSolve(typMat &mat, typMat &L, typPk &Pk, typP &P, typMk &Mk, int &k, Base &b, typdump &dump, typexceed &exceed_ret, typsizeexceed &sizeexceed_ret, workspace &w, monomial_server &serv)
Definition: pol2terspecial.hpp:495
void reconstruct_mat(typMat &mat, const typMat &tmpmat)
Definition: pol2terspecial.hpp:1687
typPk_t poly
Definition: pol2terspecial.hpp:42
mon * accept
Definition: types.hpp:6
int my_ord(const mon &m1, const mon &m2)
Definition: ord.hpp:2
COEFF coeff
Definition: pol2terspecial.hpp:29
void NewDestroyredspol(typPk &redspol, const typPk &Pk)
Definition: corealgo.hpp:2824
void(* tabfun1[32])(COEFF *, pol< mon, COEFF > *, int *)
Definition: auxfun.hpp:417
long flag
Definition: alp_f2c.H:52
list< predicat >::const_iterator const_iterator
Definition: types.hpp:21
void init_algo(typP &P, int &nouveaumon, int &maxdeg, int &k, typPk &Pk, typMk &Mk, Base &b, typdump &dump, workspace &w, monomial_server &serv)
Definition: corealgo3.hpp:335
void recover(typPk &Pk, typMk &Mk, const typdump &dump, int k)
Definition: dump.hpp:192
coeff * tabcoeff
Definition: workspace.hpp:12
void Dump(const typPk &Pk, typdump &dump)
Definition: dump.hpp:48
void strongconnect(typstack &S, typgraph &G, int i, typvec &vec, int &index, typvec &lowlink, int startindex)
Definition: pol2terspecial.hpp:212
T coeff_t
Definition: pol.hpp:9
void nextmon(const Base &b, typdump &dump, typserv &serv)
Definition: gotzman.hpp:74
int taille1
Definition: types.hpp:5
int nbvar()
Definition: types.hpp:37
int sizenf
Definition: pol2ter.hpp:23
mon choice_mpq(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2200
pol_t pol
Definition: pol2terspecial.hpp:19
pol2ter< mon, COEFF > * typPk
Definition: pol2terspecial.hpp:28
mon choice_mac(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2155
void global_update_matrix(typmat &m, typlistcomp &listcomp, typmap &mon2col)
Definition: pol2terspecial.hpp:1024
MSKconetypee MSKrealt MSKint32t MSKint32t j
Definition: mosek.h:2421
unsigned char * tabnf
Definition: workspace.hpp:13
void destroy_space(workspace< coeff > *w)
Definition: workspace.hpp:34
int critere_got(const Base &b, typdump &dump, typserv &serv)
Definition: gotzman.hpp:191
void reconstruct_pr_pc(int *&pr, int *&pc, int *tmppr, int *tmppc, int sizetmp, int indexinside)
Definition: pol2terspecial.hpp:1720
pol_t::monom_t monom_t
Definition: pol2terspecial.hpp:20
typPk Spolordsup(typPk Pk, const Base &b)
Definition: corealgo.hpp:147
MSKint32t k
Definition: mosek.h:2713
R rep
Definition: Monom.hpp:30
void rajoute_voisins(typPk &Pk, const typMk &Mk, const typdump &dump, Base &b, workspace &w, monomial_server &serv)
Definition: IsinB3.hpp:111
C coeff_t
Definition: Monom.hpp:26
int nbbits[256]
Definition: pol2ter.hpp:4
Definition: pol2terspecial.hpp:17
void(* tabfun2[32])(COEFF *, COEFF *, pol< mon, COEFF > *, int *)
Definition: auxfun.hpp:418
Definition: placemon3.hpp:14
pol2ter< mon, COEFF > * p
Definition: pol2terspecial.hpp:30
C coeff
Definition: Monom.hpp:29
Definition: pol2terspecial.hpp:27
mon choice_dlex(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2117
MSKCONST char MSKint32t MSKint32t * index
Definition: mosek.h:2860
Definition: IsinB3.hpp:229
dynamicexp< X, E >::degree_t Degree(const dynamicexp< X, E > &t)
Definition: dynamicexp.hpp:91
vector< int > sizeexceed
Definition: pol2terspecial.hpp:44
iterator end()
Definition: types.hpp:30
void conv_merge(typPk &Pk, typP &P, typexceed &ex, typsize &sizeex, const Base &b)
Definition: corealgo.hpp:1297
mon * exceed
Definition: pol2terspecial.hpp:23
void ReduceSpol(typPk &S, const typdump &dump, typPk &redspol, const Base &b)
Definition: corealgo.hpp:2217
pol< mon, COEFF > mult(int i, const pol< mon, COEFF > &p, const typdump &dump, const Base &b, mon **exce, int &exsize, workspace &w, monomial_server &serv)
Definition: pol2terspecial.hpp:2306
Definition: pol2ter.hpp:15
list< predicat > def
Definition: types.hpp:16
Mon mon
Definition: solver_bb_floating.cpp:136
int nbvars
Definition: types.hpp:17
void increase_space(workspace< coeff > *w)
Definition: workspace.hpp:19
int taille2
Definition: types.hpp:7
exponent_t GetDegree() const
Definition: Monom.hpp:70
void NewCrochetchoix(typP &P, typPk &Pk, typMk &Mk, typPk &redspol, int &k, typdump &dump, Base &b, typrecall &recall)
Definition: corealgo.hpp:2594
MSKrealt * c
Definition: mosek.h:2678
MSKint32t MSKint32t MSKint32t i
Definition: mosek.h:2278
int Iszero(const Scl< MPQ > &c)
Definition: Iszero.hpp:14
typPk_t typPk
Definition: pol2terspecial.hpp:38
int sizenf
Definition: workspace.hpp:15
mon choice_naif(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2004
int index
Definition: IsinB3.hpp:231
void makegraph(typgraph &G, const typPk tmpPk, const typexceed &exceed, const typsizeexceed &sizeexceed, typmon2face &mon2face, Base &b)
Definition: pol2terspecial.hpp:140
MSKrescodee r
Definition: mosek.h:2321
mon lcm(const mon &m1, const mon &m2)
Definition: corealgo.hpp:43
int size
Definition: pol.hpp:10
mon choice_num(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2037
MSKstreamtypee MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t MSKint32t a
Definition: mosek.h:3833
void algo(typP P, typdump &dump, Base &b, monomial_server< mon, pol2ter< mon, typename mon::coeff_t > > &serv)
Definition: pol2terspecial.hpp:1737
#define COEFF
Definition: symbo2.hpp:8
typPk::value_type pol
Definition: pol2terspecial.hpp:39
void forget(Base &b, typdump &dump, int k, typrecall &recall)
Definition: dump.hpp:75
mon * refuse
Definition: types.hpp:8
cont< pol< mon, T > > Crochet(const cont< pol< mon, T > > &P, int k)
Definition: corealgo.hpp:6
int mulind(int indexbase, int var, const typBase &b)
Definition: placemon3.hpp:126
void update_pol(typcomp &comp_to_update, typcomp &updating_comp, workspace *w, typserv &serv)
vector< mon * > exceed
Definition: pol2terspecial.hpp:43
void initial_mon(const Base &b, typdump &dump, typserv &serv)
Definition: gotzman.hpp:57
iterator begin()
Definition: types.hpp:25
void update_matrix(typmat &m, typcomp &c, typmap &mon2col, int indexmat)
Definition: pol2terspecial.hpp:1125
mon choice_fall(const pol2ter< mon, T > &p, const Base &b, monomial_server &serv)
Definition: pol2terspecial.hpp:2234
#define pol
Definition: pol2ter.hpp:3
int size
Definition: workspace.hpp:14
void SetCoeff(const C &c)
Definition: Monom.hpp:68
int mindeg(const typPk &l)
Definition: corealgo.hpp:2422
mon ind
Definition: pol.hpp:11
int sizeexceed
Definition: pol2terspecial.hpp:32
Multivariate monomials.
Definition: Monom.hpp:21
T * nf
Definition: pol.hpp:12
void construct_matrix_from_newpol_nofree(typMat &mat, typPk &tmpPk, typMk &tmpMk, typexceed &exceed, typsizeexceed &sizeexceed, typP &P)
Definition: pol2terspecial.hpp:342
T * nf
Definition: pol2ter.hpp:21
long min(long a, long b)
Definition: workspace.hpp:3
Definition: IsinB3.hpp:235