Borderbasix

pol2terspecial.hpp
Go to the documentation of this file.
1 //#include"pol2bisspecial.hpp"
2 //
3 //
4 //
5 #include<future>
6 #include<string>
7 #include<iostream>
8 #include<iterator>
10 #ifndef LEVELSELECT
11 #define LEVELSELECT 1e-6
12 #endif
13 //#define NBFUTURE 7
14 #define NBFUTURE 7
15 
16 template<typename pol_t>
17 struct resmul
18 {
19  typedef pol_t pol;
20  typedef typename pol_t::monom_t monom_t;
21  typedef typename pol_t::monom_t mon;
22  pol poly;
23  mon * exceed;
25 };
26 
27 struct stack_elem {
33 };
34 
35 template<typename typPk_t, typename mon>
36 struct component
37 {
38  typedef typPk_t typPk;
39  typedef typename typPk::value_type pol;
40  typedef typename pol::coeff_t coeff;
41 
42  typPk_t poly;
43  vector<mon *> exceed;
44  vector<int> sizeexceed;
45 };
46 template<typename typPk_t, typename mon>
48 {
49  bool res=true;
50  return (a.poly==b.poly)&&(a.exceed==b.exceed)&&(a.sizeexceed==b.sizeexceed);
51 }
52 
53 //
54 //Routine a remlacer plus tard par une propapagtion des ancestors
55 //lors du mult et une definition lors newcrochetchoix
56 //
57 template <typename typcomp, typename workspace, typename typserv>
58 void update_pol(typcomp &comp_to_update,typcomp &updating_comp, workspace *w,
59  typserv &serv);
60 #ifndef ASYNC
61 template<typename typPk, typename Base>
62 void compute_ancestors(typPk &tmpPk, Base & b)
63 {
64  //
65  //
66  //cet algo repose sur le fait que les composantes sont placées dans l'ordre d'inclusion
67  // on a pas de petite composante avant une plus grosse
68  //a changer par la suite
69  //
70  //
71  typedef typename typPk::value_type::monom_t mon;
72  for (auto &iter : tmpPk)
73  {
74 
75  mon tmp=iter.ind;
76  //Pour etre ancetre il faut diviser
77  //et etre dans la meme composante de B
78  mon *candidate_ancestor=NULL;
79  tmp.SetCoeff(1);
80  for(auto &iterbase : b)
81  {
82  mon *compancestor=NULL;
83  int isincomponent=0;
84  for(int i=0;i<iterbase.taille1;i++)
85  if(isdivisible(iterbase.accept[i],tmp,b))
86  {
87  isincomponent=1;
88 #ifdef DEBUG
89  cout<<"je break ici"<<endl;
90 #endif
91  break;//pas la peine d'aller plus loin on est dans la composante
92  }
93  if(isincomponent)//sinon ca sert a rien
94  {
95  for(int i=0;i<iterbase.taille2;i++)
96  if(isdivisible(iterbase.refuse[i],tmp,b))
97  {
98  if(compancestor)//on a deux monomomes qui divisent
99  {
100  candidate_ancestor=NULL;
101 #ifdef DEBUG
102  cout<<"je break ici"<<endl;
103 #endif
104  break;//pas la peine d'aller plus loin
105  }
106  else
107  {
108 #ifdef DEBUG
109  cout<<"g trouvé ici un gus "<<iterbase.refuse[i]<<endl;
110 #endif
111  compancestor=&iterbase.refuse[i];
112  }
113  }
114  }
115  if(compancestor)
116  {
117 #ifdef DEBUG
118  cout<<"je passe ici compancestor non null"<<endl;
119 #endif
120  candidate_ancestor=compancestor;
121  }
122  }
123  iter.ancestor=candidate_ancestor;
124  }
125 #ifdef DEBUG
126  for(auto &&iter : tmpPk)
127  {
128  cout<<"ancestor ---- "<<iter.ind<<endl;
129  if (iter.ancestor)
130  cout<<"\t\t -> "<<*(iter.ancestor)<<endl;
131  else
132  cout<<"\e[31mcaca\e(B\e[m"<<endl;
133  }
134 #endif
135 }
136 #endif
137 template<typename typgraph, typename typPk,
138  typename typexceed, typename typsizeexceed, typename typmon2face,
139  typename Base>
140 void makegraph(typgraph & G, const typPk tmpPk, const typexceed &exceed,
141  const typsizeexceed & sizeexceed,
142  typmon2face &mon2face,
143  Base &b)
144 {
145  //on commence par numeroter les faces
146  //Et on associe les ind et leur face
147  //->>>>>>>>>>>>>on utilise une map
148  typedef typename typPk::value_type::monom_t mon;
149  // typedef typename typPk::value_type::order_t ord;
150  typedef my_Dlex<mon> ord;
151  int numface=0;
152  map<typename mon::rep_t,int> root2face;//associee le monome ancetre à sa face
153  //map<typename mon::rep_t,int> mon2face;//associe l'ind a sa face
154  //le root c'est un monome pres de l'ancetre
155  //qui represente l'ind sur la face
156  for(auto iterpk=tmpPk.begin();iterpk!=tmpPk.end();iterpk++)
157  {
158  mon root=*(iterpk->ancestor);
159  int count=0;
160  for(int i=0;i<b.nbvars;i++)
161  if(iterpk->ind.GetDegree(i)>root.GetDegree(i))
162  {
163  root*=mon(i,1);
164  count++;
165  }
166  //ICI il faut repasser pour s'assurer que le root a bien exactement
167  // nvars-1 position augmentées par rapport a l'ancetre
168  //en cas de multiappartenance on choisi celle qui est la plus petite
169  //dans l'ordre lexico (la multiappartenance c qd l'ind est sur une
170  //intersefction de deux faces
171  for(int i=0;(count<(b.nbvars-1)) && (i<b.nbvars);i++)
172  if(iterpk->ancestor->GetDegree(i)==root.GetDegree(i))
173  {
174  root*=mon(i,1);
175  count++;
176  }
177  if(root2face.count(root.rep)==0)
178  root2face[root.rep]=numface++;
179  mon2face[iterpk->ind.rep]=root2face[root.rep];
180  }
181 #ifdef DEBUG
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;
188 #endif
189  //on allour le graph
190  G.resize(numface);
191  for(auto &i : G)
192  {
193  i.resize(numface);
194  for(auto &j :i)
195  j=0;
196  }
197  //Ensuite on construit le graph
198  auto iterexceed=exceed.begin();
199  auto itersize=sizeexceed.begin();
200  auto iterpk=tmpPk.begin();
201  for(;iterpk!=tmpPk.end();iterpk++,iterexceed++,itersize++)
202  {
203 // cout<<"ici on traite "<<iterpk->ind<<endl;
204  for(int i=0;i<*itersize;i++)
205  G[mon2face[iterpk->ind.rep]][mon2face[(*iterexceed)[i].rep]]=1;
206  // On considere le graph dense
207  }
208 
209 }
210 
211 template<typename typstack, typename typgraph, typename typvec>
212 void strongconnect(typstack &S, typgraph &G,int i, typvec &vec,
213  int &index, typvec &lowlink,int startindex)
214 {
215  S.push_back(i);
216  vec[i]=index;
217  lowlink[i]=index;
218  index++;
219 // cout<<"je visite "<<i<<" stack "<<S.size()<<endl;
220 // cout<<"i "<<i<<" lowlink[i] "<<lowlink[i]<<endl;
221  for(int j=0;j<G[i].size();j++)
222  {
223 // cout<<"j "<<j<<endl;
224  if((i!=j)&& G[i][j])
225  {
226 // cout<<"dans le if !"<<endl;
227  if(vec[j]==-1)
228  {
229  strongconnect(S,G,j,vec,index,lowlink,startindex);
230  lowlink[i]=min(lowlink[i],lowlink[j]);
231  }
232  else
233  {
234  if(vec[j]>=startindex)
235  lowlink[i]=min(lowlink[i], vec[j]);
236  // cout<<"lowlink[i] "<<lowlink[i]<<endl;
237  }
238  }
239  }
240  //Est ce une racine
241  // cout<<"racine "<<index-1<<" "<<i<<" ::vec[i]:: "<<vec[i]<<" ::lowlink[i]:: "<<
242  // lowlink[i]<<endl;
243  if(lowlink[i]==vec[i])
244  {
245  int tmpindex;
246  //Oui alors on créé une composante fortement connexe
247  // cout<<"S.size() "<<S.size()<<endl;
248  // cout<<"vec[i] "<<vec[i]<<" i "<<i<<endl;
249  // copy(S.begin(),S.end(),ostream_iterator<int>(cout," "));cout<<endl;
250  do
251  {
252  tmpindex=S.back();
253 // cout<<"pour la comp "<<tmpindex<<endl;
254  S.pop_back();
255  vec[tmpindex]=i;
256 
257  }
258  while(tmpindex!=i);//ici i designe un sommet pas un index
259  }
260 }
261 
262 template<typename typgraph, typename typvec>
263 void tarjan(typgraph &G, typvec & vec)
264 /*
265 algorithm tarjan is
266  input: graph G = (V, E)
267  output: set of strongly connected components (sets of vertices)
268 
269  index := 0
270  S := empty
271  for each v in V do
272  if (v.index is undefined) then
273  strongconnect(v)
274  end if
275  repeat
276 
277  function strongconnect(v)
278  // Set the depth index for v to the smallest unused index
279  v.index := index
280  v.lowlink := index
281  index := index + 1
282  S.push(v)
283 
284  // Consider successors of v
285  for each (v, w) in E do
286  if (w.index is undefined) then
287  // Successor w has not yet been visited; recurse on it
288  strongconnect(w)
289  v.lowlink := min(v.lowlink, w.lowlink)
290  else if (w is in S) then
291  // Successor w is in stack S and hence in the current SCC
292  v.lowlink := min(v.lowlink, w.index)
293  end if
294  repeat
295 
296  // If v is a root node, pop the stack and generate an SCC
297  if (v.lowlink = v.index) then
298  start a new strongly connected component
299  repeat
300  w := S.pop()
301  add w to current strongly connected component
302  until (w = v)
303  output the current strongly connected component
304  end if
305  end function
306 */
307 {
308  int index=0;
309  vector<int> lowlink(G.size(),-1);
310  list<int> S;
311 
312  for(int i=0;i<G.size();i++)
313  {
314  if(vec[i]==-1)
315  {
316 // cout<<"j'attaque une nvlle composante "<<i<<endl;
317  strongconnect(S,G,i,vec,index,lowlink,i);
318 
319  }
320  }
321 
322  //On remet les numeros comme il faut 0,1,2,3 pour eviter les trous
323  vector<int> translator(G.size(),-1);
324  int numcomp=0;
325  for(int i=0;i<vec.size();i++)
326  {
327  if(translator[vec[i]]==-1)
328  translator[vec[i]]=numcomp++;
329  vec[i]=translator[vec[i]];
330  }
331  copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
332  cout<<endl;
333 
334 }
335 
336 //forward declare
337 void reconstruct_pr_pc(int *&pr,int *&pc,int *tmppr,int *tmppc,int sizetmp,int indexinside);
338 //
339 
340 template<typename typMat, typename typPk, typename typMk, typename typexceed,
341  typename typsizeexceed, typename typP>
342 void construct_matrix_from_newpol_nofree(typMat &mat, typPk &tmpPk,
343  typMk &tmpMk, typexceed &exceed,
344  typsizeexceed &sizeexceed, typP &P)
345  {
346  typedef typename typP::value_type::order_t ord;
347  typedef typename typPk::value_type pol;
348  typedef typename pol::coeff_t coeff;
349  typedef typename typP::value_type polyalp;
350  int nnz=0,*ncol;
351  //memset((void*)ncol,0,(*mat)->ncol*sizeof(int));
352  map<mon,int,ord> mapint;
353  typename typMk::iterator itermk=tmpMk.begin();
354  typename typPk::iterator iterpk=tmpPk.begin();
355  // typename list<mon*>::iterator iterex=exceed.begin();
356  typename typexceed::iterator iterex=exceed.begin();
357  typename typsizeexceed::iterator itersize=sizeexceed.begin();
358  //#ifdef modifnewpk
359  typsizeexceed tmpsizeex;
360  //#endif
361  int line_num=0;
362  mat.nrow=tmpPk.size();
363  mat.ncol=tmpMk.size();
364  ncol=(int*)calloc(mat.ncol,sizeof(int));
365  //
366  //On crée une map pour indexer les colonnes
367  //
368  for(int i=0;itermk!=tmpMk.end();i++,itermk++)
369  {
370  mapint[*itermk]=i;
371  }
372  iterpk=tmpPk.begin();
373  nnz=0;
374  for(;iterpk!=tmpPk.end();iterpk++,iterex++,itersize++,line_num++)
375  {
376  //#ifdef modifnewpk
377  int tmp=0;
378  //#endif
379  {
380  // coeff tmpcoeff=(iterpk->ind).GetCoeff()-(coeff)1;
381  for(int i=0;*itersize>i;i++)
382  {
383  //cout<<"iterpk icici ->GetCoeff()"<<iterpk->ind.GetCoeff()<<endl;
384  if (mapint.count((*iterex)[i]))
385  {
386  ++ncol[mapint[(*iterex)[i]]];
387  }
388  //#ifdef modifnewpk
389  else
390  {
391  tmp++;
392  }
393  //#endif
394  }
395  //#ifdef modifnewpk
396  nnz+=*itersize-tmp;
397  tmpsizeex.push_back(tmp);
398  //#endif
399  }
400  }
401  //fin rajout c pour prendre en compte que lors de
402  //de la proj le monome de tete se trouve dans exceed
403  //fin enlevement
404  cout<<"nnz of matrix "<<nnz<<endl;
405  //en general la matrice est rectangulaire
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>
408  (mat.nzval,mat.nnz
409  *sizeof(typename typMat::coeff_t));
410  mat.nnz=nnz;
411  mat.nzval=toto;
412 
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;
418  //matrice cree rest plus qu'a ecrire dedans ca
419  typename typMat::coeff_t* nzval=(typename typMat::coeff_t*)mat.nzval;
420  int *rowind=mat.rowind;
421  int *colptr=mat.colptr;
422  //mise en place des colptr
423  *colptr=0;
424  for(int i=0;i<mat.ncol-1;i++)
425  {
426  colptr[i+1]=colptr[i]+ncol[i];
427  }
428  colptr[mat.ncol]=mat.nnz;
429 
430  //fin mise en place
431  //la on fait des manip symboliques pour savoir ou ecrire
432  //les coeffs de chaques colonnes ca evite d'avoir a les
433  //recopier 50000 fois pour construire la matrice
434  //c bcp plus rapide
435  itermk=tmpMk.begin();
436  iterpk=tmpPk.begin();
437  iterex=exceed.begin();
438  itersize=sizeexceed.begin();
439  line_num=0;
440  //#ifdef modifnewpk
441  auto itertmp=tmpsizeex.begin();
442  //#endif
443  for(;(iterpk!=tmpPk.end());iterpk++,iterex++,itersize++,line_num++,itertmp++)
444  {
445  //#ifdef modifnewpk
446  int ktmp=0;
447  mon *tmpex=(mon*)MAC_REV_MALLOC<mon>(*itertmp*sizeof(mon));
448  //#endif
449  {
450  for(int i=0;*itersize>i;i++)
451  {
452  //#ifdef modifnewpk
453  if(mapint.count((*iterex)[i]))
454  {
455  //#endif
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]]
461  =stock;
462  rowind[colptr[tmpplusex]-ncol[tmpex]]=line_num;
463  ncol[tmpex]--;
464  //#ifdef modifnewpk
465  }
466  else
467  {
468  tmpex[ktmp++]=(*iterex)[i];
469  }
470  //#endif
471  }
472  }
473  MAC_REV_FREE<mon>(*iterex,*itersize*sizeof(mon));
474  //#ifdef modifnewpk
475  *iterex=tmpex;
476 // cout<<"itersize "<<*itersize<<" itertmp "<<*itertmp<<endl;
477  *itersize=*itertmp;
478 // cout<<"regarde ici "<<iterpk->ind<<endl;
479 // for(int i=0;i<*itertmp;i++)
480 // cout<<"ccccccccccccc "<<(*iterex)[i]<<endl;
481  //#endif
482  }
483  free(ncol);
484 
486  for(typename typPk::iterator iterpk=tmpPk.begin()
487  ;iterpk!=tmpPk.end();iterpk++)
488  iterpk->ind.SetCoeff(1);
489  }
490 
491 #ifndef ASYNC
492 template<typename typMat,typename typPk,typename typP,
493  typename typMk,typename Base,typename typdump,typename typexceed,
494  typename typsizeexceed, typename workspace, typename monomial_server>
495 int newpkmkMatrixofSolve(typMat &mat,typMat & L,typPk &Pk, typP &P,typMk &Mk,
496  int &k,Base &b, typdump &dump,typexceed &exceed_ret,
497  typsizeexceed & sizeexceed_ret, workspace &w, monomial_server &serv)
498 {
499 
500 typedef typename typMk::value_type mon;
501  typedef typename typP::value_type::order_t ord;
502  typedef typename typPk::value_type pol;
503  typedef typename pol::coeff_t coeff;
504  typedef typename typP::value_type polyalp;
505  typedef component<vector<pol>,mon> compo;
506  typPk recall;//to be erased as soon as treat_crochet et compute_...
507  //have been patched
508  map<typename mon::rep_t,int> mon2face, mon2col;
509  vector<vector<int> > G;
510  vector<int> vec;
511  typPk tmpPk,workvect,convcrochet;
512  typMk tmpMk;
513  //list<mon *> exceed,exceedcrochet;
514  vector<mon *> exceed,exceedcrochet;
515  list<int> sizeexceed,sizeexceedcrochet;
516  int nbproj=0,flagdoplus=1;
517  int nbcompo=0,*pr,*pc;
518  list<compo>listcomp;
519  compo crochet;//ceci est le regroupement des crochet
520  // list<list<mon *> > listexceed;
521  // list<list<int> > listsizeexceed;
522  int indexinside=0;
523  //
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());
527  //prise en compte des pol pas encore introduits
528  cerr<<"k on entering newpkmkmatrixof "<<k<<endl;
529  typP ttmpP=Crochet(P,k+1);//
530  if (!ttmpP.empty())
531  {
532 //flagdo plus est positinne dans cett fonction au cas ou il ait chute de degre
533  treat_noempty_crochet(P, ttmpP, tmpPk, tmpMk, Pk,
534  Mk, dump, b, flagdoplus, k, recall, exceed, sizeexceed, serv);
535  cout<<"en sortie tmpPk.size "<<tmpPk.size()<<endl;
536  }
537  if(flagdoplus)
538  {
539  cout<<"newpol"<<endl;
540  compute_newpol(Pk,tmpPk,tmpMk,dump,exceed,sizeexceed, b, k, recall, w,serv);
541  cout<<"fin newpol"<<endl;
542  }
543  //Ces polynome la n'ont pas d'ind à proprement parler
544  //Il ne faut pas les prendre en compte pour faire le graph
545  //
546  //
547  //Il faut effacer tmpMk et le reconstruire apres coup en
548  //fonction des composantes fortement connexes decouvertes
549  //
550 
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());
557 #ifdef DEBUG1
558  cout<<"crochet "<<endl;
559  for(int i=0;i<crochet.poly.size();i++)
560  {
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;
564  }
565 #endif
566  //
567  // cout<<"icccccccccccccccccccccccccccccccccccccccccccccccccccccci"<<endl;
568  auto itersizeexceed=sizeexceed.begin();
569  // for(auto &p : exceed)
570  // copy(p,p+*(itersizeexceed++),ostream_iterator<mon>(cout," "));
571  //crochet.sizeexceed=sizeexceedcrochet;
574  //relire ce suit pour verifier les matrices pas carres
577 
578  //On constuit le graphe
579  //Revoir l'alloc de G
580 
581 compute_ancestors(tmpPk,b);
582  makegraph(G, tmpPk, exceed, sizeexceed, mon2face,b);
583  //On construit le grpahe et
584  //on conserve l'appairage entre les ind et le faces
585  vec.resize(G.size(),-1);
586 #ifdef DEBUG1
587  cout<<"le graph"<<endl;
588  for(auto &v : G)
589  {
590  for(auto i: v)
591  cout<<i<<", ";
592  cout<<endl;
593  }
594 #endif
595  cout<<"je rentre ds tarjan "<<G.size()<<" "<<tmpMk.size()<<endl;
596  tarjan( G, vec);
597  pr=(int *)malloc(tmpPk.size()*sizeof(int));
598  pc=(int *)malloc(tmpMk.size()*sizeof(int));
599  tmpMk.erase(tmpMk.begin(),tmpMk.end());
600  //
601  //On construit les listes de pol a partir des Comp Connexes
602  for_each(vec.begin(),vec.end(),[&nbcompo](int i){nbcompo=(nbcompo<i?i:nbcompo);});
603  //nbcompo est l'index de la derniere composante
604  for(int i=0;i<=nbcompo;i++)
605  {
606  typPk tmp;
607  list<mon*> tmpexceed;
608  list<int> tmpsizeexceed;
609  compo tmpcomp;
610  int j=0;
611  auto itersizeexceed=sizeexceed.begin();
612  auto iterexceed=exceed.begin();
613 
614  for_each(tmpPk.begin(),tmpPk.end(),
615  [&]
616  (typename typPk::value_type &iter)
617  {
618 #ifdef DEBUG
619  cout<<"mon2face "<<iter.ind.rep<<" "<<mon2face[iter.ind.rep]<<endl;
620  cout<<"vec[mon2face[iter.ind.rep]] "<<vec[mon2face[iter.ind.rep]]<<
621  " "<<i<<endl;
622 #endif
623  if(vec[mon2face[iter.ind.rep]]==i)
624  {
625  //tmp.push_back(iter);
626  tmpcomp.poly.push_back(iter);
627  //tmpsizeexceed.push_back(*itersizeexceed++);
628 #ifdef DEBUG
629  for(int i=0;i<*itersizeexceed;i++)
630  cout<<" "<<(*iterexceed)[i];
631  cout <<endl;
632 #endif
633  tmpcomp.sizeexceed.push_back(*itersizeexceed);
634  // tmpexceed.push_back($iterexceed++);
635 
636  tmpcomp.exceed.push_back(*iterexceed);
637  }
638  itersizeexceed++;
639  iterexceed++;
640  });//fin de la lambda et du foreach
641  // listcomp.push_back(tmp);
642  // listexceed.push_back(tmpexceed);
643  // listsizeexceed.push_back(tmpsizeexceed);
644  listcomp.push_back(tmpcomp);
645  }
646 #ifdef DEBUG
647  for(auto iter=listcomp.begin();iter!=listcomp.end();iter++)
648  {
649  for(auto &m : iter->poly)
650  cout<<"ind compo "<<m.ind<<endl;
651  cout<<"----------------------------------------------------------"<<endl;
652  }
653 #endif
654 //Pour chaque liste matrice + solve
655 // itersizeexceed=sizeexceed.begin();
656 // iterexceed=exceed!.begin();
657  int prout=0;
658  int numcompo=0;
659  cout<<"nb total de compo dans la loiste "<<listcomp.size()<<endl;
660  for(auto iter=listcomp.begin();iter!=listcomp.end();iter++,numcompo++)
661  {
662  //il faut construit tmpMK pour la composante
663  int *tmppr,*tmppc;
664  typMk verytmpMk;
665  typMat tmpmat;
666 #ifdef DEBUG1
667  cout<<"pour la composante "<<prout++<<endl;
668  {
669  auto toto=iter->sizeexceed.begin();
670  typename vector<pol>::iterator tutu=iter->poly.begin();
671  for(auto m : iter->exceed)
672  {
673  cout<<"sizeexceed ici "<<*toto<<endl;
674  copy(m,m+*(toto++),ostream_iterator<mon>(cout," + ")),cout<<endl;;
675  cout<<tutu->ind<<endl;
676  if(tutu->size)
677  copy(tutu->nf,tutu->nf+tutu->size,ostream_iterator<coeff>(cout," ")),cout<<endl;
678  cout<<invconv<Poly>(*(tutu++),serv)<<endl;
679  cout<<"------------------------------------ "<<endl;
680  }
681  }
682 #endif
683  for(auto &&iterind : iter->poly)
684  {
685  verytmpMk.push_back(iterind.ind);
686  // cout<<"je push "<<iterind.ind<<endl;
687  }
688  construct_matrix_from_newpol_nofree(tmpmat, iter->poly, verytmpMk,
689  iter->exceed, iter->sizeexceed, P);
690 
691 #ifdef DEBUG
692  cout<<"matrix of comp"<<endl;
693  affdebug(tmpmat);
694  cout<<"\e[32mpour la composante \e[37m"<<prout<<endl;
695  {
696  auto toto=iter->sizeexceed.begin();
697  typename vector<pol>::iterator tutu=iter->poly.begin();
698  for(auto m : iter->exceed)
699  {
700  copy(m,m+*(toto++),ostream_iterator<mon>(cout," - ")),cout<<endl;;
701  cout<<tutu->ind<<endl;
702  cout<<"size tutu "<<tutu->size<<endl;
703  if(tutu->size)
704  copy(tutu->nf,tutu->nf+tutu->size,ostream_iterator<coeff>(cout," "));
705  cout<<invconv<Poly>(*(tutu++),serv)<<endl;
706  cout<<"------------------------------------ "<<endl;
707  }
708  }
709 #endif
710 #ifdef DEBUG
711  cout<<"la petite matrice"<<endl;
712  affdebug(tmpmat);
713 #endif
714  /*
715  modifier constructmatrix pour ressortir les exceed a cote de la composante
716  //FAIT
717  */
718 
719 
720  //P est la pour forwareder les types ord et pol
721  //On resoud
722  // pr et pc sont alloués avec malloc
723  // dans la fonction solve
724  // il faut les desallouer
725  //
726  //Ceci est une fonction solve a ecrire pour reporter
727  //les operations sur les poly aussi sur les exceed
728  //
729  Solve(tmpmat,L,*iter,&tmppr,&tmppc,verytmpMk,w,serv);
730 #ifdef DEBUG1
731  cout<<"\e[31mApres SOLVE \e[37m"<<prout<<endl;
732  {
733  auto toto=iter->sizeexceed.begin();
734  typename vector<pol>::iterator tutu=iter->poly.begin();
735  for(auto m : iter->exceed)
736  {
737  copy(m,m+*(toto++),ostream_iterator<mon>(cout," - ")),cout<<endl;;
738  cout<<tutu->ind<<endl;
739  cout<<invconv<Poly>(*(tutu++),serv)<<endl;
740  }
741  }
742 #endif
743 
744 // copy(tmppc,tmppc+verytmpMk.size(),ostream_iterator<int>(cout," "));
745 // cout<<endl;
746  // inverse(tmppc,verytmpMk.size());
747  // Dopermu(verytmpMk,tmppc);
748  for(auto &m :verytmpMk)
749  {
750  m.SetCoeff(1);
751  tmpMk.push_back(m);
752  }
753 #if 0
754  // ces operation sont faites dans reorder ind entre solveL et solveU
755  {
756  //ici on remet les ind a la bonne valeur
757  //a inclure dans une petite fonction inline apres
758  int j=0;
759  typename typMk::iterator itermon=verytmpMk.begin();
760 
761  for(auto iter_in_poly=iter->poly.begin();
762  itermon!=verytmpMk.end();iter_in_poly++,itermon++,j++)
763  {
764  cout<<" dans verytmp "<<*itermon<<
765  invconv<typename typP::value_type>(*iter_in_poly,serv)<<endl;
766 
767  if(!Iszero(tmpmat(j,j)))
768  {
769  //cout<<"ligne "<<j<<" je mets le monome "<<*itermon<<" "<<iter->ind.GetCoeff()<<endl:
770  iter_in_poly->ind=*itermon;//*(iter_in_poly->ind.GetCoeff());
771  iter_in_poly->ind.SetCoeff(1);
772  }
773  else
774  {
775  //On rajoute aux exceed des autre polyn\çomes de la composante les
776  //les monomes correspondant a cette colonne
777  for(int i=tmpmat.colptr[j];i<tmpmat.colptr[j+1];i++)
778  if(!(((coeff*)tmpmat.nzval)[i]==0))
779  {
780  //il y a eu permiutation des colonnes il
781  // faut donc se fier a itermon plutot qu'aux ind
782  mon tmpmon=*itermon;//iter_in_poly->ind;
783  coeff tmpcoeff=((coeff*)tmpmat.nzval)[i];
784  //Bon maintenant on regarde si le coefficient diagonal de U de la
785  //ligne tmpmat.rowind[i] est non nul et si c'est le cas
786  //il fautr diviser par lui
787  if(!Iszero(tmpmat(tmpmat.rowind[i],tmpmat.rowind[i])))
788  tmpcoeff/=tmpmat(tmpmat.rowind[i],tmpmat.rowind[i]);
789  //Apres on peut affecter
790  tmpmon.SetCoeff(tmpcoeff);
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));
795 
796  iter->exceed[tmpmat.rowind[i]][iter->sizeexceed[tmpmat.rowind[i]]]=tmpmon;
797  iter->sizeexceed[tmpmat.rowind[i]]++;
798  }
799  iter_in_poly->ind=mon(0);
800 
801  }
802  }
803  }
804 #endif
805 #ifdef DEBUG11
806  cout<<"apres solve les poly de la compo"<<endl;
807  for(int i=0;i<iter->poly.size();i++)
808  {
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;
814  }
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;
819 
820 
821 #endif
822  cout<<"update "<<endl;
823  //mise a jour des autres polynomes et recnstruction de la matrice complete
824 #if 1
825  cout<<"la map"<<endl;
826  map<typename mon::rep_t,resmul<typename compo::typPk::value_type> > mon2pol;
827  {
828  auto iterexceed=iter->exceed.begin();
829  auto itersizeexceed=iter->sizeexceed.begin();
830  auto iterpoly=iter->poly.begin();
831  int i=0;
832  for(auto iterpoly=iter->poly.begin();iterpoly!=iter->poly.end();
833  iterpoly++,iterexceed++,itersizeexceed++,i++)
834  {
836  tmp.poly=*iterpoly;
837  tmp.exceed=*iterexceed;
838  tmp.sizeexceed=*itersizeexceed;
839  if(!(tmpmat(i,i)==0)) mon2pol[iterpoly->ind.rep]=tmp;
840  //on augmente le workspace pour update apres
841  for(;w.sizenf<iterpoly->sizenf;increase_space(&w));
842  }
843  }
844  cout<<"le graphe"<<endl;
845 #endif
846  //on regarde pour chaque sommet de la composante les arcs sortant
847  //ceux qui aboutissent a des sommets qui ne sont pas dans la compo
848  //indiquent un update a faire
849  vector<char> toupdate(nbcompo+1,0);
850  int indexcompo=0;
851 #if 1
852  for(int i_vec=0;i_vec<G.size();i_vec++)
853  {
854  if(vec[i_vec]==numcompo)
855  {
856  //on a trouvé un sommet dans la composante
857  //en cours de traitement
858  for(int j=0;j<G.size();j++)
859  {
860  // cout<<"G["<<j<<"]["<<i_vec<<"] "<<G[j][i_vec]<<endl;
861  // cout<<"<<<<<<"<<vec[j]<<" "<<numcompo<<endl;
862 // if(G[i_vec][j] && vec[j]!=numcompo)
863  if(G[j][i_vec] && vec[j]!=numcompo)
864  {
865  toupdate[vec[j]]=1;
866  //On rajoute les composantes qui vont m'updater
867  //a celle trouvee
868  for(int j_graph=0;j_graph<G.size();j_graph++)
869  G[j][j_graph]|=G[i_vec][j_graph];
870  //on a plus besoin re parser cet update
871  G[j][i_vec]=0;
872 
873  }
874  }
875  }
876  }
877 #endif
878  cout<<"calcul poly"<<endl;
879  for(auto itercomp=listcomp.begin();itercomp!=listcomp.end();
880  itercomp++,indexcompo++)
881  //le test est fait dans update pol
882  if(toupdate[indexcompo])
883  {
884 #ifdef DEBUG
885  cout<<"la compo a updater avant"<<endl;
886  for(int i=0;i<itercomp->poly.size();i++)
887  {
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;
893  }
894 #endif
895  update_pol(*itercomp,*iter,mon2pol,w,serv);
896 
897 #ifdef DEBUG
898  cout<<"la compo apres update"<<endl;
899  for(int i=0;i<itercomp->poly.size();i++)
900  {
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;
906  }
907 #endif
908  }
909 
910  //update_pol(*itercomp,*iter,w,serv);
911  // cout<<"fin update "<<endl;
912  update_pol(crochet,*iter,mon2pol,w,serv);//on fait uassi agir sur les polynomes du crochet
913  cout<<"fin des updates "<<endl;
914 #ifdef DEBUG
915  cout<<"apres update du crochet "<<endl;
916  for(int i=0;i<crochet.poly.size();i++)
917  {
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;
921  }
922 #endif
923  reconstruct_mat(mat,tmpmat);
924 #ifdef DEBUG1
925  affdebug(mat);
926  //il faut reconstruire les pr et pc globaux
927  cout<<"indexinside "<<indexinside<<endl;
928 #endif
929  reconstruct_pr_pc(pr,pc,tmppr,tmppc,tmpmat.ncol,indexinside);
930  indexinside+=verytmpMk.size();
931  free(tmppr);
932  free(tmppc);
933  }
934  //Reconstruction des tmpPk tmpMk classiques
935  // Pour la matrice
936  // On gere aussi ici le cas des coefficient des colonnes de pivot nul
937  //comme ca on connait les indices de ligne et colonne
938  //
939  typPk verytmpPk;
940 #ifdef DEBUG11
941  cout<<"les pol apres process newpkmk"<<endl;
942  for(auto &c : listcomp)
943  for(int i=0;i<c.poly.size();i++)
944  {
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;
950  }
951 #endif
952 
953  for(auto c : listcomp)
954  {
955  for(auto &p: c.poly)
956  verytmpPk.push_back(p);
957  for(auto &p: c.exceed)
958  exceed_ret.push_back(p);
959  for(auto &p: c.sizeexceed)
960  {
961  // cout<<"sizeexceed "<<p<<endl;
962  sizeexceed_ret.push_back(p);
963  }
964 
965  }
966  cout<<"apres reconstruction des Pk "<<endl;
967 #ifdef DEBUG
968  copy(sizeexceed_ret.begin(),sizeexceed_ret.end(),ostream_iterator<int>(cout," **--** "));cout<<endl;
969 #endif
970  //On rajoute les poly de crochet dans Pk
971  //ET (c'est important pour addB on incrmente nrow de mat en fonction
972  for(auto &p : crochet.poly)
973  {
974  p.ind=mon(0);
975  verytmpPk.push_back(p);
976  }
977  for(auto &p : crochet.exceed)
978  exceed_ret.push_back(p);
979  for(auto &p : crochet.sizeexceed)
980  sizeexceed_ret.push_back(p);
981 
982 #if 1
983  int indexmat=0;
984  for(auto m : tmpMk)
985  {
986  // cout<<"mon2col "<<m.rep<<" "<<indexmat<<endl;
987  mon2col[m.rep]=indexmat++;
988  }
989  indexmat=0;
990  cout<<"avant updatematrix "<<endl;
991 #ifdef DEBUG
992  copy(sizeexceed_ret.begin(),sizeexceed_ret.end(),ostream_iterator<int>(cout," **--** "));cout<<endl;
993 #endif
994 #if 1
995  //#ifdef GLOBALUPDATE
996  global_update_matrix(mat,listcomp,mon2col);
997 #else
998  for(auto c : listcomp)
999  {
1000  update_matrix(mat,c,mon2col,indexmat);
1001  indexmat+=c.poly.size();
1002  }
1003 #endif
1004  cout<<"apres updatematrix"<<endl;
1005  //affdebug(mat);
1006  //copy(sizeexceed_ret.begin(),sizeexceed_ret.end(),ostream_iterator<int>(cout," **--** "));cout<<endl;
1007 #endif
1008 
1009 
1010  mat.nrow+=crochet.poly.size();
1011 #ifdef DEBUG
1012  cout<<"verytmp"<<endl;
1013  for(auto &p :verytmpPk)
1014  cout<<invconv<typename typP::value_type>(p,serv)<<endl;
1015 #endif
1016  Pk=verytmpPk;
1017  Mk=tmpMk;
1018  return flagdoplus;
1019 }
1020 #endif
1021 //Fonction qui met a jour la matrice globale lorsque des sous matrices on ete de rang
1022 //deficient
1023 template<typename typmat, typename typlistcomp, typename typmap>
1024 void global_update_matrix(typmat &m, typlistcomp &listcomp, typmap &mon2col)
1025 {
1026  typedef typename typmat::coeff_t coeff;
1027  int *shiftcol=new int[m.ncol], *addcol=new int[m.ncol];
1028  int compnnz=0;
1029  int tmpligne=0;
1030 #ifdef DEBUG
1031  cout<<"en entree"<<endl;
1032  for(int i=0;i<m.nnz;i++)
1033  cout<<((coeff*)m.nzval)[i]<<"/"<<i<<" ";
1034  cout<<endl;
1035  for(int i=0;i<m.nnz;i++)
1036  cout<<m.rowind[i]<<"/"<<i<<" ";
1037  cout<<endl;
1038  cout<<"----------------------------------------"<<endl;
1039 #endif
1040  for(int i=0;i<m.ncol;i++)
1041  shiftcol[i]=0;
1042  // cout<<"boucle1"<<endl;
1043  for(auto c : listcomp)
1044  {
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++)
1049  {
1050  //on compte colonne par colonne les ajouts a faire
1051  for(int i=0;i<*itersizeexceed;i++)
1052  if (!Iszero((*iterexceed)[i].GetCoeff()))
1053  {
1054  shiftcol[mon2col[(*iterexceed)[i].rep]]++;
1055  //on compte le nombre total de nonzeor rajoutés
1056  compnnz++;
1057  }
1058  }
1059  }
1060 
1061  //On realloue la matrice
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));
1066  // if(compnnz==0) return;
1067  //on calcul les shift absolu de chaque colonne
1068  // cout<<"boucle2"<<endl;
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];
1073  //On decale les colonnes
1074  for(int i=m.ncol-1;i>0;i--)
1075  {
1076  for(int j=m.colptr[i+1]-1;j>=m.colptr[i];j--)
1077  {
1078  // cout<<j<<" "<< ((coeff*)m.nzval)[j]<<endl;
1079  ((coeff*)m.nzval)[j+shiftcol[i-1]]=((coeff*)m.nzval)[j];
1080  m.rowind[j+shiftcol[i-1]]=m.rowind[j];
1081  }
1082  }
1083  // cout<<"boucle3"<<endl;
1084  //on reparcour tout pour faire les mises a jour
1085  for(auto c : listcomp)
1086  {
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++)
1091  {
1092  for(int i=0;i<*itersizeexceed;i++)
1093  {
1094  if(!Iszero((*iterexceed)[i].GetCoeff()))
1095  {
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();
1099  // cout<<"G ecrit "<<(*iterexceed)[i].GetCoeff()<<endl;
1100  //cout<<"en colonne "<<numcol<<" ligne "<<m.colptr[numcol+1]+shiftcol[numcol]<<" "<<tmpligne<<endl;
1101 
1102  }
1103  }
1104  }
1105  }
1106  m.nnz+=compnnz;
1107 #ifdef DEBUG
1108  cout<<"compnnz "<<compnnz<<endl;
1109  for(int i=0;i<m.nnz;i++)
1110  cout<<((coeff*)m.nzval)[i]<<"/"<<i<<" ";
1111  cout<<endl;
1112  for(int i=0;i<m.nnz;i++)
1113  cout<<m.rowind[i]<<"/"<<i<<" ";
1114  cout<<endl;
1115 #endif
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];
1120  delete[] shiftcol;
1121  delete[] addcol;
1122 }
1123 
1124 template<typename typmat, typename typcomp, typename typmap>
1125 void update_matrix(typmat &m, typcomp &c, typmap &mon2col, int indexmat)
1126 {
1127  //On parcourt la composante
1128  //s'il reste des monomes dans les exceeds c'est des monomes de colonnes
1129  //de pivot nul
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();
1134  int numligne=0;
1135  for(;iterexceed!=c.exceed.end();iterexceed++,itersizeexceed++, iterpoly++,numligne++)
1136  {
1137  // cout<<"itersizeexceed "<<*itersizeexceed<<endl;
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++)
1143  {
1144  // cout<<(*iterexceed)[i]<<endl;
1145  if((*iterexceed)[i].rep!=iterpoly->ind.rep)//Ce test a Virer
1146  //Qd debug termineé { for(int j=m.nnz;j>=m.colptr[mon2col[(*iterexceed)[i].rep]+1];j--) { ((coeff*)m.nzval)[j]=((coeff*)m.nzval)[j-1]; m.rowind[j]=m.rowind[j-1]; } // cout<<"mon2col "<<(*iterexceed)[i].rep<<" "<<m.colptr[mon2col[(*iterexceed)[i].rep]+1]<<endl; m.nnz++; m.rowind[m.colptr[mon2col[(*iterexceed)[i].rep]+1]]=indexmat+numligne; //ICI MODIF DU 11 JANVIER //OUILLE OUILLE OUILLE // m.rowind[m.colptr[mon2col[(*iterexceed)[i].rep]+1]]=indexmat+i; ((coeff*)m.nzval)[m.colptr[mon2col[(*iterexceed)[i].rep]+1]]=(*iterexceed)[i].GetCoeff(); #ifdef DEBUG cout<<"G ecrit "<<(*iterexceed)[i].GetCoeff()<<endl; cout<<"en colonne "<<mon2col[(*iterexceed)[i].rep]<<" ligne "<<m.colptr[mon2col[(*iterexceed)[i].rep]+1]<<" "<<indexmat+numligne<<endl; #endif for(int j=mon2col[(*iterexceed)[i].rep]+1;j<=m.ncol;j++) m.colptr[j]++; //les colonnes d'apres commencent maintenant un cran plus ooin } } //MAC_REV_FREE<mon>(*iterexceed,*itersizeexceed*sizeof(mon)); //ICI c dans ADDB qu'on fait le FREE // } } // // Les polyn\^omes des autres composantes fortement connexes sont mis à jour en // fonction du resultat de l'inversion de la composante en cours // template <typename typcomp, typename typserv> void update_pol(typcomp &comp_to_update,typcomp &updating_comp, typserv &serv) { typedef typename typcomp::typPk typPk; typedef typename typserv::monom_t mon; typedef typename typcomp::pol pol; typedef typename pol::coeff_t coeff_t; // cout<<"rentre dans update"<<endl; if(comp_to_update==updating_comp) return; // cout<<"rentre dans compo pas les memes"<<endl; auto iterexceed=updating_comp.exceed.begin(); auto itersizeexceed=updating_comp.sizeexceed.begin(); auto iterpoly=updating_comp.poly.begin(); // // auto myitersize=updating_comp.sizeexceed.begin(); #ifdef DEBUG for(auto &i : updating_comp.poly) cout<<"ind qui update "<<i.ind<<" "<<*myitersize++<<endl; #endif myitersize=comp_to_update.sizeexceed.begin(); #ifdef DEBUG for(auto &i : comp_to_update.poly) cout<<"ind a up "<<i.ind<<" "<<*myitersize++<<endl; #endif //on créé l'association enter les ind et les structures correspondantes map<typename mon::rep_t,resmul<typename typPk::value_type> > mon2pol; for(;iterpoly!=updating_comp.poly.end();iterpoly++,iterexceed++,itersizeexceed++) { resmul<typename typPk::value_type> tmp; tmp.poly=*iterpoly; tmp.exceed=*iterexceed; tmp.sizeexceed=*itersizeexceed; mon2pol[iterpoly->ind.rep]=tmp; //on augmente le workspace pour update apres //for(;w->sizenf<iterpoly->sizenf;increase_space(w)); } iterexceed=comp_to_update.exceed.begin(); itersizeexceed=comp_to_update.sizeexceed.begin(); for(iterpoly=comp_to_update.poly.begin(); iterpoly!=comp_to_update.poly.end(); iterpoly++,iterexceed++,itersizeexceed++) //pour chaque polynome dans la composante a mettre a jour { //On construit une map pour l'exceed correspondant int k=0; map<typename mon::rep_t,COEFF> exceedmap; map<typename mon::rep_t,COEFF> nfmap;//il faudrait utiliser le workspace ici au lieu de cette map // cout<<"itersizexceed ici "<<*itersizeexceed<<endl; int pos_nf=0; int newsizenfind=iterpoly->sizenf; //augmente ici le workspace pour que la mise a jour //puisse se faire //for(;w->sizenf<iterpoly->sizenf;increase_space(w)); for(int i=0;i<iterpoly->sizenf;i++) if(iterpoly->nfind) { for(int j=0;j<8;j++) if(iterpoly->nfind[i]>>j&1) { mon tmp; serv.int2mon(8*i+j,tmp); nfmap[tmp.rep]=iterpoly->nf[pos_nf++]; } } for(int i=0;i<*itersizeexceed;i++) { //On ne rajoute pas dans exceedmap //les monomes de mon2pol! if(!mon2pol.count((*iterexceed)[i].rep)) exceedmap[(*iterexceed)[i].rep]= (*iterexceed)[i].GetCoeff(); } for(int i=0;i<*itersizeexceed;i++) { if(mon2pol.count((*iterexceed)[i].rep)) //On a trouvé un monome de la composante //qu'on utilise pour mettre a jour { const resmul<typename typPk::value_type> &tmpresmul=mon2pol[(*iterexceed)[i].rep]; // cout<<"je declenche une mise a jour par "<<tmpresmul.poly.ind<<endl; // cout<<" de "<<iterpoly->ind<<endl; if(newsizenfind<tmpresmul.poly.sizenf) newsizenfind=tmpresmul.poly.sizenf; // //A VERIFIER QUE //les exceedd sont modifié comme il faut pendant le solve //fait // cout<<"le coeff maj "<<(*iterexceed)[i].GetCoeff()<<endl; // cout<<"exceed avant "<<*itersizeexceed<<" tmpresmul.sizeexceed "<<tmpresmul.sizeexceed<<endl; // for(auto &i : exceedmap) // cout<<i.first<<" "<<i.second<<" "; // cout<<endl; for(int j=0;j<tmpresmul.sizeexceed;j++) { exceedmap[tmpresmul.exceed[j].rep]-= tmpresmul.exceed[j].GetCoeff()*(*iterexceed)[i].GetCoeff(); } // cout<<"nf avant"<<endl; // for(auto &i : nfmap) // cout<<i.first<<" "<<i.second<<" "; // cout<<endl; int pos_nfiter=0; for(int ii=0;ii<tmpresmul.poly.sizenf;ii++) if(tmpresmul.poly.nfind) { for(int j=0;j<8;j++) if(tmpresmul.poly.nfind[ii]>>j&1) { //ICI PASSER PAR LE WORKSPACE!! //ca evite mon2int et la map derriere! mon tmp; serv.int2mon(8*ii+j,tmp); #if 0 cout<<"mon mis a jour "<<tmp<<" "<<tmpresmul.poly.nf[pos_nfiter]<<endl; cout<<"nfmap "<<nfmap[tmp.rep]<<endl; cout<<tmpresmul.poly.nf[pos_nfiter]<<endl; cout<<(*iterexceed)[i].GetCoeff()<<endl; cout<<coeff_t(0)-tmpresmul.poly.nf[pos_nfiter] *(*iterexceed)[i].GetCoeff()<<endl; cout<<nfmap[tmp.rep]-tmpresmul.poly.nf[pos_nfiter] *(*iterexceed)[i].GetCoeff()<<endl; #endif nfmap[tmp.rep]-=tmpresmul.poly.nf[pos_nfiter] *(*iterexceed)[i].GetCoeff(); // cout<<"apres operation "<<nfmap[tmp.rep]<<endl; pos_nfiter++; } } #ifdef DEBUG cout<<"exceed apres"<<endl; for(auto &i : exceedmap) cout<<i.first<<" "<<i.second<<" "; cout<<endl; cout<<"nf apres"<<endl; for(auto &i : nfmap) cout<<i.first<<" "<<i.second<<" "; cout<<endl; #endif } } #ifdef DEBUG cout<<"nfmap.size() "<<nfmap.size()<<endl; cout<<"newsizenfind "<<newsizenfind<<" "<<(void*)iterpoly->nfind<<endl; #endif *iterexceed=(mon*)MAC_REV_REALLOC<mon>(*iterexceed,*itersizeexceed*sizeof(mon) ,exceedmap.size()*sizeof(mon)); iterpoly->nfind=(unsigned char *)realloc(iterpoly->nfind,newsizenfind); if(iterpoly->size != nfmap.size()) iterpoly->nf=(coeff_t*)MAC_REV_REALLOC<coeff_t>(iterpoly->nf, iterpoly->size*sizeof(coeff_t), nfmap.size()*sizeof(coeff_t)); for(int k=0;k<newsizenfind;k++) iterpoly->nfind[k]=0; for(auto iter : nfmap) { mon m(1); m.rep=iter.first; int place=serv.mon2int(m); iterpoly->nfind[place/8]|=(1<<(place%8)); } int posnf=0; for(int k=0;k<newsizenfind;k++) { if(iterpoly->nfind[k]) { for(int kk=0;kk<8;kk++) if((iterpoly->nfind[k]>>kk)&1) { mon m; serv.int2mon(8*k+kk,m); iterpoly->nf[posnf++]=nfmap[m.rep]; } } } iterpoly->size=nfmap.size(); iterpoly->sizenf=newsizenfind; for(auto iter : exceedmap) { mon tmpmon; tmpmon.rep=iter.first; tmpmon.coeff=iter.second; (*iterexceed)[k++]=tmpmon; } *itersizeexceed=exceedmap.size(); } } template <typename typcomp, typename typserv> void wrap_update_pol(typcomp &comp_to_update,typcomp &updating_comp, typserv &serv) { workspace<typename typcomp::pol::coeff_t> w; update_pol(comp_to_update,updating_comp,w,serv); destroy_space(&w); } template <typename typcomp, typename typwork, typename typserv> void update_pol(typcomp &comp_to_update,typcomp &updating_comp, typwork &w, typserv &serv) { typedef typename typcomp::typPk typPk; typedef typename typserv::monom_t mon; typedef typename typcomp::pol pol; typedef typename pol::coeff_t coeff_t; // cout<<"rentre dans update"<<endl; if(comp_to_update==updating_comp) return; // cout<<"rentre dans compo pas les memes"<<endl; auto iterexceed=updating_comp.exceed.begin(); auto itersizeexceed=updating_comp.sizeexceed.begin(); auto iterpoly=updating_comp.poly.begin(); // // auto myitersize=updating_comp.sizeexceed.begin(); #ifdef DEBUG for(auto &i : updating_comp.poly) cout<<"ind qui update "<<i.ind<<" "<<*myitersize++<<endl; #endif myitersize=comp_to_update.sizeexceed.begin(); #ifdef DEBUG for(auto &i : comp_to_update.poly) cout<<"ind a up "<<i.ind<<" "<<*myitersize++<<endl; #endif //on créé l'association enter les ind et les structures correspondantes map<typename mon::rep_t,resmul<typename typPk::value_type> > mon2pol; for(;iterpoly!=updating_comp.poly.end();iterpoly++,iterexceed++,itersizeexceed++) { resmul<typename typPk::value_type> tmp; tmp.poly=*iterpoly; tmp.exceed=*iterexceed; tmp.sizeexceed=*itersizeexceed; mon2pol[iterpoly->ind.rep]=tmp; //on augmente le workspace pour update apres for(;w.sizenf<iterpoly->sizenf;increase_space(&w)); } iterexceed=comp_to_update.exceed.begin(); itersizeexceed=comp_to_update.sizeexceed.begin(); for(iterpoly=comp_to_update.poly.begin(); iterpoly!=comp_to_update.poly.end(); iterpoly++,iterexceed++,itersizeexceed++) //pour chaque polynome dans la composante a mettre a jour { //On construit une map pour l'exceed correspondant int k=0; map<typename mon::rep_t,COEFF> exceedmap; map<typename mon::rep_t,COEFF> nfmap;//il faudrait utiliser le workspace ici au lieu de cette map // cout<<"itersizexceed ici "<<*itersizeexceed<<endl; int pos_nf=0; int newsizenfind=iterpoly->sizenf; //augmente ici le workspace pour que la mise a jour //puisse se faire for(;w.sizenf<iterpoly->sizenf;increase_space(&w)); for(int i=0;i<iterpoly->sizenf;i++) if(iterpoly->nfind) { w.tabnf[i]=iterpoly->nfind[i]; tabfun1[w.tabnf[i]](w.tabcoeff+(8*i),iterpoly->nf+pos_nf); pos_nf+=nbbits[iterpoly->nfind[i]]; } for(int i=0;i<*itersizeexceed;i++) { //On ne rajoute pas dans exceedmap //les monomes de mon2pol! if(!mon2pol.count((*iterexceed)[i].rep)) exceedmap[(*iterexceed)[i].rep]= (*iterexceed)[i].GetCoeff(); } for(int i=0;i<*itersizeexceed;i++) { if(mon2pol.count((*iterexceed)[i].rep)) //On a trouvé un monome de la composante //qu'on utilise pour mettre a jour { resmul<typename typPk::value_type> &tmpresmul=mon2pol[(*iterexceed)[i].rep]; if(newsizenfind<tmpresmul.poly.sizenf) newsizenfind=tmpresmul.poly.sizenf; for(int j=0;j<tmpresmul.sizeexceed;j++) { exceedmap[tmpresmul.exceed[j].rep]-= tmpresmul.exceed[j].GetCoeff()*(*iterexceed)[i].GetCoeff(); } int pos_nfiter=0; for(int ii=0;ii<tmpresmul.poly.sizenf;ii++) if(tmpresmul.poly.nfind) { coeff_t tmp=(*iterexceed)[i].GetCoeff(); w.tabnf[ii]=tmpresmul.poly.nfind[ii]; tabfun2[w.tabnf[ii]](w.tabcoeff+(8*ii), &tmp, tmpresmul.poly.nf+pos_nfiter); pos_nfiter+=nbbits[tmpresmul.poly.nfind[ii]]; } #ifdef DEBUG cout<<"exceed apres"<<endl; for(auto &i : exceedmap) cout<<i.first<<" "<<i.second<<" "; cout<<endl; cout<<"nf apres"<<endl; for(auto &i : nfmap) cout<<i.first<<" "<<i.second<<" "; cout<<endl; #endif } } #ifdef DEBUG cout<<"newsizenfind "<<newsizenfind<<" "<<(void*)iterpoly->nfind<<endl; cout<<"w.sizenf "<<w.sizenf<<endl; #endif *iterexceed=(mon*)MAC_REV_REALLOC<mon>(*iterexceed,*itersizeexceed*sizeof(mon) ,exceedmap.size()*sizeof(mon)); iterpoly->nfind=(unsigned char *)realloc(iterpoly->nfind,newsizenfind); int newsize=0; for(int i=0;i<w.sizenf;newsize+=nbbits[w.tabnf[i++]]); iterpoly->nf=(coeff_t*)MAC_REV_REALLOC<coeff_t>(iterpoly->nf, iterpoly->size*sizeof(coeff_t), newsize*sizeof(coeff_t)); for(int k=0;k<newsizenfind;k++) { iterpoly->nfind[k]=w.tabnf[k]; w.tabnf[k]=0; } for(int k=0;k<newsize;k++) { iterpoly->nf[k]=w.tabcoeff[k]; w.tabcoeff[k]=0; } iterpoly->size=newsize; iterpoly->sizenf=newsizenfind; for(auto iter : exceedmap) { mon tmpmon; tmpmon.rep=iter.first; tmpmon.coeff=iter.second; (*iterexceed)[k++]=tmpmon; } *itersizeexceed=exceedmap.size(); } } template <typename typcomp, typename typmon2pol, typename typserv> void wrap_update_pol(typcomp &comp_to_update,const typcomp &updating_comp, const typmon2pol &mon2pol, const typserv &serv) { workspace<typename typcomp::pol::coeff_t> w; w.sizenf=0; w.size=0; w.tabnf=NULL; w.tabcoeff=NULL; for(auto &p : updating_comp.poly) for(;w.sizenf<=p.sizenf;increase_space(&w)); update_pol(comp_to_update,updating_comp,mon2pol,w,serv); destroy_space(&w); } template <typename typcomp, typename typmon2pol, typename typwork, typename typserv> void update_pol(typcomp &comp_to_update,const typcomp &updating_comp, const typmon2pol &mon2pol, typwork &w, const typserv &serv) { typedef typename typcomp::typPk typPk; typedef typename typserv::monom_t mon; typedef typename typcomp::pol pol; typedef typename pol::coeff_t coeff_t; // cout<<"rentre dans update"<<endl; if(comp_to_update==updating_comp) return; // cout<<"rentre dans compo pas les memes"<<endl; auto iterexceed=comp_to_update.exceed.begin(); auto itersizeexceed=comp_to_update.sizeexceed.begin(); auto iterpoly=comp_to_update.poly.begin(); // // auto myitersize=updating_comp.sizeexceed.begin(); #ifdef DEBUG_UPDATE for(auto &i : updating_comp.poly) cout<<"ind qui update "<<i.ind<<" "<<*myitersize++<<endl; #endif myitersize=comp_to_update.sizeexceed.begin(); #ifdef DEBUG_UPDATE for(auto &i : comp_to_update.poly) cout<<"ind a up "<<i.ind<<" "<<*myitersize++<<endl; #endif //on créé l'association enter les ind et les structures correspondantes iterexceed=comp_to_update.exceed.begin(); itersizeexceed=comp_to_update.sizeexceed.begin(); for(iterpoly=comp_to_update.poly.begin(); iterpoly!=comp_to_update.poly.end(); iterpoly++,iterexceed++,itersizeexceed++) //pour chaque polynome dans la composante a mettre a jour { //On construit une map pour l'exceed correspondant int k=0; map<typename mon::rep_t,COEFF> exceedmap; // cout<<"itersizexceed ici "<<*itersizeexceed<<endl; int pos_nf=0; int newsizenfind=iterpoly->sizenf; //augmente ici le workspace pour que la mise a jour //puisse se faire for(;w.sizenf<=iterpoly->sizenf;increase_space(&w)); for(int i=0;i<iterpoly->sizenf;i++) if(iterpoly->nfind) { w.tabnf[i]=iterpoly->nfind[i]; tabfun1[w.tabnf[i]](w.tabcoeff+(8*i),iterpoly->nf+pos_nf); pos_nf+=nbbits[iterpoly->nfind[i]]; } for(int i=0;i<*itersizeexceed;i++) { //On ne rajoute pas dans exceedmap //les monomes de mon2pol! if(!mon2pol.count((*iterexceed)[i].rep)) exceedmap[(*iterexceed)[i].rep]= (*iterexceed)[i].GetCoeff(); } for(int i=0;i<*itersizeexceed;i++) { if(mon2pol.count((*iterexceed)[i].rep)) //On a trouvé un monome de la composante //qu'on utilise pour mettre a jour { const resmul<typename typPk::value_type> &tmpresmul= mon2pol.find((*iterexceed)[i].rep)->second; if(newsizenfind<tmpresmul.poly.sizenf) newsizenfind=tmpresmul.poly.sizenf; for(int j=0;j<tmpresmul.sizeexceed;j++) { exceedmap[tmpresmul.exceed[j].rep]-= tmpresmul.exceed[j].GetCoeff()*(*iterexceed)[i].GetCoeff(); } int pos_nfiter=0; for(int ii=0;ii<tmpresmul.poly.sizenf;ii++) if(tmpresmul.poly.nfind[ii]) { coeff_t tmp=(*iterexceed)[i].GetCoeff(); w.tabnf[ii]|=tmpresmul.poly.nfind[ii]; // tabfun2[w.tabnf[ii]](w.tabcoeff+(8*ii), tabfun2[tmpresmul.poly.nfind[ii]](w.tabcoeff+(8*ii), &tmp, tmpresmul.poly.nf+pos_nfiter); pos_nfiter+=nbbits[tmpresmul.poly.nfind[ii]]; } } } #ifdef DEBUG_UPDATE cout<<"newsizenfind "<<newsizenfind<<" "<<(void*)iterpoly->nfind<<endl; cout<<"w.sizenf "<<w.sizenf<<endl; #endif *iterexceed=(mon*)MAC_REV_REALLOC<mon>(*iterexceed,*itersizeexceed*sizeof(mon) ,exceedmap.size()*sizeof(mon)); iterpoly->nfind=(unsigned char *)realloc(iterpoly->nfind,newsizenfind); int newsize=0; for(int i=0;i<w.sizenf;newsize+=nbbits[w.tabnf[i++]]); iterpoly->nf=(coeff_t*)MAC_REV_REALLOC<coeff_t>(iterpoly->nf, iterpoly->size*sizeof(coeff_t), newsize*sizeof(coeff_t)); #ifdef DEBUG_UPDATE cout<<"newsize "<<newsize<<endl; #endif for(int k=0;k<newsizenfind;k++) { iterpoly->nfind[k]=w.tabnf[k]; w.tabnf[k]=0; } // for(int k=0;k<newsize;k++) // { // iterpoly->nf[k]=w.tabcoeff[k]; // w.tabcoeff[k]=0; //} int tmpcompt=0; for(int k=0;k<newsizenfind;k++) { if(iterpoly->nfind[k]) { for(int j=0;j<8;j++) if((iterpoly->nfind[k]>>j)&1) { iterpoly->nf[tmpcompt++]=w.tabcoeff[8*k+j]; w.tabcoeff[8*k+j]=0; } } } iterpoly->size=newsize; iterpoly->sizenf=newsizenfind; #ifdef DEBUG_UPDATE cout<<"exceed apres "<<exceedmap.size()<<endl; for(auto &i : exceedmap) cout<<i.first<<" "<<i.second<<" "; cout<<endl; #endif for(auto iter : exceedmap) { mon tmpmon; tmpmon.rep=iter.first; tmpmon.coeff=iter.second; (*iterexceed)[k++]=tmpmon; } *itersizeexceed=exceedmap.size(); // cout<<"---------------------------"<<endl; } } //est sense reconstruire la matrice mat a partir //des matrices correspondant aux composantes fortmeùent connexes template<typename typMat> void reconstruct_mat(typMat &mat, const typMat &tmpmat) { typedef typename typMat::coeff_t coeff_t; #ifdef DEBUG cout<<"la petitee "<<tmpmat.nnz<<endl; affdebug(tmpmat); cout<<"la grosse "<<endl; if(mat.ncol) affdebug(mat); #endif mat.colptr=(int *)realloc(mat.colptr,(mat.ncol+tmpmat.ncol+1)*sizeof(int)); mat.nzval=MAC_REV_REALLOC<coeff_t>(mat.nzval,mat.nnz*sizeof(coeff_t), (mat.nnz+tmpmat.nnz)*sizeof(coeff_t)); mat.rowind=(int *)realloc(mat.rowind,(mat.nnz+tmpmat.nnz)*sizeof(int)); // for(int i=0;i<=tmpmat.ncol;i++) mat.colptr[mat.ncol+i]=mat.nnz+tmpmat.colptr[i]; // for(int i=0;i<tmpmat.nnz;i++) mat.rowind[mat.nnz+i]=mat.nrow+tmpmat.rowind[i]; // for(int i=0;i<tmpmat.nnz;i++) ((coeff_t *)mat.nzval)[mat.nnz+i]=((coeff_t *)tmpmat.nzval)[i]; mat.ncol+=tmpmat.ncol; mat.nrow+=tmpmat.nrow; mat.nnz+=tmpmat.nnz; #ifdef DEBUG cout<<"dans reconstruct mat.ncol en sortie "<<mat.ncol<<endl; cout<<"dans reconstruct mat.nrow en sortie "<<mat.nrow<<endl; #endif } void reconstruct_pr_pc(int *&pr,int *&pc,int *tmppr,int *tmppc,int sizetmp,int indexinside) { for(int i=0;i<sizetmp;i++) pr[i+indexinside]=tmppr[i]+indexinside; for(int i=0;i<sizetmp;i++) pc[i+indexinside]=tmppc[i]+indexinside; } template<typename typMat,typename typP,typename typPk,typename typMk, typename Base,typename typdump, class monomial_server, typename workspace> void init_algo(typP &P,int &nouveaumon, int &maxdeg, int & k, typPk &Pk, typMk & Mk, Base & b, typdump & dump, workspace &w, monomial_server &serv); template<typename typP,typename typPk,typename typdump,typename Base , template<typename T> class tmptypmat , template<typename mon, typename pol> class monomial_server, typename mon> void algo(typP P,typdump &dump,Base &b, monomial_server<mon,pol2ter<mon,typename mon::coeff_t> > &serv) { typedef typename typP::value_type polyalp; typedef list<typename typPk::value_type::monom_t> typMk; // typedef typename typMk::value_type mon; typedef typename typPk::value_type pol; typMk Mk; typMk Spoldejavu; typPk Pk,S; typPk recall; workspace<typename typP::value_type::coeff_t> w; typedef tmptypmat<typename typP::value_type::coeff_t> typMat; typMat Mat,L; int nouveaumon,allpolused=0,maxdeg,k,*pr,*pc; vector<typename typMk::value_type*> exceed; list<int> sizeexceed; //cout<<"avant init"<<endl; init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv); //cout<<"apres init"<<endl; #ifdef GOTZMANN int nextdim=-1; initial_mon(k,b,dump,serv); while((!critere_got(b,dump,serv))||(k<=maxdeg)) #else while(nouveaumon||(k<=maxdeg)) #endif { int killspol; // cout<<"Spolordsup"<<endl; S=Spolordsup(Pk,b,Spoldejavu); #ifdef CACABOUDIN for(typename typPk::iterator iter=S.begin();iter!=S.end();iter++) { // cout<<"poly de taille "<<iter->size<<endl; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } #endif #if 0//ICICICICICICICICICICCII cout<<"poly a la fin de la boulcle de l'algo "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) { // cout<<"poly de taille "<<iter->size<<endl; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } cout<<endl<<"newpkmkmatrixof"<<endl; #endif killspol=!newpkmkMatrixofSolve(Mat,L,Pk,P,Mk,k,b,dump,exceed,sizeexceed ,w,serv); #if 0//ICICICICICICICICCI cout<<"poly apres solve (attention exceed)"<<endl; copy(sizeexceed.begin(),sizeexceed.end(),ostream_iterator<int>(cout," *** "));cout<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) { cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } #endif if(killspol) S.erase(S.begin(),S.end()); if (k+1>=maxdeg) allpolused=1; if(Mk.size()==0) nouveaumon=0; // cout<<"le rang "<<my_rank(Mat)<<endl; // cout<<"Mk.size() "<<Mk.size()<<endl; // copy(Mk.begin(),Mk.end(),ostream_iterator<mon>(cout," ")); // cout<<endl; if ((unsigned)my_rank(Mat)==Mk.size()) //matrice de rang plein //donc tous les exceed sont vides { typMk tmpSpoldejavu; typPk redspol,secd=secondmembre(Mat,Pk);; //secondmembre2(Mat,Pk,secd); //typename typPk::iterator iter=Pk.begin(); cout<<"matrice de rang plein "<<endl; Dump(Pk,dump); #ifdef GOTZMANN nextmon(k,b,dump,serv); #endif cout<<"secd/size() "<<secd.size()<<endl; ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu); my_merge(redspol,secd); cout<<"redspol.size "<<redspol.size()<<endl; if(redspol.size()==0) { k++; my_merge(Spoldejavu,tmpSpoldejavu); L.destroystore(); continue; //la matrice a rang plein //ET les Spol\secondmembre de ce niveau se ,reduisent a 0 } else { //on a des spol\secondmembre qui se reduisent pas a 0 //cad un defaut de commuatation int tmpdeg=mindeg(redspol,serv); max_degppcm=k+2; nouveaumon=1; cout<<"redspol.size() "<<redspol.size()<<endl; if (tmpdeg==(k+1)) my_merge(Spoldejavu,tmpSpoldejavu); k=tmpdeg; recover(Pk,Mk,dump,k); forget(b,dump,k,recall); cout<<"debut newcrochetchoix"<<endl; NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); cout<<"fin newcrochetchoix"<<endl; NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); #ifdef GOTZMANN nextmon(k,b,dump,serv); #endif L.destroystore(); //misa jour de B dans crochet choix!! continue; } } else //la matrice n'est pas de rang plein { cout<<"matrice de rang pas plein "<<endl; typPk secd; cout<<"addB"<<endl; #ifdef DEBUG11 cout<<"avant addB "<<Pk.size()<<endl; auto iterexceed=exceed.begin(); auto itersizeexceed=sizeexceed.begin(); for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++,iterexceed++,itersizeexceed++) { cout<<"ind "<<iter->ind<<" est sikzeexceed "<<*itersizeexceed<<endl; copy(*iterexceed,*iterexceed+*itersizeexceed,ostream_iterator<mon>(cout," + ")); cout<<endl; cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } #endif AddB(Mat,Pk,Mk,exceed,sizeexceed,dump,b,serv); #if 0 cout<<"apres addB "<<Pk.size()<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) { cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } #endif // //secondmembre supprime des trucs dans Pk!! // // cout<<"second membre"<<endl; secd=secondmembre(Mat,Pk); // cout<<"voisin"<<endl; rajoute_voisins(Pk,Mk,dump,b,w,serv); // cout<<"fin voisin"<<endl; //ne selectionne que les non nuls if(secd.size()==0) { typPk redspol; Dump(Pk,dump); #ifdef GOTZMANN nextmon(k,b,dump,serv); #endif ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif if(redspol.size()==0) { k++; L.destroystore(); continue; //la matrice a pas rang plein second membre =0 //ET les Spol de ce niveau se ,reduisent a 0 } else { //on a des spol qui se reduisent pas a 0 //cad un defaut de commutation k=mindeg(redspol,serv); recover(Pk,Mk,dump,k); forget(b,dump,k,recall); cout<<"il ya un passage par mat rang pas" <<"plein et pol non zero"<<endl; NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv); NewDestroyredspol(redspol,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); #ifdef GOTZMANN nextmon(k,b,dump,serv); #endif L.destroystore(); continue; } } else { //on a des pol qui se reduisent pas a 0 //cad un defaut de commuatation dans les coins typPk redspol; Dump(Pk,dump); #ifdef GOTZMANN nextmon(k,b,dump,serv); #endif ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu); my_merge(secd,redspol); #ifdef NO_TWICE for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++) P.push_back(invconv<polyalp>(*iter)); #endif k=mindeg(secd,serv); recover(Pk,Mk,dump,k); forget(b,dump,k,recall); #if 0 cout<<"poly avant newcrochetchoix (attention exceed)"<<endl; copy(sizeexceed.begin(),sizeexceed.end(),ostream_iterator<int>(cout," *** "));cout<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) { cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } #endif NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv); #if 0 cout<<"poly apres newcrochetchoix (attention exceed)"<<endl; copy(sizeexceed.begin(),sizeexceed.end(),ostream_iterator<int>(cout," *** "));cout<<endl; for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++) { cout<<invconv<typename typP::value_type>(*iter,serv)<<endl; } #endif NewDestroyredspol(secd,Pk); serv.compress(Pk,dump,b,k); Dump(Pk,dump); #ifdef GOTZMANN nextmon(k,b,dump,serv); #endif L.destroystore(); continue; } } } Mat.destroystore(); //while nouveau mon etc... destroy_space(&w); cout<<"sortie d'algo flash et dimension "<<endl; return ;//dump; //comme ca on conserve le tri par degre des formes normales et //donc la construction des operateurs de multiplication se //fait plus vite.. :-) } template<typename mon, typename T,typename Base ,typename monomial_server> mon choice_naif(const pol2ter<mon,T> & p, const Base &b, monomial_server &serv) { list<mon> tmp; mon m; int maxdeg=-1,k=0; //int maxtmpdeg=0; for(int i=0;i<p.sizenf;i++) { if (p.nfind[i]) for(int j=0;j<8;j++) if(p.nfind[i]>>j&1) { mon tmpmon; serv.int2mon(8*i+j,tmpmon); if(tmpmon.GetDegree()>maxdeg) { tmp.erase(tmp.begin(),tmp.end()); maxdeg=tmpmon.GetDegree(); } if(tmpmon.GetDegree()==maxdeg) { tmpmon.SetCoeff(p.nf[k]); tmp.push_back(tmpmon); } k++; } } m=tmp.front(); // cout<<"monom choisi "<<m<<endl; return m; } template<typename mon, typename T,typename Base, typename monomial_server> mon choice_num(const pol2ter<mon,T> & p, const Base &b, monomial_server &serv) { list<mon> tmp; mon m; int maxdeg=-1,k=0; //int maxtmpdeg=0; for(int i=0;i<p.sizenf;i++) { if (p.nfind[i]) for(int j=0;j<8;j++) if(p.nfind[i]>>j&1) { mon tmpmon; serv.int2mon(8*i+j,tmpmon); if(tmpmon.GetDegree()>maxdeg) { tmp.erase(tmp.begin(),tmp.end()); maxdeg=tmpmon.GetDegree(); } if(tmpmon.GetDegree()==maxdeg) { tmpmon.SetCoeff(p.nf[k]); tmp.push_back(tmpmon); } k++; } } m=tmp.front(); for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++) { if(m.GetCoeff()<itertmp->GetCoeff()) {m=*itertmp;}; } //cout<<"--------------------------------------------------------------------------------"<<endl; // cout<<"monom choisi "<<m<<endl; //cout<<"pol"<<endl<<invconv<Poly>(p,serv)<<endl; //cout<<"--------------------------------------------------------------------------------"<<endl; return m; } template<typename mon, typename T,typename Base, typename monomial_server> mon choice_grevlex(const pol2ter<mon,T> & p,const Base &b, monomial_server &serv) { list<mon> tmp; mon m; int maxdeg=-1,k=0; //int maxtmpdeg=0; for(int i=0;i<p.sizenf;i++) { if (p.nfind[i]) for(int j=0;j<8;j++) if(p.nfind[i]>>j&1) { mon tmpmon; serv.int2mon(8*i+j,tmpmon); if((tmpmon.GetDegree()>maxdeg) && (p.nf[k]!=0) ) { tmp.erase(tmp.begin(),tmp.end()); maxdeg=tmpmon.GetDegree(); } if(tmpmon.GetDegree()==maxdeg) { tmpmon.SetCoeff(p.nf[k]); tmp.push_back(tmpmon); } k++; } } for(;tmp.front().GetCoeff()==0;tmp.pop_front()); m=tmp.front(); for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++) { if((itertmp->GetCoeff()!=0) && (my_ord(*itertmp,m)<0)) {m=*itertmp;}; } // cout<<"monom choisi "<<m<<endl; return m; } template<typename mon, typename T,typename Base, typename monomial_server> mon choice_dlex(const pol2ter<mon,T> & p,const Base &b, monomial_server &serv) { list<mon> tmp; mon m; int maxdeg=-1,k=0; //int maxtmpdeg=0; for(int i=0;i<p.sizenf;i++) { if (p.nfind[i]) for(int j=0;j<8;j++) if(p.nfind[i]>>j&1) { mon tmpmon; serv.int2mon(8*i+j,tmpmon); if(tmpmon.GetDegree()>maxdeg) { tmp.erase(tmp.begin(),tmp.end()); maxdeg=tmpmon.GetDegree(); } if(tmpmon.GetDegree()==maxdeg) { tmpmon.SetCoeff(p.nf[k]); tmp.push_back(tmpmon); } k++; } } m=tmp.front(); for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++) { if(my_ord(*itertmp,m)>0) {m=*itertmp;}; } // cout<<"monom choisi "<<m<<endl; return m; } template<typename mon, typename T,typename Base, typename monomial_server> mon choice_mac(const pol2ter<mon,T> & p,const Base &b, monomial_server &serv) { list<mon> tmp; mon m; int maxdeg=-1,k=0; int maxtmpdeg=0; for(int i=0;i<p.sizenf;i++) { if (p.nfind[i]) for(int j=0;j<8;j++) if(p.nfind[i]>>j&1) { mon tmpmon; serv.int2mon(8*i+j,tmpmon); if(tmpmon.GetDegree()>maxdeg && !Iszero(p.nf[k])) { tmp.erase(tmp.begin(),tmp.end()); maxdeg=tmpmon.GetDegree(); } if(tmpmon.GetDegree()==maxdeg && !Iszero(p.nf[k])) { tmpmon.SetCoeff(p.nf[k]); tmp.push_back(tmpmon); } k++; } } m=tmp.front(); for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++) { //cout<<"monomes regarde "<<*itertmp<<" Lavr "<<lvar(itertmp->rep)<<endl; for(int i=0;i<=lvar(itertmp->rep);i++) { if(itertmp->GetDegree(i)>=maxtmpdeg) { maxtmpdeg=itertmp->GetDegree(i); m=*itertmp; } } } return m; } template<typename mon, typename T,typename Base, typename monomial_server> mon choice_mpq(const pol2ter<mon,T> & p,const Base &b, monomial_server &serv) { int i,degp=Degree(p),k=0; int mini=INT_MAX; mon tmpmon; mon stockmon; for(i=0;i<p.sizenf;i++) if(p.nfind[i]) for(int j=0;j<8;j++) if(p.nfind[i]>>j&1) { serv.int2mon(8*i+j,tmpmon); if(tmpmon.GetDegree()==degp) { __mpz_struct *numref,*denref; numref=mpq_numref(&(p.nf[k].rep())); denref=mpq_denref(&(p.nf[k].rep())); if(mpz_size(numref)+ mpz_size(denref)<mini) { mini=mpz_size(mpq_numref(&(p.nf[k].rep())))+ mpz_size(mpq_denref(&(p.nf[k].rep()))); //cout<<"newmax "<<max<<endl; //cout<<" les monomes "<<*iter<<endl; stockmon=tmpmon*p.nf[k]; } } k++; } //cout<<"je retourne "<<stockmon<<endl; return stockmon; } template<typename mon, typename T, typename Base, typename monomial_server> mon choice_fall(const pol2ter<mon,T> & p, const Base &b, monomial_server &serv) { typedef typename mon::coeff_t coeff_t; int i,k=0; int maxi=-1; mon tmpmon; mon stockmon; mon res=choice_mac(p,b,serv); typename Base::const_iterator iterb; list<mon> tmplist; int degp=Degree(p,serv); #ifdef DEB cout<<"Degree(p) "<<degp<<endl; #endif for(i=0;i<p.sizenf;i++) if(p.nfind[i]) for(int j=0;j<8;j++) if((p.nfind[i]>>j)&1) { serv.int2mon(8*i+j,tmpmon); if ((tmpmon.GetDegree()==degp) && (!Iszero(p.nf[k]))) tmplist.push_back(tmpmon*p.nf[k]); k++; // cout<<"k "<<k<<" "<<tmpmon<<endl; } for(typename list<mon>::iterator iterlist=tmplist.begin() ;iterlist!=tmplist.end();iterlist++) { for(iterb=b.begin();iterb!=b.end();iterb++) { int isgood=0; for(int i=0;i<iterb->taille1;i++) if(isdivisible(iterb->accept[i],*iterlist,b)) {isgood=1;break;} for(int i=0;i<iterb->taille2;i++) if(isdivisible(iterb->refuse[i],*iterlist,b)) {isgood=0;break;} if(isgood) { for(int i=0;i<iterb->taille2;i++) { mon m=lcm(*iterlist,iterb->refuse[i]); int dist=0; for(int j=0;j<iterb->taille2;j++) if ((j!=i) && (isdivisible(iterb->refuse[j],m,b))) isgood=0; if(isgood) { for(int j=0;j<b.nbvar();j++) if(m.GetDegree(j)>iterb->refuse[i].GetDegree(j)) dist+=m.GetDegree(j)-iterb->refuse[i].GetDegree(j); if(dist>maxi) { res=*iterlist; maxi=dist; } } } } } } #if 1 cout<<"le pol "<<invconv<Poly>(p,serv)<<endl<<"le mon choisi "<<res<<endl; #endif return res; } #ifndef ASYNC template<typename typdump,typename Base,typename mon, typename workspace, typename monomial_server> pol<mon,COEFF> inline mult(int i,const pol<mon, COEFF> &p,const typdump &dump, const Base &b,mon **exce,int &exsize,workspace &w, monomial_server & serv) { static const mon monzero=mon(0); static COEFF zero=0; static int flag=1; pol<mon,COEFF> ret; (*exce)=(mon*)MAC_REV_MALLOC<mon>((p.size+1)*sizeof(mon)); int *stockindicetab=(int*)malloc(p.size*sizeof(int)); int noquo=0,maxind=0,pp=0,q=0; COEFF *tmpspace; if(flag) { init_pointer<COEFF>(); flag=0;cout<<"pouet pouet"<<endl; } //#ifdef DEBUG #ifdef DEBUG cout<<"ds mult je traite "<<p.ind<<" ---- "<<i<<endl; cout<<invconv<Poly>(p,serv)<<endl; cout<<"p.size "<<p.size<<endl; #endif for(int j=0;j<p.sizenf;++j) if (p.nfind[j]) { for(int k=0;k<8;k++) if((p.nfind[j]>>k)&1) { int stockindice2=serv.mulind(8*j+k,i,b); if(stockindice2<0) stockindice2=-1*(8*j+k)-1; stockindicetab[pp++]=stockindice2; if (stockindice2>=maxind) maxind=stockindice2; cout<<"stockindice2 "<<8*j+k<<" "<<i<<stockindice2<<endl; } } for(;maxind/8+1>=w.sizenf;increase_space(&w)); for(int j=0;j<pp;j++) if(stockindicetab[j]>=0) { w.tabcoeff[stockindicetab[j]]+=p.nf[j]; if(!Iszero(w.tabcoeff[stockindicetab[j]])) w.tabnf[stockindicetab[j]/8]|=1<<(stockindicetab[j]%8); } else { pol<mon,COEFF> tmp; tmp=serv.nf(i,-1*(stockindicetab[j]+1),dump,b); if (tmp.size!=-1) { int compteurtmp=0; //On fait un plus dense dans tmpspace int k,l; unsigned long *tmpptr=(unsigned long*)tmp.nfind; unsigned long mask=1; for(;tmp.sizenf>=w.sizenf;increase_space(&w)); for(k=0;k<tmp.sizenf/sizeof(unsigned long);k++) if(tmpptr[k]) { mask=tmpptr[k]; ((unsigned long*)w.tabnf)[k]|=mask; for(l=0;l<8*sizeof(unsigned long);l+=8,mask>>=8) { if(mask&255) { tabfun2[mask&255]( w.tabcoeff+(8*sizeof(unsigned long)*k+l) ,&(p.nf[j]),tmp.nf+compteurtmp); compteurtmp+=nbbits[mask&255]; } #if 0 for(int m=0;m<8;m++) if(Iszero(w.tabcoeff[8*k*sizeof(unsigned long)+l+m])) ((unsigned long*)w.tabnf)[k]&=~(1<<(l+m)); #endif } } for(k=tmp.sizenf-(tmp.sizenf%sizeof(unsigned long)) ;k<tmp.sizenf;k++) if(tmp.nfind[k]) { w.tabnf[k]|=tmp.nfind[k]; mask=1; for(l=0;l<8;l++,mask<<=1) { if(tmp.nfind[k]&mask) w.tabcoeff[8*k+l]-=p.nf[j]*tmp.nf[compteurtmp++]; if(Iszero(w.tabcoeff[8*k+l])) w.tabnf[k]&=~mask; } } } else { //On est tombé sur un monome du degre courant //qui est sur le bord mon tmpmon; (*exce)[noquo]=mon(i,1); serv.int2mon(-1*(stockindicetab[j]+1),tmpmon); (*exce)[noquo]*=tmpmon;//int2mon<mon>(j); (*exce)[noquo]*=p.nf[j]; ++noquo; }; } #ifdef ANCESTOR //On met juste a jour l'ancetre pour la construction du grpahe apres ret.ancestor=p.ancestor; #endif ret.ind=p.ind; ret.ind*=mon(i,1); (*exce)[noquo++]=ret.ind; exsize=noquo; (*exce)=(mon*)MAC_REV_REALLOC<mon>((*exce),(p.size+1)*sizeof(mon) ,(noquo)*sizeof(mon)); ret.ind.SetCoeff(noquo+1); ret.size=0; pp=0; for(int j=0;j<w.sizenf;j++) if(w.tabnf[j]) { for(int m=0;m<8;m++) if(Iszero(w.tabcoeff[8*j+m])) w.tabnf[j]&=~(1<<m); if(w.tabnf[j]) { ret.size+=nbbits[w.tabnf[j]]; pp=j; } } ret.nf=(COEFF*)MAC_REV_MALLOC<COEFF>(ret.size*sizeof(COEFF)); ret.sizenf=pp+1; ret.nfind=(unsigned char *)malloc(ret.sizenf); pp=0; for(int j=0;j<ret.sizenf;j++) { if(w.tabnf[j]) for(int k=0;k<8;k++) if((w.tabnf[j]>>k)&1) { ret.nf[pp++]=w.tabcoeff[8*j+k]; w.tabcoeff[8*j+k]=zero; } ret.nfind[j]=w.tabnf[j]; w.tabnf[j]=0; } free(stockindicetab); #ifdef DEBUG cout<<"en sortie"<<endl; cout<<invconv<Poly>(ret,serv)<<endl; copy(*exce,*exce+exsize,ostream_iterator<mon>(cout," + "));cout<<endl; cout<<"----------"<<endl; #endif return ret; } #endif #if 1 template<typename typmat,typename typPk, typename typMk,typename typdump, typename typexceed, typename typsizeexceed, typename typB,typename monomial_server> void AddB(const typmat & mat, typPk & Pk,const typMk &Mk,const typexceed & exceed, const typsizeexceed & sizeexceed, const typdump & dump, typB &b, monomial_server &serv) { typedef typename typPk::value_type pol; typedef typename pol::monom_t mon; typedef typename pol::coeff_t coeff_t; typename typPk::iterator iterpk=Pk.begin();; auto iterexceed=exceed.begin(); auto itersizeexceed=sizeexceed.begin(); predicat<mon> tmp; typename typMk::const_iterator iter=Mk.begin(); int r=my_rank(mat),comprefuse=0,compaccept=0; unsigned int i; //cout<<"DANS ADDB"<<endl; //cout<<"rang de la matrice m "<<r<<" Mk.size "<<Mk.size()<<endl; //cout<<"taille de la matrice "<<mat.nrow<<"x"<<mat.ncol<<endl; tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(r*sizeof(mon)); tmp.taille2=r; tmp.accept=(mon*)MAC_REV_MALLOC<mon>((Mk.size()-r)*sizeof(mon)); tmp.taille1=Mk.size()-r; //for(i=0;i<(unsigned)r;i++,iter++) // tmp.refuse[i]=*iter; iter=Mk.begin(); for(i=0;i<Mk.size();i++,iter++) { if(Iszero(mat(i,i))) { tmp.accept[compaccept++]=*iter; //cout<<"monome rajoute au quotient "<<*iter<<endl; } else { tmp.refuse[comprefuse++]=*iter; } } b.def.push_back(tmp); //bon maintenant que l'on vient de rajouter des //monomes au quotient il faut remttre les polynomes comme il faut iter=Mk.begin(); //cout<<"report"<<endl; //On fait une passe pour determiner les polynomes a modifier et on effectue //les modifications en lisant les exceed (au passage on FREE) for(unsigned int i=0;i<Pk.size();i++,iterpk++,iter++,iterexceed++,itersizeexceed++) { vector<sortstruct<coeff_t> > decal; int maxindex=-1; int expend=0; for(int j=0;j<*itersizeexceed;j++) if(!Iszero((*iterexceed)[j].GetCoeff())) //si des monomes nuls sortent comme coeff de la matrice //et bien on les prends pas { sortstruct<coeff_t> tmp; expend++; maxindex=max(maxindex,serv.mon2int((*iterexceed)[j])); tmp.index=serv.mon2int((*iterexceed)[j]); tmp.coeff=(*iterexceed)[j].GetCoeff(); decal.push_back(tmp); } // Si on a rien a rajouter on arrete // cout<<"decal.empty "<<decal.empty()<<endl; if(decal.empty()) continue; //on augmente la taille du polynome considere iterpk->nf=(typename mon::coeff_t*) MAC_REV_REALLOC<typename mon::coeff_t>(iterpk->nf ,iterpk->size*sizeof(typename mon::coeff_t) ,(iterpk->size+expend)*sizeof(typename mon::coeff_t)); if((maxindex/8)>=iterpk->sizenf) { iterpk->nfind=(unsigned char*) MAC_REV_REALLOC<unsigned char>(iterpk->nfind ,iterpk->sizenf,maxindex/8+1); for(int i=iterpk->sizenf;i<maxindex/8+1;i++) iterpk->nfind[i]=0; iterpk->sizenf=maxindex/8+1; } // la place est faite il reste plus qu'a decaler les monomes de iterpk->nf //pour intercaler eventuellment les nouveaux monomes stable_sort(decal.begin(),decal.end(),sortstructorder<coeff_t>()); int nbcoeff=iterpk->size-1; // cout<<"iterpk->sizenf "<<iterpk->sizenf<<endl; for(int j=iterpk->sizenf-1;j>=0;j--) { //cout<<"decal.index "<<decal.rbegin()->index<<endl; if(8*j>decal.rbegin()->index) for (int jj=0;jj<nbbits[iterpk->nfind[j]];jj++) { iterpk->nf[nbcoeff+decal.size()]= iterpk->nf[nbcoeff]; nbcoeff--; } else { int indexnf=decal.back().index; typename typMk::value_type tmpmon; //cout<<"8*j"<<8*j<<" indexnf "<<indexnf<<" valeur "<<decal.back().index<<endl; int jj=7; while(8*j<=decal.back().index) { indexnf=decal.back().index % 8; for (;jj>(indexnf);jj--) if(iterpk->nfind[j]&(1<<jj)) { iterpk->nf[nbcoeff+decal.size()]= iterpk->nf[nbcoeff]; nbcoeff--; } //cout<<"je rajoute "<<decal.back().coeff<<" a la place "<<nbcoeff+decal.size()<<endl; // if(nbcoeff+decal.size()+1<iterpk->size+expend) // cout<<"coeff apres "<<iterpk->nf[nbcoeff+decal.size()+1]<<endl; iterpk->nf[nbcoeff+decal.size()]=decal.back().coeff; iterpk->nfind[j]|=(1<<(indexnf)); // serv.int2mon(8*j+indexnf,tmpmon); // cout<<"monome a la place "<<decal.back().index<<" "<<tmpmon<<endl; // serv.int2mon(decal.back().index,tmpmon); // cout<<"monome a la place "<<decal.back().index<<" "<<tmpmon<<endl; decal.pop_back(); jj--; if(decal.empty()) break; } for (;jj>=0;jj--) if(iterpk->nfind[j]&(1<<jj)) { iterpk->nf[nbcoeff+decal.size()]= iterpk->nf[nbcoeff]; nbcoeff--; } if(decal.empty()) break; } } iterpk->size+=expend; MAC_REV_FREE<mon>(*iterexceed,*itersizeexceed*sizeof(mon)); } return; } #endif #ifdef ASYNC #include "pol2terspecial-async.hpp" #endif
1147  {
1148  for(int j=m.nnz;j>=m.colptr[mon2col[(*iterexceed)[i].rep]+1];j--)
1149  {
1150  ((coeff*)m.nzval)[j]=((coeff*)m.nzval)[j-1];
1151  m.rowind[j]=m.rowind[j-1];
1152  }
1153  // cout<<"mon2col "<<(*iterexceed)[i].rep<<" "<<m.colptr[mon2col[(*iterexceed)[i].rep]+1]<<endl;
1154  m.nnz++;
1155  m.rowind[m.colptr[mon2col[(*iterexceed)[i].rep]+1]]=indexmat+numligne;
1156  //ICI MODIF DU 11 JANVIER
1157  //OUILLE OUILLE OUILLE
1158 // m.rowind[m.colptr[mon2col[(*iterexceed)[i].rep]+1]]=indexmat+i;
1159  ((coeff*)m.nzval)[m.colptr[mon2col[(*iterexceed)[i].rep]+1]]=(*iterexceed)[i].GetCoeff();
1160 #ifdef DEBUG
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;
1163 #endif
1164  for(int j=mon2col[(*iterexceed)[i].rep]+1;j<=m.ncol;j++)
1165  m.colptr[j]++;
1166  //les colonnes d'apres commencent maintenant un cran plus ooin
1167 
1168  }
1169  }
1170  //MAC_REV_FREE<mon>(*iterexceed,*itersizeexceed*sizeof(mon));
1171  //ICI c dans ADDB qu'on fait le FREE
1172  //
1173  }
1174 
1175 }
1176 //
1177 // Les polyn\^omes des autres composantes fortement connexes sont mis à jour en
1178 // fonction du resultat de l'inversion de la composante en cours
1179 //
1180 template <typename typcomp, typename typserv>
1181 void update_pol(typcomp &comp_to_update,typcomp &updating_comp, typserv &serv)
1182 {
1183  typedef typename typcomp::typPk typPk;
1184  typedef typename typserv::monom_t mon;
1185  typedef typename typcomp::pol pol;
1186  typedef typename pol::coeff_t coeff_t;
1187 // cout<<"rentre dans update"<<endl;
1188  if(comp_to_update==updating_comp)
1189  return;
1190 // cout<<"rentre dans compo pas les memes"<<endl;
1191  auto iterexceed=updating_comp.exceed.begin();
1192  auto itersizeexceed=updating_comp.sizeexceed.begin();
1193  auto iterpoly=updating_comp.poly.begin();
1194  //
1195  //
1196 
1197  auto myitersize=updating_comp.sizeexceed.begin();
1198  #ifdef DEBUG
1199  for(auto &i : updating_comp.poly)
1200  cout<<"ind qui update "<<i.ind<<" "<<*myitersize++<<endl;
1201 #endif
1202  myitersize=comp_to_update.sizeexceed.begin();
1203  #ifdef DEBUG
1204  for(auto &i : comp_to_update.poly)
1205  cout<<"ind a up "<<i.ind<<" "<<*myitersize++<<endl;
1206 #endif
1207  //on créé l'association enter les ind et les structures correspondantes
1208  map<typename mon::rep_t,resmul<typename typPk::value_type> > mon2pol;
1209  for(;iterpoly!=updating_comp.poly.end();iterpoly++,iterexceed++,itersizeexceed++)
1210  {
1212  tmp.poly=*iterpoly;
1213  tmp.exceed=*iterexceed;
1214  tmp.sizeexceed=*itersizeexceed;
1215  mon2pol[iterpoly->ind.rep]=tmp;
1216  //on augmente le workspace pour update apres
1217  //for(;w->sizenf<iterpoly->sizenf;increase_space(w));
1218  }
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++)
1224  //pour chaque polynome dans la composante a mettre a jour
1225  {
1226  //On construit une map pour l'exceed correspondant
1227  int k=0;
1228  map<typename mon::rep_t,COEFF> exceedmap;
1229  map<typename mon::rep_t,COEFF> nfmap;//il faudrait utiliser le workspace ici au lieu de cette map
1230  // cout<<"itersizexceed ici "<<*itersizeexceed<<endl;
1231  int pos_nf=0;
1232  int newsizenfind=iterpoly->sizenf;
1233  //augmente ici le workspace pour que la mise a jour
1234  //puisse se faire
1235  //for(;w->sizenf<iterpoly->sizenf;increase_space(w));
1236  for(int i=0;i<iterpoly->sizenf;i++)
1237  if(iterpoly->nfind)
1238  {
1239  for(int j=0;j<8;j++)
1240  if(iterpoly->nfind[i]>>j&1)
1241  {
1242  mon tmp;
1243  serv.int2mon(8*i+j,tmp);
1244  nfmap[tmp.rep]=iterpoly->nf[pos_nf++];
1245  }
1246  }
1247  for(int i=0;i<*itersizeexceed;i++)
1248  {
1249  //On ne rajoute pas dans exceedmap
1250  //les monomes de mon2pol!
1251  if(!mon2pol.count((*iterexceed)[i].rep))
1252  exceedmap[(*iterexceed)[i].rep]=
1253  (*iterexceed)[i].GetCoeff();
1254  }
1255  for(int i=0;i<*itersizeexceed;i++)
1256  {
1257  if(mon2pol.count((*iterexceed)[i].rep))
1258  //On a trouvé un monome de la composante
1259  //qu'on utilise pour mettre a jour
1260  {
1261  const resmul<typename typPk::value_type> &tmpresmul=mon2pol[(*iterexceed)[i].rep];
1262 // cout<<"je declenche une mise a jour par "<<tmpresmul.poly.ind<<endl;
1263 // cout<<" de "<<iterpoly->ind<<endl;
1264  if(newsizenfind<tmpresmul.poly.sizenf)
1265  newsizenfind=tmpresmul.poly.sizenf;
1266  //
1267  //A VERIFIER QUE
1268  //les exceedd sont modifié comme il faut pendant le solve
1269  //fait
1270 // cout<<"le coeff maj "<<(*iterexceed)[i].GetCoeff()<<endl;
1271 // cout<<"exceed avant "<<*itersizeexceed<<" tmpresmul.sizeexceed "<<tmpresmul.sizeexceed<<endl;
1272 // for(auto &i : exceedmap)
1273 // cout<<i.first<<" "<<i.second<<" ";
1274 // cout<<endl;
1275  for(int j=0;j<tmpresmul.sizeexceed;j++)
1276  {
1277  exceedmap[tmpresmul.exceed[j].rep]-=
1278  tmpresmul.exceed[j].GetCoeff()*(*iterexceed)[i].GetCoeff();
1279  }
1280 // cout<<"nf avant"<<endl;
1281 // for(auto &i : nfmap)
1282 // cout<<i.first<<" "<<i.second<<" ";
1283 // cout<<endl;
1284  int pos_nfiter=0;
1285  for(int ii=0;ii<tmpresmul.poly.sizenf;ii++)
1286  if(tmpresmul.poly.nfind)
1287  {
1288  for(int j=0;j<8;j++)
1289  if(tmpresmul.poly.nfind[ii]>>j&1)
1290  {
1291  //ICI PASSER PAR LE WORKSPACE!!
1292  //ca evite mon2int et la map derriere!
1293  mon tmp;
1294  serv.int2mon(8*ii+j,tmp);
1295  #if 0
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;
1304  #endif
1305  nfmap[tmp.rep]-=tmpresmul.poly.nf[pos_nfiter]
1306  *(*iterexceed)[i].GetCoeff();
1307  // cout<<"apres operation "<<nfmap[tmp.rep]<<endl;
1308  pos_nfiter++;
1309 
1310  }
1311  }
1312 #ifdef DEBUG
1313  cout<<"exceed apres"<<endl;
1314  for(auto &i : exceedmap)
1315  cout<<i.first<<" "<<i.second<<" ";
1316  cout<<endl;
1317  cout<<"nf apres"<<endl;
1318  for(auto &i : nfmap)
1319  cout<<i.first<<" "<<i.second<<" ";
1320  cout<<endl;
1321 #endif
1322  }
1323  }
1324 #ifdef DEBUG
1325  cout<<"nfmap.size() "<<nfmap.size()<<endl;
1326  cout<<"newsizenfind "<<newsizenfind<<" "<<(void*)iterpoly->nfind<<endl;
1327 #endif
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)
1338  {
1339  mon m(1);
1340  m.rep=iter.first;
1341  int place=serv.mon2int(m);
1342  iterpoly->nfind[place/8]|=(1<<(place%8));
1343  }
1344  int posnf=0;
1345  for(int k=0;k<newsizenfind;k++)
1346  {
1347  if(iterpoly->nfind[k])
1348  {
1349  for(int kk=0;kk<8;kk++)
1350  if((iterpoly->nfind[k]>>kk)&1)
1351  {
1352  mon m;
1353  serv.int2mon(8*k+kk,m);
1354  iterpoly->nf[posnf++]=nfmap[m.rep];
1355  }
1356  }
1357  }
1358  iterpoly->size=nfmap.size();
1359  iterpoly->sizenf=newsizenfind;
1360  for(auto iter : exceedmap)
1361  {
1362  mon tmpmon;
1363  tmpmon.rep=iter.first;
1364  tmpmon.coeff=iter.second;
1365  (*iterexceed)[k++]=tmpmon;
1366  }
1367  *itersizeexceed=exceedmap.size();
1368  }
1369 }
1370 
1371 template <typename typcomp, typename typserv>
1372 void wrap_update_pol(typcomp &comp_to_update,typcomp &updating_comp, typserv &serv)
1373 {
1375  update_pol(comp_to_update,updating_comp,w,serv);
1376  destroy_space(&w);
1377 }
1378 template <typename typcomp, typename typwork, typename typserv>
1379 void update_pol(typcomp &comp_to_update,typcomp &updating_comp, typwork &w,
1380  typserv &serv)
1381 {
1382  typedef typename typcomp::typPk typPk;
1383  typedef typename typserv::monom_t mon;
1384  typedef typename typcomp::pol pol;
1385  typedef typename pol::coeff_t coeff_t;
1386 // cout<<"rentre dans update"<<endl;
1387  if(comp_to_update==updating_comp)
1388  return;
1389 // cout<<"rentre dans compo pas les memes"<<endl;
1390  auto iterexceed=updating_comp.exceed.begin();
1391  auto itersizeexceed=updating_comp.sizeexceed.begin();
1392  auto iterpoly=updating_comp.poly.begin();
1393  //
1394  //
1395 
1396  auto myitersize=updating_comp.sizeexceed.begin();
1397  #ifdef DEBUG
1398  for(auto &i : updating_comp.poly)
1399  cout<<"ind qui update "<<i.ind<<" "<<*myitersize++<<endl;
1400 #endif
1401  myitersize=comp_to_update.sizeexceed.begin();
1402  #ifdef DEBUG
1403  for(auto &i : comp_to_update.poly)
1404  cout<<"ind a up "<<i.ind<<" "<<*myitersize++<<endl;
1405 #endif
1406  //on créé l'association enter les ind et les structures correspondantes
1407  map<typename mon::rep_t,resmul<typename typPk::value_type> > mon2pol;
1408  for(;iterpoly!=updating_comp.poly.end();iterpoly++,iterexceed++,itersizeexceed++)
1409  {
1411  tmp.poly=*iterpoly;
1412  tmp.exceed=*iterexceed;
1413  tmp.sizeexceed=*itersizeexceed;
1414  mon2pol[iterpoly->ind.rep]=tmp;
1415  //on augmente le workspace pour update apres
1416  for(;w.sizenf<iterpoly->sizenf;increase_space(&w));
1417  }
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++)
1423  //pour chaque polynome dans la composante a mettre a jour
1424  {
1425  //On construit une map pour l'exceed correspondant
1426  int k=0;
1427  map<typename mon::rep_t,COEFF> exceedmap;
1428  map<typename mon::rep_t,COEFF> nfmap;//il faudrait utiliser le workspace ici au lieu de cette map
1429  // cout<<"itersizexceed ici "<<*itersizeexceed<<endl;
1430  int pos_nf=0;
1431  int newsizenfind=iterpoly->sizenf;
1432  //augmente ici le workspace pour que la mise a jour
1433  //puisse se faire
1434  for(;w.sizenf<iterpoly->sizenf;increase_space(&w));
1435  for(int i=0;i<iterpoly->sizenf;i++)
1436  if(iterpoly->nfind)
1437  {
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]];
1441  }
1442  for(int i=0;i<*itersizeexceed;i++)
1443  {
1444  //On ne rajoute pas dans exceedmap
1445  //les monomes de mon2pol!
1446  if(!mon2pol.count((*iterexceed)[i].rep))
1447  exceedmap[(*iterexceed)[i].rep]=
1448  (*iterexceed)[i].GetCoeff();
1449  }
1450  for(int i=0;i<*itersizeexceed;i++)
1451  {
1452  if(mon2pol.count((*iterexceed)[i].rep))
1453  //On a trouvé un monome de la composante
1454  //qu'on utilise pour mettre a jour
1455  {
1456  resmul<typename typPk::value_type> &tmpresmul=mon2pol[(*iterexceed)[i].rep];
1457  if(newsizenfind<tmpresmul.poly.sizenf)
1458  newsizenfind=tmpresmul.poly.sizenf;
1459  for(int j=0;j<tmpresmul.sizeexceed;j++)
1460  {
1461  exceedmap[tmpresmul.exceed[j].rep]-=
1462  tmpresmul.exceed[j].GetCoeff()*(*iterexceed)[i].GetCoeff();
1463  }
1464  int pos_nfiter=0;
1465  for(int ii=0;ii<tmpresmul.poly.sizenf;ii++)
1466  if(tmpresmul.poly.nfind)
1467  {
1468  coeff_t tmp=(*iterexceed)[i].GetCoeff();
1469  w.tabnf[ii]=tmpresmul.poly.nfind[ii];
1470  tabfun2[w.tabnf[ii]](w.tabcoeff+(8*ii),
1471  &tmp,
1472  tmpresmul.poly.nf+pos_nfiter);
1473  pos_nfiter+=nbbits[tmpresmul.poly.nfind[ii]];
1474 
1475  }
1476 #ifdef DEBUG
1477  cout<<"exceed apres"<<endl;
1478  for(auto &i : exceedmap)
1479  cout<<i.first<<" "<<i.second<<" ";
1480  cout<<endl;
1481  cout<<"nf apres"<<endl;
1482  for(auto &i : nfmap)
1483  cout<<i.first<<" "<<i.second<<" ";
1484  cout<<endl;
1485 #endif
1486  }
1487  }
1488 #ifdef DEBUG
1489  cout<<"newsizenfind "<<newsizenfind<<" "<<(void*)iterpoly->nfind<<endl;
1490  cout<<"w.sizenf "<<w.sizenf<<endl;
1491 #endif
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);
1495  int newsize=0;
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++)
1501  {
1502  iterpoly->nfind[k]=w.tabnf[k];
1503  w.tabnf[k]=0;
1504  }
1505  for(int k=0;k<newsize;k++)
1506  {
1507  iterpoly->nf[k]=w.tabcoeff[k];
1508  w.tabcoeff[k]=0;
1509  }
1510  iterpoly->size=newsize;
1511  iterpoly->sizenf=newsizenfind;
1512  for(auto iter : exceedmap)
1513  {
1514  mon tmpmon;
1515  tmpmon.rep=iter.first;
1516  tmpmon.coeff=iter.second;
1517  (*iterexceed)[k++]=tmpmon;
1518  }
1519  *itersizeexceed=exceedmap.size();
1520  }
1521 }
1522 template <typename typcomp, typename typmon2pol, typename typserv>
1523 void wrap_update_pol(typcomp &comp_to_update,const typcomp &updating_comp,
1524  const typmon2pol &mon2pol, const typserv &serv)
1525 {
1527  w.sizenf=0;
1528  w.size=0;
1529  w.tabnf=NULL;
1530  w.tabcoeff=NULL;
1531  for(auto &p : updating_comp.poly)
1532  for(;w.sizenf<=p.sizenf;increase_space(&w));
1533  update_pol(comp_to_update,updating_comp,mon2pol,w,serv);
1534  destroy_space(&w);
1535 }
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)
1539 {
1540  typedef typename typcomp::typPk typPk;
1541  typedef typename typserv::monom_t mon;
1542  typedef typename typcomp::pol pol;
1543  typedef typename pol::coeff_t coeff_t;
1544 // cout<<"rentre dans update"<<endl;
1545  if(comp_to_update==updating_comp)
1546  return;
1547 // cout<<"rentre dans compo pas les memes"<<endl;
1548  auto iterexceed=comp_to_update.exceed.begin();
1549  auto itersizeexceed=comp_to_update.sizeexceed.begin();
1550  auto iterpoly=comp_to_update.poly.begin();
1551  //
1552  //
1553 
1554  auto myitersize=updating_comp.sizeexceed.begin();
1555 #ifdef DEBUG_UPDATE
1556  for(auto &i : updating_comp.poly)
1557  cout<<"ind qui update "<<i.ind<<" "<<*myitersize++<<endl;
1558 #endif
1559  myitersize=comp_to_update.sizeexceed.begin();
1560 #ifdef DEBUG_UPDATE
1561  for(auto &i : comp_to_update.poly)
1562  cout<<"ind a up "<<i.ind<<" "<<*myitersize++<<endl;
1563 #endif
1564  //on créé l'association enter les ind et les structures correspondantes
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++)
1570  //pour chaque polynome dans la composante a mettre a jour
1571  {
1572  //On construit une map pour l'exceed correspondant
1573  int k=0;
1574  map<typename mon::rep_t,COEFF> exceedmap;
1575  // cout<<"itersizexceed ici "<<*itersizeexceed<<endl;
1576  int pos_nf=0;
1577  int newsizenfind=iterpoly->sizenf;
1578  //augmente ici le workspace pour que la mise a jour
1579  //puisse se faire
1580  for(;w.sizenf<=iterpoly->sizenf;increase_space(&w));
1581  for(int i=0;i<iterpoly->sizenf;i++)
1582  if(iterpoly->nfind)
1583  {
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]];
1587  }
1588  for(int i=0;i<*itersizeexceed;i++)
1589  {
1590  //On ne rajoute pas dans exceedmap
1591  //les monomes de mon2pol!
1592  if(!mon2pol.count((*iterexceed)[i].rep))
1593  exceedmap[(*iterexceed)[i].rep]=
1594  (*iterexceed)[i].GetCoeff();
1595  }
1596  for(int i=0;i<*itersizeexceed;i++)
1597  {
1598  if(mon2pol.count((*iterexceed)[i].rep))
1599  //On a trouvé un monome de la composante
1600  //qu'on utilise pour mettre a jour
1601  {
1602  const resmul<typename typPk::value_type> &tmpresmul=
1603  mon2pol.find((*iterexceed)[i].rep)->second;
1604  if(newsizenfind<tmpresmul.poly.sizenf)
1605  newsizenfind=tmpresmul.poly.sizenf;
1606  for(int j=0;j<tmpresmul.sizeexceed;j++)
1607  {
1608  exceedmap[tmpresmul.exceed[j].rep]-=
1609  tmpresmul.exceed[j].GetCoeff()*(*iterexceed)[i].GetCoeff();
1610  }
1611  int pos_nfiter=0;
1612  for(int ii=0;ii<tmpresmul.poly.sizenf;ii++)
1613  if(tmpresmul.poly.nfind[ii])
1614  {
1615  coeff_t tmp=(*iterexceed)[i].GetCoeff();
1616  w.tabnf[ii]|=tmpresmul.poly.nfind[ii];
1617  // tabfun2[w.tabnf[ii]](w.tabcoeff+(8*ii),
1618  tabfun2[tmpresmul.poly.nfind[ii]](w.tabcoeff+(8*ii),
1619  &tmp,
1620  tmpresmul.poly.nf+pos_nfiter);
1621  pos_nfiter+=nbbits[tmpresmul.poly.nfind[ii]];
1622 
1623  }
1624  }
1625  }
1626 #ifdef DEBUG_UPDATE
1627  cout<<"newsizenfind "<<newsizenfind<<" "<<(void*)iterpoly->nfind<<endl;
1628  cout<<"w.sizenf "<<w.sizenf<<endl;
1629 #endif
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);
1633  int newsize=0;
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));
1638 #ifdef DEBUG_UPDATE
1639  cout<<"newsize "<<newsize<<endl;
1640 #endif
1641  for(int k=0;k<newsizenfind;k++)
1642  {
1643  iterpoly->nfind[k]=w.tabnf[k];
1644  w.tabnf[k]=0;
1645  }
1646  // for(int k=0;k<newsize;k++)
1647  // {
1648  // iterpoly->nf[k]=w.tabcoeff[k];
1649  // w.tabcoeff[k]=0;
1650  //}
1651  int tmpcompt=0;
1652  for(int k=0;k<newsizenfind;k++)
1653  {
1654  if(iterpoly->nfind[k])
1655  {
1656  for(int j=0;j<8;j++)
1657  if((iterpoly->nfind[k]>>j)&1)
1658  {
1659  iterpoly->nf[tmpcompt++]=w.tabcoeff[8*k+j];
1660  w.tabcoeff[8*k+j]=0;
1661  }
1662  }
1663  }
1664  iterpoly->size=newsize;
1665  iterpoly->sizenf=newsizenfind;
1666 #ifdef DEBUG_UPDATE
1667  cout<<"exceed apres "<<exceedmap.size()<<endl;
1668  for(auto &i : exceedmap)
1669  cout<<i.first<<" "<<i.second<<" ";
1670  cout<<endl;
1671 #endif
1672  for(auto iter : exceedmap)
1673  {
1674  mon tmpmon;
1675  tmpmon.rep=iter.first;
1676  tmpmon.coeff=iter.second;
1677  (*iterexceed)[k++]=tmpmon;
1678  }
1679  *itersizeexceed=exceedmap.size();
1680  // cout<<"---------------------------"<<endl;
1681  }
1682 }
1683 //est sense reconstruire la matrice mat a partir
1684 //des matrices correspondant aux composantes fortmeùent connexes
1685 
1686 template<typename typMat>
1687 void reconstruct_mat(typMat &mat, const typMat &tmpmat)
1688 {
1689  typedef typename typMat::coeff_t coeff_t;
1690 #ifdef DEBUG
1691  cout<<"la petitee "<<tmpmat.nnz<<endl;
1692  affdebug(tmpmat);
1693  cout<<"la grosse "<<endl;
1694  if(mat.ncol)
1695  affdebug(mat);
1696 #endif
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));
1701  //
1702  for(int i=0;i<=tmpmat.ncol;i++)
1703  mat.colptr[mat.ncol+i]=mat.nnz+tmpmat.colptr[i];
1704  //
1705  for(int i=0;i<tmpmat.nnz;i++)
1706  mat.rowind[mat.nnz+i]=mat.nrow+tmpmat.rowind[i];
1707  //
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;
1713 #ifdef DEBUG
1714  cout<<"dans reconstruct mat.ncol en sortie "<<mat.ncol<<endl;
1715  cout<<"dans reconstruct mat.nrow en sortie "<<mat.nrow<<endl;
1716 #endif
1717 }
1718 
1719 
1720 void reconstruct_pr_pc(int *&pr,int *&pc,int *tmppr,int *tmppc,int sizetmp,int indexinside)
1721 {
1722  for(int i=0;i<sizetmp;i++)
1723  pr[i+indexinside]=tmppr[i]+indexinside;
1724 
1725  for(int i=0;i<sizetmp;i++)
1726  pc[i+indexinside]=tmppc[i]+indexinside;
1727 }
1728 
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,
1732  monomial_server &serv);
1733 
1734 template<typename typP,typename typPk,typename typdump,typename Base
1735  , template<typename T> class tmptypmat ,
1736  template<typename mon, typename pol> class monomial_server, typename mon>
1737 void algo(typP P,typdump &dump,Base &b,
1739 {
1740  typedef typename typP::value_type polyalp;
1741  typedef list<typename typPk::value_type::monom_t> typMk;
1742  // typedef typename typMk::value_type mon;
1743  typedef typename typPk::value_type pol;
1744 
1745  typMk Mk;
1746  typMk Spoldejavu;
1747  typPk Pk,S;
1748  typPk recall;
1750  typedef tmptypmat<typename typP::value_type::coeff_t> typMat;
1751  typMat Mat,L;
1752  int nouveaumon,allpolused=0,maxdeg,k,*pr,*pc;
1753  vector<typename typMk::value_type*> exceed;
1754  list<int> sizeexceed;
1755  //cout<<"avant init"<<endl;
1756 
1757  init_algo<typMat>(P,nouveaumon,maxdeg,k,Pk,Mk,b,dump,w,serv);
1758  //cout<<"apres init"<<endl;
1759 #ifdef GOTZMANN
1760  int nextdim=-1;
1761  initial_mon(k,b,dump,serv);
1762  while((!critere_got(b,dump,serv))||(k<=maxdeg))
1763 #else
1764  while(nouveaumon||(k<=maxdeg))
1765 #endif
1766  {
1767  int killspol;
1768  // cout<<"Spolordsup"<<endl;
1769  S=Spolordsup(Pk,b,Spoldejavu);
1770 #ifdef CACABOUDIN
1771  for(typename typPk::iterator iter=S.begin();iter!=S.end();iter++)
1772  {
1773  // cout<<"poly de taille "<<iter->size<<endl;
1774  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1775  }
1776 #endif
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++)
1780  {
1781  // cout<<"poly de taille "<<iter->size<<endl;
1782  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1783 }
1784  cout<<endl<<"newpkmkmatrixof"<<endl;
1785 #endif
1786  killspol=!newpkmkMatrixofSolve(Mat,L,Pk,P,Mk,k,b,dump,exceed,sizeexceed
1787  ,w,serv);
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++)
1792  {
1793 
1794  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1795  }
1796 #endif
1797  if(killspol) S.erase(S.begin(),S.end());
1798  if (k+1>=maxdeg) allpolused=1;
1799  if(Mk.size()==0) nouveaumon=0;
1800  // cout<<"le rang "<<my_rank(Mat)<<endl;
1801  // cout<<"Mk.size() "<<Mk.size()<<endl;
1802  // copy(Mk.begin(),Mk.end(),ostream_iterator<mon>(cout," "));
1803  // cout<<endl;
1804  if ((unsigned)my_rank(Mat)==Mk.size())
1805  //matrice de rang plein
1806  //donc tous les exceed sont vides
1807  {
1808  typMk tmpSpoldejavu;
1809  typPk redspol,secd=secondmembre(Mat,Pk);;
1810  //secondmembre2(Mat,Pk,secd);
1811  //typename typPk::iterator iter=Pk.begin();
1812  cout<<"matrice de rang plein "<<endl;
1813  Dump(Pk,dump);
1814 #ifdef GOTZMANN
1815  nextmon(k,b,dump,serv);
1816 #endif
1817  cout<<"secd/size() "<<secd.size()<<endl;
1818  ReduceSpol(S,dump,redspol,b,w,serv);//tmpSpoldejavu);
1819  my_merge(redspol,secd);
1820  cout<<"redspol.size "<<redspol.size()<<endl;
1821  if(redspol.size()==0)
1822  {
1823  k++;
1824  my_merge(Spoldejavu,tmpSpoldejavu);
1825  L.destroystore();
1826  continue;
1827  //la matrice a rang plein
1828  //ET les Spol\secondmembre de ce niveau se ,reduisent a 0
1829  }
1830  else
1831  {
1832  //on a des spol\secondmembre qui se reduisent pas a 0
1833  //cad un defaut de commuatation
1834  int tmpdeg=mindeg(redspol,serv);
1835  max_degppcm=k+2;
1836  nouveaumon=1;
1837  cout<<"redspol.size() "<<redspol.size()<<endl;
1838 
1839  if (tmpdeg==(k+1))
1840  my_merge(Spoldejavu,tmpSpoldejavu);
1841  k=tmpdeg;
1842 
1843  recover(Pk,Mk,dump,k);
1844 
1845  forget(b,dump,k,recall);
1846  cout<<"debut newcrochetchoix"<<endl;
1847  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
1848  cout<<"fin newcrochetchoix"<<endl;
1849 
1850  NewDestroyredspol(redspol,Pk);
1851  serv.compress(Pk,dump,b,k);
1852  Dump(Pk,dump);
1853 #ifdef GOTZMANN
1854  nextmon(k,b,dump,serv);
1855 #endif
1856  L.destroystore();
1857  //misa jour de B dans crochet choix!!
1858  continue;
1859  }
1860  }
1861  else
1862  //la matrice n'est pas de rang plein
1863  {
1864  cout<<"matrice de rang pas plein "<<endl;
1865  typPk secd;
1866  cout<<"addB"<<endl;
1867 #ifdef DEBUG11
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++)
1872  {
1873  cout<<"ind "<<iter->ind<<" est sikzeexceed "<<*itersizeexceed<<endl;
1874  copy(*iterexceed,*iterexceed+*itersizeexceed,ostream_iterator<mon>(cout," + "));
1875  cout<<endl;
1876  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1877  }
1878 #endif
1879  AddB(Mat,Pk,Mk,exceed,sizeexceed,dump,b,serv);
1880 #if 0
1881  cout<<"apres addB "<<Pk.size()<<endl;
1882  for(typename typPk::iterator iter=Pk.begin();iter!=Pk.end();iter++)
1883  {
1884  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1885  }
1886 #endif
1887  //
1888  //secondmembre supprime des trucs dans Pk!!
1889  //
1890  // cout<<"second membre"<<endl;
1891  secd=secondmembre(Mat,Pk);
1892  // cout<<"voisin"<<endl;
1893  rajoute_voisins(Pk,Mk,dump,b,w,serv);
1894  // cout<<"fin voisin"<<endl;
1895  //ne selectionne que les non nuls
1896  if(secd.size()==0)
1897  {
1898  typPk redspol;
1899  Dump(Pk,dump);
1900 #ifdef GOTZMANN
1901  nextmon(k,b,dump,serv);
1902 #endif
1903 
1904  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
1905 #ifdef NO_TWICE
1906 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
1907  P.push_back(invconv<polyalp>(*iter));
1908 #endif
1909  if(redspol.size()==0)
1910  {
1911  k++;
1912  L.destroystore();
1913  continue;
1914  //la matrice a pas rang plein second membre =0
1915  //ET les Spol de ce niveau se ,reduisent a 0
1916  }
1917  else
1918  {
1919  //on a des spol qui se reduisent pas a 0
1920  //cad un defaut de commutation
1921  k=mindeg(redspol,serv);
1922  recover(Pk,Mk,dump,k);
1923  forget(b,dump,k,recall);
1924  cout<<"il ya un passage par mat rang pas"
1925  <<"plein et pol non zero"<<endl;
1926  NewCrochetchoix(P,Pk,Mk,redspol,k,dump,b,recall,w,serv);
1927  NewDestroyredspol(redspol,Pk);
1928  serv.compress(Pk,dump,b,k);
1929  Dump(Pk,dump);
1930 #ifdef GOTZMANN
1931  nextmon(k,b,dump,serv);
1932 #endif
1933 
1934  L.destroystore();
1935  continue;
1936  }
1937  }
1938  else
1939  {
1940  //on a des pol qui se reduisent pas a 0
1941  //cad un defaut de commuatation dans les coins
1942  typPk redspol;
1943  Dump(Pk,dump);
1944 #ifdef GOTZMANN
1945  nextmon(k,b,dump,serv);
1946 #endif
1947  ReduceSpol(S,dump,redspol,b,w,serv);//,Spoldejavu);
1948  my_merge(secd,redspol);
1949 #ifdef NO_TWICE
1950 for(typename typPk::iterator iter=redspol.begin();iter!=redspol.end();iter++)
1951  P.push_back(invconv<polyalp>(*iter));
1952 #endif
1953  k=mindeg(secd,serv);
1954  recover(Pk,Mk,dump,k);
1955  forget(b,dump,k,recall);
1956 #if 0
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++)
1960  {
1961 
1962  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1963  }
1964 #endif
1965 
1966  NewCrochetchoix(P,Pk,Mk,secd,k,dump,b,recall,w,serv);
1967 #if 0
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++)
1971  {
1972 
1973  cout<<invconv<typename typP::value_type>(*iter,serv)<<endl;
1974  }
1975 #endif
1976 
1977  NewDestroyredspol(secd,Pk);
1978  serv.compress(Pk,dump,b,k);
1979  Dump(Pk,dump);
1980 #ifdef GOTZMANN
1981  nextmon(k,b,dump,serv);
1982 #endif
1983 
1984  L.destroystore();
1985  continue;
1986  }
1987 
1988  }
1989  }
1990 
1991  Mat.destroystore();
1992  //while nouveau mon etc...
1993  destroy_space(&w);
1994  cout<<"sortie d'algo flash et dimension "<<endl;
1995  return ;//dump;
1996  //comme ca on conserve le tri par degre des formes normales et
1997  //donc la construction des operateurs de multiplication se
1998  //fait plus vite.. :-)
1999 
2000 }
2001 
2002 
2003 template<typename mon, typename T,typename Base ,typename monomial_server>
2005 {
2006  list<mon> tmp;
2007  mon m;
2008  int maxdeg=-1,k=0;
2009  //int maxtmpdeg=0;
2010  for(int i=0;i<p.sizenf;i++)
2011  {
2012  if (p.nfind[i])
2013  for(int j=0;j<8;j++)
2014  if(p.nfind[i]>>j&1)
2015  {
2016  mon tmpmon;
2017  serv.int2mon(8*i+j,tmpmon);
2018  if(tmpmon.GetDegree()>maxdeg)
2019  {
2020  tmp.erase(tmp.begin(),tmp.end());
2021  maxdeg=tmpmon.GetDegree();
2022  }
2023  if(tmpmon.GetDegree()==maxdeg)
2024  {
2025  tmpmon.SetCoeff(p.nf[k]);
2026  tmp.push_back(tmpmon);
2027  }
2028  k++;
2029  }
2030  }
2031  m=tmp.front();
2032  // cout<<"monom choisi "<<m<<endl;
2033  return m;
2034 }
2035 
2036 template<typename mon, typename T,typename Base, typename monomial_server>
2037 mon choice_num(const pol2ter<mon,T> & p, const Base &b, monomial_server &serv)
2038 {
2039  list<mon> tmp;
2040  mon m;
2041  int maxdeg=-1,k=0;
2042  //int maxtmpdeg=0;
2043  for(int i=0;i<p.sizenf;i++)
2044  {
2045  if (p.nfind[i])
2046  for(int j=0;j<8;j++)
2047  if(p.nfind[i]>>j&1)
2048  {
2049  mon tmpmon;
2050  serv.int2mon(8*i+j,tmpmon);
2051  if(tmpmon.GetDegree()>maxdeg)
2052  {
2053  tmp.erase(tmp.begin(),tmp.end());
2054  maxdeg=tmpmon.GetDegree();
2055  }
2056  if(tmpmon.GetDegree()==maxdeg)
2057  {
2058  tmpmon.SetCoeff(p.nf[k]);
2059  tmp.push_back(tmpmon);
2060  }
2061  k++;
2062  }
2063  }
2064  m=tmp.front();
2065  for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2066  {
2067  if(m.GetCoeff()<itertmp->GetCoeff()) {m=*itertmp;};
2068  }
2069  //cout<<"--------------------------------------------------------------------------------"<<endl;
2070  // cout<<"monom choisi "<<m<<endl;
2071  //cout<<"pol"<<endl<<invconv<Poly>(p,serv)<<endl;
2072  //cout<<"--------------------------------------------------------------------------------"<<endl;
2073  return m;
2074 }
2075 
2076 template<typename mon, typename T,typename Base, typename monomial_server>
2078  monomial_server &serv)
2079 {
2080  list<mon> tmp;
2081  mon m;
2082  int maxdeg=-1,k=0;
2083  //int maxtmpdeg=0;
2084  for(int i=0;i<p.sizenf;i++)
2085  {
2086  if (p.nfind[i])
2087  for(int j=0;j<8;j++)
2088  if(p.nfind[i]>>j&1)
2089 
2090  {
2091  mon tmpmon;
2092  serv.int2mon(8*i+j,tmpmon);
2093  if((tmpmon.GetDegree()>maxdeg) && (p.nf[k]!=0) )
2094  {
2095  tmp.erase(tmp.begin(),tmp.end());
2096  maxdeg=tmpmon.GetDegree();
2097  }
2098  if(tmpmon.GetDegree()==maxdeg)
2099  {
2100  tmpmon.SetCoeff(p.nf[k]);
2101  tmp.push_back(tmpmon);
2102  }
2103  k++;
2104  }
2105  }
2106  for(;tmp.front().GetCoeff()==0;tmp.pop_front());
2107  m=tmp.front();
2108  for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2109  {
2110  if((itertmp->GetCoeff()!=0) && (my_ord(*itertmp,m)<0)) {m=*itertmp;};
2111  }
2112  // cout<<"monom choisi "<<m<<endl;
2113  return m;
2114 }
2115 
2116 template<typename mon, typename T,typename Base, typename monomial_server>
2118 {
2119  list<mon> tmp;
2120  mon m;
2121  int maxdeg=-1,k=0;
2122  //int maxtmpdeg=0;
2123  for(int i=0;i<p.sizenf;i++)
2124  {
2125  if (p.nfind[i])
2126  for(int j=0;j<8;j++)
2127  if(p.nfind[i]>>j&1)
2128  {
2129  mon tmpmon;
2130  serv.int2mon(8*i+j,tmpmon);
2131  if(tmpmon.GetDegree()>maxdeg)
2132  {
2133  tmp.erase(tmp.begin(),tmp.end());
2134  maxdeg=tmpmon.GetDegree();
2135  }
2136  if(tmpmon.GetDegree()==maxdeg)
2137  {
2138  tmpmon.SetCoeff(p.nf[k]);
2139  tmp.push_back(tmpmon);
2140  }
2141  k++;
2142  }
2143  }
2144  m=tmp.front();
2145  for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2146  {
2147  if(my_ord(*itertmp,m)>0) {m=*itertmp;};
2148  }
2149  // cout<<"monom choisi "<<m<<endl;
2150  return m;
2151 }
2152 
2153 
2154 template<typename mon, typename T,typename Base, typename monomial_server>
2156 {
2157  list<mon> tmp;
2158  mon m;
2159  int maxdeg=-1,k=0;
2160  int maxtmpdeg=0;
2161  for(int i=0;i<p.sizenf;i++)
2162  {
2163  if (p.nfind[i])
2164  for(int j=0;j<8;j++)
2165  if(p.nfind[i]>>j&1)
2166  {
2167  mon tmpmon;
2168  serv.int2mon(8*i+j,tmpmon);
2169  if(tmpmon.GetDegree()>maxdeg && !Iszero(p.nf[k]))
2170  {
2171  tmp.erase(tmp.begin(),tmp.end());
2172  maxdeg=tmpmon.GetDegree();
2173  }
2174  if(tmpmon.GetDegree()==maxdeg && !Iszero(p.nf[k]))
2175  {
2176  tmpmon.SetCoeff(p.nf[k]);
2177  tmp.push_back(tmpmon);
2178  }
2179  k++;
2180  }
2181  }
2182  m=tmp.front();
2183  for(typename list<mon>::iterator itertmp=tmp.begin();itertmp!=tmp.end();itertmp++)
2184  {
2185  //cout<<"monomes regarde "<<*itertmp<<" Lavr "<<lvar(itertmp->rep)<<endl;
2186  for(int i=0;i<=lvar(itertmp->rep);i++)
2187  {
2188  if(itertmp->GetDegree(i)>=maxtmpdeg)
2189  {
2190  maxtmpdeg=itertmp->GetDegree(i);
2191  m=*itertmp;
2192  }
2193  }
2194  }
2195  return m;
2196 }
2197 
2198 
2199 template<typename mon, typename T,typename Base, typename monomial_server>
2201 {
2202  int i,degp=Degree(p),k=0;
2203  int mini=INT_MAX;
2204  mon tmpmon;
2205  mon stockmon;
2206  for(i=0;i<p.sizenf;i++)
2207  if(p.nfind[i])
2208  for(int j=0;j<8;j++)
2209  if(p.nfind[i]>>j&1)
2210  {
2211  serv.int2mon(8*i+j,tmpmon);
2212  if(tmpmon.GetDegree()==degp)
2213  {
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)
2219  {
2220  mini=mpz_size(mpq_numref(&(p.nf[k].rep())))+
2221  mpz_size(mpq_denref(&(p.nf[k].rep())));
2222  //cout<<"newmax "<<max<<endl;
2223  //cout<<" les monomes "<<*iter<<endl;
2224  stockmon=tmpmon*p.nf[k];
2225  }
2226  }
2227  k++;
2228  }
2229  //cout<<"je retourne "<<stockmon<<endl;
2230  return stockmon;
2231 }
2232 
2233 template<typename mon, typename T, typename Base, typename monomial_server>
2235 {
2236  typedef typename mon::coeff_t coeff_t;
2237  int i,k=0;
2238  int maxi=-1;
2239  mon tmpmon;
2240  mon stockmon;
2241  mon res=choice_mac(p,b,serv);
2242  typename Base::const_iterator iterb;
2243  list<mon> tmplist;
2244  int degp=Degree(p,serv);
2245 #ifdef DEB
2246  cout<<"Degree(p) "<<degp<<endl;
2247 #endif
2248  for(i=0;i<p.sizenf;i++)
2249  if(p.nfind[i])
2250  for(int j=0;j<8;j++)
2251  if((p.nfind[i]>>j)&1)
2252  {
2253  serv.int2mon(8*i+j,tmpmon);
2254  if ((tmpmon.GetDegree()==degp) && (!Iszero(p.nf[k])))
2255  tmplist.push_back(tmpmon*p.nf[k]);
2256  k++;
2257  // cout<<"k "<<k<<" "<<tmpmon<<endl;
2258  }
2259  for(typename list<mon>::iterator iterlist=tmplist.begin()
2260  ;iterlist!=tmplist.end();iterlist++)
2261  {
2262  for(iterb=b.begin();iterb!=b.end();iterb++)
2263  {
2264  int isgood=0;
2265  for(int i=0;i<iterb->taille1;i++)
2266  if(isdivisible(iterb->accept[i],*iterlist,b))
2267  {isgood=1;break;}
2268  for(int i=0;i<iterb->taille2;i++)
2269  if(isdivisible(iterb->refuse[i],*iterlist,b))
2270  {isgood=0;break;}
2271  if(isgood)
2272  {
2273 
2274  for(int i=0;i<iterb->taille2;i++)
2275  {
2276  mon m=lcm(*iterlist,iterb->refuse[i]);
2277  int dist=0;
2278  for(int j=0;j<iterb->taille2;j++)
2279  if ((j!=i) && (isdivisible(iterb->refuse[j],m,b)))
2280  isgood=0;
2281  if(isgood)
2282  {
2283  for(int j=0;j<b.nbvar();j++)
2284  if(m.GetDegree(j)>iterb->refuse[i].GetDegree(j))
2285  dist+=m.GetDegree(j)-iterb->refuse[i].GetDegree(j);
2286  if(dist>maxi)
2287  {
2288  res=*iterlist;
2289  maxi=dist;
2290  }
2291  }
2292  }
2293  }
2294 
2295  }
2296  }
2297 #if 1
2298  cout<<"le pol "<<invconv<Poly>(p,serv)<<endl<<"le mon choisi "<<res<<endl;
2299 #endif
2300  return res;
2301 }
2302 #ifndef ASYNC
2303 template<typename typdump,typename Base,typename mon,
2304  typename workspace, typename monomial_server>
2306 inline mult(int i,const pol<mon, COEFF> &p,const typdump &dump,
2307  const Base &b,mon **exce,int &exsize,workspace &w,
2308  monomial_server & serv)
2309 {
2310  static const mon monzero=mon(0);
2311  static COEFF zero=0;
2312  static int flag=1;
2313  pol<mon,COEFF> ret;
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;
2317  COEFF *tmpspace;
2318  if(flag)
2319  {
2320  init_pointer<COEFF>();
2321  flag=0;cout<<"pouet pouet"<<endl;
2322  }
2323  //#ifdef DEBUG
2324 #ifdef DEBUG
2325  cout<<"ds mult je traite "<<p.ind<<" ---- "<<i<<endl;
2326  cout<<invconv<Poly>(p,serv)<<endl;
2327  cout<<"p.size "<<p.size<<endl;
2328 #endif
2329  for(int j=0;j<p.sizenf;++j)
2330  if (p.nfind[j])
2331  {
2332  for(int k=0;k<8;k++)
2333  if((p.nfind[j]>>k)&1)
2334  {
2335  int stockindice2=serv.mulind(8*j+k,i,b);
2336  if(stockindice2<0)
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;
2342  }
2343  }
2344  for(;maxind/8+1>=w.sizenf;increase_space(&w));
2345  for(int j=0;j<pp;j++)
2346  if(stockindicetab[j]>=0)
2347  {
2348  w.tabcoeff[stockindicetab[j]]+=p.nf[j];
2349  if(!Iszero(w.tabcoeff[stockindicetab[j]]))
2350  w.tabnf[stockindicetab[j]/8]|=1<<(stockindicetab[j]%8);
2351  }
2352  else
2353  {
2354  pol<mon,COEFF> tmp;
2355  tmp=serv.nf(i,-1*(stockindicetab[j]+1),dump,b);
2356  if (tmp.size!=-1)
2357  {
2358  int compteurtmp=0;
2359  //On fait un plus dense dans tmpspace
2360  int k,l;
2361  unsigned long *tmpptr=(unsigned long*)tmp.nfind;
2362  unsigned long mask=1;
2363  for(;tmp.sizenf>=w.sizenf;increase_space(&w));
2364 
2365  for(k=0;k<tmp.sizenf/sizeof(unsigned long);k++)
2366  if(tmpptr[k])
2367  {
2368  mask=tmpptr[k];
2369  ((unsigned long*)w.tabnf)[k]|=mask;
2370  for(l=0;l<8*sizeof(unsigned long);l+=8,mask>>=8)
2371  {
2372  if(mask&255)
2373  {
2374  tabfun2[mask&255](
2375  w.tabcoeff+(8*sizeof(unsigned long)*k+l)
2376  ,&(p.nf[j]),tmp.nf+compteurtmp);
2377  compteurtmp+=nbbits[mask&255];
2378  }
2379 #if 0
2380  for(int m=0;m<8;m++)
2381  if(Iszero(w.tabcoeff[8*k*sizeof(unsigned long)+l+m]))
2382  ((unsigned long*)w.tabnf)[k]&=~(1<<(l+m));
2383 #endif
2384  }
2385  }
2386 
2387  for(k=tmp.sizenf-(tmp.sizenf%sizeof(unsigned long))
2388  ;k<tmp.sizenf;k++)
2389  if(tmp.nfind[k])
2390  {
2391  w.tabnf[k]|=tmp.nfind[k];
2392  mask=1;
2393  for(l=0;l<8;l++,mask<<=1)
2394  {
2395  if(tmp.nfind[k]&mask)
2396  w.tabcoeff[8*k+l]-=p.nf[j]*tmp.nf[compteurtmp++];
2397  if(Iszero(w.tabcoeff[8*k+l]))
2398  w.tabnf[k]&=~mask;
2399 
2400  }
2401  }
2402  }
2403  else
2404  {
2405  //On est tombé sur un monome du degre courant
2406  //qui est sur le bord
2407  mon tmpmon;
2408  (*exce)[noquo]=mon(i,1);
2409  serv.int2mon(-1*(stockindicetab[j]+1),tmpmon);
2410  (*exce)[noquo]*=tmpmon;//int2mon<mon>(j);
2411  (*exce)[noquo]*=p.nf[j];
2412  ++noquo;
2413  };
2414  }
2415 #ifdef ANCESTOR
2416  //On met juste a jour l'ancetre pour la construction du grpahe apres
2417  ret.ancestor=p.ancestor;
2418 #endif
2419  ret.ind=p.ind;
2420  ret.ind*=mon(i,1);
2421  (*exce)[noquo++]=ret.ind;
2422  exsize=noquo;
2423  (*exce)=(mon*)MAC_REV_REALLOC<mon>((*exce),(p.size+1)*sizeof(mon)
2424  ,(noquo)*sizeof(mon));
2425  ret.ind.SetCoeff(noquo+1);
2426  ret.size=0;
2427  pp=0;
2428  for(int j=0;j<w.sizenf;j++)
2429  if(w.tabnf[j])
2430  {
2431  for(int m=0;m<8;m++)
2432  if(Iszero(w.tabcoeff[8*j+m]))
2433  w.tabnf[j]&=~(1<<m);
2434  if(w.tabnf[j])
2435  {
2436  ret.size+=nbbits[w.tabnf[j]];
2437  pp=j;
2438  }
2439  }
2440  ret.nf=(COEFF*)MAC_REV_MALLOC<COEFF>(ret.size*sizeof(COEFF));
2441  ret.sizenf=pp+1;
2442  ret.nfind=(unsigned char *)malloc(ret.sizenf);
2443  pp=0;
2444  for(int j=0;j<ret.sizenf;j++)
2445  {
2446  if(w.tabnf[j])
2447  for(int k=0;k<8;k++)
2448  if((w.tabnf[j]>>k)&1)
2449  {
2450  ret.nf[pp++]=w.tabcoeff[8*j+k];
2451  w.tabcoeff[8*j+k]=zero;
2452  }
2453  ret.nfind[j]=w.tabnf[j];
2454  w.tabnf[j]=0;
2455  }
2456  free(stockindicetab);
2457 #ifdef DEBUG
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;
2462 #endif
2463  return ret;
2464 }
2465 #endif
2466 
2467 #if 1
2468 template<typename typmat,typename typPk, typename typMk,typename typdump,
2469  typename typexceed, typename typsizeexceed, typename typB,typename monomial_server>
2470  void AddB(const typmat & mat, typPk & Pk,const typMk &Mk,const typexceed & exceed,
2471  const typsizeexceed & sizeexceed, const typdump & dump,
2472  typB &b, monomial_server &serv)
2473 {
2474  typedef typename typPk::value_type pol;
2475  typedef typename pol::monom_t mon;
2476  typedef typename pol::coeff_t coeff_t;
2477  typename typPk::iterator iterpk=Pk.begin();;
2478  auto iterexceed=exceed.begin();
2479  auto itersizeexceed=sizeexceed.begin();
2480  predicat<mon> tmp;
2481  typename typMk::const_iterator iter=Mk.begin();
2482  int r=my_rank(mat),comprefuse=0,compaccept=0;
2483  unsigned int i;
2484  //cout<<"DANS ADDB"<<endl;
2485  //cout<<"rang de la matrice m "<<r<<" Mk.size "<<Mk.size()<<endl;
2486  //cout<<"taille de la matrice "<<mat.nrow<<"x"<<mat.ncol<<endl;
2487  tmp.refuse=(mon*)MAC_REV_MALLOC<mon>(r*sizeof(mon));
2488  tmp.taille2=r;
2489  tmp.accept=(mon*)MAC_REV_MALLOC<mon>((Mk.size()-r)*sizeof(mon));
2490  tmp.taille1=Mk.size()-r;
2491  //for(i=0;i<(unsigned)r;i++,iter++)
2492  // tmp.refuse[i]=*iter;
2493  iter=Mk.begin();
2494  for(i=0;i<Mk.size();i++,iter++)
2495  {
2496  if(Iszero(mat(i,i)))
2497  {
2498  tmp.accept[compaccept++]=*iter;
2499  //cout<<"monome rajoute au quotient "<<*iter<<endl;
2500  }
2501  else
2502  {
2503  tmp.refuse[comprefuse++]=*iter;
2504  }
2505  }
2506  b.def.push_back(tmp);
2507  //bon maintenant que l'on vient de rajouter des
2508  //monomes au quotient il faut remttre les polynomes comme il faut
2509  iter=Mk.begin();
2510 //cout<<"report"<<endl;
2511 //On fait une passe pour determiner les polynomes a modifier et on effectue
2512 //les modifications en lisant les exceed (au passage on FREE)
2513 
2514 
2515  for(unsigned int i=0;i<Pk.size();i++,iterpk++,iter++,iterexceed++,itersizeexceed++)
2516  {
2517  vector<sortstruct<coeff_t> > decal;
2518  int maxindex=-1;
2519  int expend=0;
2520  for(int j=0;j<*itersizeexceed;j++)
2521  if(!Iszero((*iterexceed)[j].GetCoeff()))
2522  //si des monomes nuls sortent comme coeff de la matrice
2523  //et bien on les prends pas
2524  {
2525  sortstruct<coeff_t> tmp;
2526  expend++;
2527  maxindex=max(maxindex,serv.mon2int((*iterexceed)[j]));
2528  tmp.index=serv.mon2int((*iterexceed)[j]);
2529  tmp.coeff=(*iterexceed)[j].GetCoeff();
2530  decal.push_back(tmp);
2531  }
2532  // Si on a rien a rajouter on arrete
2533  // cout<<"decal.empty "<<decal.empty()<<endl;
2534  if(decal.empty()) continue;
2535  //on augmente la taille du polynome considere
2536  iterpk->nf=(typename mon::coeff_t*)
2537  MAC_REV_REALLOC<typename mon::coeff_t>(iterpk->nf
2538  ,iterpk->size*sizeof(typename mon::coeff_t)
2539  ,(iterpk->size+expend)*sizeof(typename mon::coeff_t));
2540  if((maxindex/8)>=iterpk->sizenf)
2541  {
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++)
2546  iterpk->nfind[i]=0;
2547  iterpk->sizenf=maxindex/8+1;
2548 
2549  }
2550 // la place est faite il reste plus qu'a decaler les monomes de iterpk->nf
2551 //pour intercaler eventuellment les nouveaux monomes
2552  stable_sort(decal.begin(),decal.end(),sortstructorder<coeff_t>());
2553  int nbcoeff=iterpk->size-1;
2554  // cout<<"iterpk->sizenf "<<iterpk->sizenf<<endl;
2555  for(int j=iterpk->sizenf-1;j>=0;j--)
2556  {
2557  //cout<<"decal.index "<<decal.rbegin()->index<<endl;
2558  if(8*j>decal.rbegin()->index)
2559  for (int jj=0;jj<nbbits[iterpk->nfind[j]];jj++)
2560  {
2561  iterpk->nf[nbcoeff+decal.size()]=
2562  iterpk->nf[nbcoeff];
2563  nbcoeff--;
2564  }
2565  else
2566  {
2567  int indexnf=decal.back().index;
2568  typename typMk::value_type tmpmon;
2569  //cout<<"8*j"<<8*j<<" indexnf "<<indexnf<<" valeur "<<decal.back().index<<endl;
2570  int jj=7;
2571  while(8*j<=decal.back().index)
2572  {
2573  indexnf=decal.back().index % 8;
2574  for (;jj>(indexnf);jj--)
2575  if(iterpk->nfind[j]&(1<<jj))
2576  {
2577  iterpk->nf[nbcoeff+decal.size()]=
2578  iterpk->nf[nbcoeff];
2579  nbcoeff--;
2580  }
2581  //cout<<"je rajoute "<<decal.back().coeff<<" a la place "<<nbcoeff+decal.size()<<endl;
2582 // if(nbcoeff+decal.size()+1<iterpk->size+expend)
2583  // cout<<"coeff apres "<<iterpk->nf[nbcoeff+decal.size()+1]<<endl;
2584  iterpk->nf[nbcoeff+decal.size()]=decal.back().coeff;
2585  iterpk->nfind[j]|=(1<<(indexnf));
2586  // serv.int2mon(8*j+indexnf,tmpmon);
2587  // cout<<"monome a la place "<<decal.back().index<<" "<<tmpmon<<endl;
2588  // serv.int2mon(decal.back().index,tmpmon);
2589  // cout<<"monome a la place "<<decal.back().index<<" "<<tmpmon<<endl;
2590  decal.pop_back();
2591  jj--;
2592  if(decal.empty()) break;
2593  }
2594  for (;jj>=0;jj--)
2595  if(iterpk->nfind[j]&(1<<jj))
2596  {
2597  iterpk->nf[nbcoeff+decal.size()]=
2598  iterpk->nf[nbcoeff];
2599  nbcoeff--;
2600  }
2601  if(decal.empty()) break;
2602  }
2603 
2604  }
2605  iterpk->size+=expend;
2606  MAC_REV_FREE<mon>(*iterexceed,*itersizeexceed*sizeof(mon));
2607  }
2608  return;
2609 }
2610 #endif
2611 #ifdef ASYNC
2612 #include "pol2terspecial-async.hpp"
2613 #endif
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
void free(void *)
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
Definition: pol.hpp:6
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 * malloc(YYSIZE_T)
void recover(typPk &Pk, typMk &Mk, const typdump &dump, int k)
Definition: dump.hpp:192
coeff * tabcoeff
Definition: workspace.hpp:12
Definition: types.hpp:3
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
Definition: types.hpp:14
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
Home  |  Download & InstallContributions