Developer documentation

sparse_monomials.hpp
Go to the documentation of this file.
1 #ifndef realroot_sparse_monomials_hpp
2 #define realroot_sparse_monomials_hpp
3 # include <list>
4 # include <vector>
5 # include <algorithm>
6 //# include <basix/basix.hpp>
7 # include <realroot/binomials.hpp>
8 # include <realroot/Seq.hpp>
9 # include <realroot/monomial.hpp>
11 # define TMPL template<class C, class O, class MONOM, class REP>
12 # define TMPLX template<class C, class O, class MONOM, class REP, class X>
13 # define Polynomial monomial_seq<C,O,MONOM,REP>
14 # define CLASS monomial_seq
15 # define sparse_monomials sparse::monomial_seq
16 //======================================================================
17 namespace mmx {
18 
19 //--------------------------------------------------------------------
20 
22 namespace sparse {
23 
24 template<class C, class O = DegRevLex,
25  class MONOM=monom<C>,
26  class REP=std::list<MONOM> >
27 struct CLASS : public REP {
28 
29  typedef C coeff_t;
30  typedef C Scalar;
31  typedef C value_type;
32  typedef O Order;
33  typedef REP base_t;
34  typedef typename base_t::value_type monom_t;
35  typedef typename base_t::value_type Monomial;
36  typedef typename base_t::iterator iterator;
37  typedef typename base_t::const_iterator const_iterator;
38  typedef typename base_t::reverse_iterator reverse_iterator;
39  typedef typename base_t::const_reverse_iterator const_reverse_iterator;
40  typedef Polynomial self_t;
41 
42  Polynomial(): base_t() {}
43  Polynomial(const C& c):base_t() {
44  if (c!=(coeff_t)0)
45  this ->push_back(monom_t(c));
46  }
47 
48 
49  Polynomial(const C& c, int d, unsigned v);
50  Polynomial(const monom_t& m): base_t() { this->push_back(m);};
51 
52  bool operator==( const Polynomial& p ) const;
53  bool operator!=( const Polynomial& p ) const { return !(*this==p); }
54  bool operator==( const C& c ) const;
55  bool operator!=( const C& c ) const { return !(*this==c); }
56 
57  int nbvar() const;
58 
60  static MonomialOrdering * order() {return m_order;}
61  static bool
62  less (const monom_t & m1, const monom_t & m2) {
63  // std::cout<<"less "<< m1<< " "<< m2<<std::endl;
64  return m_order->less(m1.begin(),m1.size(),
65  m2.begin(),m2.size());
66  }
67 };
68 }//namespace sparse
69 
70 // #ifndef MMX_WITH_PLUS_SIGN
71 // #define MMX_WITH_PLUS_SIGN
72 // template<class X> bool with_plus_sign(const X& x) {return true;}//x>0;}
73 // #endif //MMX_WITH_PLUS_SIGN
74 // TMPL bool with_plus_sign(const SparsePolynomial& x) {return true;}
75 
76 
77 namespace sparse {
78 
79 TMPL MonomialOrdering* Polynomial::m_order = (MonomialOrdering*)new O; //DegreeLex;
80 
81 
82 TMPL inline
83 Polynomial::CLASS(const C& c, int d, unsigned v):base_t() {
84  this ->push_back(monom_t(c,d,v));}
85 
87 TMPL int
88 Polynomial::nbvar() const{
89  int v = 0;
90  for (const_iterator it = this->begin(); it != this->end(); ++it)
91  v = std::max(v,it->l_variable()+1);
92  return v;
93 }
94 
95 
96 TMPL bool
97 Polynomial::operator== (const Polynomial& p) const {
98  return ((base_t)*this==(base_t)p);
99 }
100 
101 TMPL bool
102 Polynomial::operator== (const C& c) const {
103  if(c==0)
104  return (this->size()==0);
105  else
106  return(this->size()==1 && (this->begin()->coeff() == c) && degree(*this->begin())== 0);
107 }
108 
109 
110 //====================================================================
111 TMPL void
112 add(Polynomial & result, const Polynomial& p1, const Polynomial& p2)
113 {
114  assert(&result != &p1); assert(&result != &p2);
115 
116  typedef typename Polynomial::const_iterator const_iterator;
117  typedef typename Polynomial::iterator iterator;
118  typedef typename Polynomial::value_type coeff_type;
119  typedef typename Polynomial::Scalar Scalar;
120 
121  const_iterator
122  b1=p1.begin(),
123  e1=p1.end(),
124  b2=p2.begin(),
125  e2=p2.end();
126  result.resize(p1.size()+p2.size());
127  iterator i=result.begin();
128  while (b1!=e1 && b2!=e2) {
129  if(Polynomial::less(*b2,*b1))
130  *i++=*b1++;
131  else if(Polynomial::less(*b1,*b2))
132  *i++=*b2++;
133  else {
134  coeff_type c=b1->coeff()+ b2->coeff();
135  if (c !=(Scalar)0) {
136  *i =*b1;
137  i->set_coeff(c);
138  ++i;
139  }
140  ++b1;++b2;
141  }
142  }
143  while (b1!=e1) *i++=*b1++;
144  while (b2!=e2) *i++=*b2++;
145 
146  int m=std::distance(result.begin(),i);
147  assert(m>=0);
148  result.resize(m);
149 }
150 //----------------------------------------------------------------------
152 TMPL void
153 add(Polynomial & p1, const Polynomial& p2) {
154 
155  assert(&p1 != &p2);
156  typedef typename Polynomial::const_iterator const_iterator;
157  typedef typename Polynomial::iterator iterator;
158  typedef typename Polynomial::value_type coeff_type;
159 
160  // reserve(p1,p1.size()+p2.size());
161  iterator b1=p1.begin();
162  const_iterator b2=p2.begin();
163  while (b1!=p1.end() && b2!=p2.end()) {
164  if(Polynomial::less(*b2,*b1))
165  b1++;
166  else if(Polynomial::less(*b1,*b2))
167  {
168  b1 = p1.insert(b1,*b2); b1++; b2++;
169  }
170  else
171  {
172  coeff_type c=b1->coeff() + b2->coeff();
173  if (c != (typename Polynomial::Scalar)0) {
174  b1->set_coeff(c); ++b1;
175  }else{
176  b1 = p1.erase(b1);
177  }
178  ++b2;
179  }
180  }
181  p1.insert(b1,b2,p2.end());
182 }
183 //----------------------------------------------------------------------
184 template<class C, class O, class MONOM, class REP, class I, class J, class M>
185 I add(Polynomial & p1, I b1, J e1, const M & m2) {
186  typedef typename Polynomial::value_type::coeff_t coeff_type;
187 
188  while (b1!=e1) {
189  if(Polynomial::less(m2,*b1))
190  {
191  b1++; //COUNT<M>('i');
192  }
193  else if(Polynomial::less(*b1,m2))
194  {
195  b1=p1.insert(b1,m2);
196  return b1;
197  }
198  else
199  {
200  coeff_type c=b1->coeff() + m2.coeff();
201  if (c !=0) {
202  b1->set_coeff(c);
203  }else
204  b1 = p1.erase(b1);
205  return(b1);
206  }
207  }
208  b1 = p1.insert(b1,m2);
209  return b1;
210 }
211 //----------------------------------------------------------------------
212 TMPL void
213 add(Polynomial & p, const typename Polynomial::monom_t& m) {
214  Polynomial q(m); add(p,q);
215 }
216 
217 TMPL void
218 add(Polynomial & p, const C& c) {
219  Polynomial m(c); add(p,m);
220 }
221 //----------------------------------------------------------------------
222 TMPLX void
223 add(Polynomial & r, const Polynomial& q, const X& c) {
224  Polynomial m(c); add(r,q,m);
225 }
226 //----------------------------------------------------------------------
227 TMPL void
228 add(Polynomial & r, const C& c, const Polynomial& q) {
229  Polynomial m(c); add(r,q,m);
230 }
231 //----------------------------------------------------------------------
232 TMPL void
233 sub(Polynomial & result, const Polynomial& p1, const Polynomial& p2)
234 {
235  assert(&result != &p1); assert(&result != &p2);
236  typedef typename Polynomial::const_iterator const_iterator;
237  typedef typename Polynomial::iterator iterator;
238  typedef typename Polynomial::value_type coeff_type;
239  const_iterator
240  b1=p1.begin(),
241  e1=p1.end(),
242  b2=p2.begin(),
243  e2=p2.end();
244  result.resize(p1.size()+p2.size());
245  iterator i=result.begin();
246  while (b1!=e1 && b2!=e2) {
247  if(Polynomial::less(*b2,*b1))
248  *i++=*b1++;
249  else if(Polynomial::less(*b1,*b2))
250  {
251  *i=*b2++; i->coeff()*= -1; i++;
252  }
253  else {
254  coeff_type c=b1->coeff()- b2->coeff();
255  if (c !=0) {
256  *i =*b1;
257  i->set_coeff(c);
258  ++i;
259  }
260  ++b1;++b2;
261  }
262  }
263  while (b1!=e1) *i++=*b1++;
264  while (b2!=e2) {*i=*b2++;i->coeff()*=-1;i++;}
265 
266  int m=std::distance(result.begin(),i);
267  assert(m>=0);
268  result.resize(m);
269 }
270 //--------------------------------------------------------------------
271 TMPL void
272 sub(Polynomial & p, const Polynomial& q) {
273  Polynomial m(q); mul(m,(C)-1);
274  add(p,m);
275 }
276 //--------------------------------------------------------------------
277 TMPLX void
278 sub(Polynomial & r, const Polynomial& q, const X& c) {
279  Polynomial m(C(-c)); add(r,q,m);
280 }
281 //--------------------------------------------------------------------
282 TMPLX void
283 sub(Polynomial & r, const X& c, const Polynomial& q) {
284  Polynomial m(c); sub(r,m,q);
285 }
286 //----------------------------------------------------------------------
288 TMPL void
289 mul(Polynomial &r, const C & c) {
290  for(typename Polynomial::iterator it=r.begin(); it!=r.end(); ++it) {
291  it->coeff()*=c;
292  }
293 }
294 //----------------------------------------------------------------------
295 TMPL void
296 mul(Polynomial &r, const Polynomial& p, const C & c) {
297  r = p; mul(r,c);
298 }
299 
300 //----------------------------------------------------------------------
301 TMPLX void
302 mul(Polynomial &r, const X & c, const Polynomial& p) {
303  r = p; mul(r,c);
304 }
305 //----------------------------------------------------------------------
307 template <class C, class O, class MONOM, class REP, class M> inline void
308 mul_ext(Polynomial &r, const Polynomial& a, const M & m) {
309  r.resize(a.size());
310  typename Polynomial::const_iterator b=a.begin();
311  typename Polynomial::iterator i=r.begin();
312  for(; b!=a.end(); ++i, ++b) *i = (*b) * m;
313  // VECTOR::apply_mult(r, a, m);
314 }
315 //----------------------------------------------------------------------
317 TMPL inline void
318 mul(Polynomial &r, const Polynomial& a, const typename Polynomial::monom_t & m) {
319  mul_ext(r,a,m);
320 }
321 //----------------------------------------------------------------------
323 TMPL inline void
324 mul(Polynomial &r, const typename Polynomial::monom_t & m) {
325  typename Polynomial::iterator i=r.begin();
326  for(; i!=r.end(); ++i) *i *= m;
327 }
328 //----------------------------------------------------------------------
329 template<class C, class O, class MONOM, class REP, class M> inline void
330 mul_ext_e(Polynomial &result, const Polynomial& a, const M & m)
331 {
332  typedef typename Polynomial::const_iterator const_iterator;
333  typedef typename Polynomial::iterator iterator;
334  typedef typename Polynomial::monom_t R;
335 
336  result.resize(0);
337  iterator i=result.begin();
338  R tmp;
339  for(const_iterator b=a.begin();b!=a.end(); ++b)
340  {
341  tmp = (*b) * m;
342  (i=result.insert(i,tmp))++;
343  }
344 }
345 //----------------------------------------------------------------------
347 TMPL inline void
348 mul(Polynomial &r, const Polynomial& a, const Polynomial& b)
349 {
350  if (a.size()==0) return;
351  if (b.size()==0) return;
352  if (a.size()<b.size())
353  mul_iterator(r,a.begin(),a.end(),b);
354  else
355  mul_iterator(r,b.begin(),b.end(),a);
356 }
357 
359 TMPLX inline void
361  const Polynomial& a,
362  const Polynomial& b, const X & o)
363 {
364  typedef typename Polynomial::const_iterator const_iterator;
365  typedef typename Polynomial::iterator iterator;
366  typedef typename Polynomial::monomt_t M;
367 
368  r.resize(0);
369  M m;
370  for(const_iterator i=b.begin();i !=b.end();i++)
371  {
372  if(r.size())
373  {
374  iterator ip = r.begin();
375  for(const_iterator j=a.begin();j != a.end();j++) {
376  m = *j * *i;
377  ip = add(r,ip,r.end(),m);//,O());
378  }
379  //MPOLDST::mul_ext(tmp,a,*i);
380  //MPOLDST::add<list<M>,vector<M>,O>(r,tmp);
381  }
382  else
383  mul_ext(r,a,*i);
384  }
385 }
386 
387 //----------------------------------------------------------------------
388 TMPL inline void
390  typename Polynomial::const_iterator b,
391  typename Polynomial::const_iterator e,
392  const Polynomial& p) {
393  typedef typename Polynomial::const_iterator const_iterator;
394  int n=std::distance(b,e);
395  //std::cout<<"mul iter "<<n<<std::endl;
396  assert(n>=0);
397  if (n==0) r.resize(0);
398  if (n==1)
399  mul_ext(r,p,*b);
400  else {
401  const_iterator med=b; // b+(n/2);
402  for(int i=0; i<n/2 && med !=e;i++,med++) {}
403 
404  Polynomial tmp0, tmp1; //((C)0), tmp1((C)0);
405  mul_iterator(tmp0,b,med,p);
406  mul_iterator(tmp1,med,e,p);
407  add(r,tmp0,tmp1);
408  }
409  //std::cout<<"mul iter end "<<n <<std::endl;
410 }
411 TMPL inline void
412 mul(Polynomial &r, const Polynomial& p)
413 {
414  Polynomial s(r); mul(r,s,p);
415 }
416 //----------------------------------------------------------------------
417 TMPL inline void
418 div(Polynomial &q, const Polynomial& a, const Polynomial& b)
419 {
420  Polynomial r(a);
421  div_rem(q,r,b);
422 }
423 
424 TMPL inline void
426 {
427  Polynomial a(r);
428  div(r,a,b);
429 }
430 
431 TMPL inline void
432 div(Polynomial &f, const typename Polynomial::Scalar& c)
433 {
434  for(typename Polynomial::iterator it=f.begin(); it != f.end(); it++)
435  it->coeff()/=c;
436 }
437 
438 //----------------------------------------------------------------------
439 TMPL void
440 div(Polynomial &r, const Polynomial& p, const C & c) {
441  r = p; div(r,c);
442 }
443 
444 //----------------------------------------------------------------------
445 TMPL inline void
446 rem(Polynomial &r, const Polynomial& a, const Polynomial& b)
447 {
448  Polynomial q; r=a;
449  div_rem(q,r,b);
450 }
451 
452 //----------------------------------------------------------------------
453 template<class C, class O, class MONOM, class REP, class U> void
454 coefficients(Seq<U>& r,const Polynomial& f,int v) {
455  unsigned N = degree(f,v)+1;
456  r=Seq<U>(N);
457  typename Polynomial::monom_t m;
458  for(typename Polynomial::const_iterator it=f.begin(); it != f.end(); it++) {
459  m=*it;
460  if (v<(int)m.size()) m.set_expt(v,0);
461  r[(*it)[v]]+= U(m);
462  }
463 }
464 
465 TMPL void
467  for(typename Polynomial::const_iterator it=f.begin(); it != f.end(); it++) {
468  r<<it->coeff();
469  }
470 }
471 //----------------------------------------------------------------------
473 template <class R> int lvar (const R & p) {
474  int v = -1;
475  for (typename R::const_iterator it = p.begin(); it != p.end(); ++it)
476  v = std::max(v,it->l_variable());
477  return v;
478 }
479 //--------------------------------------------------------------------
481 template <class R> unsigned nbvar (const R & p) {
482  return p.nbvar();
483 }
484 //----------------------------------------------------------------------
486 template <class R> int
487 degree (const R & p) {
488  if(!p.size())
489  return -1;
490  else
491  {
492  int d = 0;
493  for (typename R::const_iterator it = p.begin(); it != p.end(); ++it)
494  d = std::max(d,degree(*it));
495  return d;
496  }
497 }
498 
500 template <class R> int
501 degree (const R & p, int i) {
502  if(!p.size())
503  return -1;
504  else
505  {
506  int d=0;
507  for (typename R::const_iterator it = p.begin(); it != p.end(); ++it)
508  {
509  if(i<=it->nvars()) d = std::max(d,(int)(*it)[i]);
510  }
511  return d;
512  }
513 }
514 //----------------------------------------------------------------------
515 template<class R> typename R::coeff_t&
516 leadingcoeff(R & a) {return a.begin()->coeff();}
517 //----------------------------------------------------------------------
518 template<class R> typename R::coeff_t
519 leadingcoeff(const R & a) {return a.begin()->coeff();}
520 //----------------------------------------------------------------------
525 template<class POL> typename POL::coeff_t
526 coeffof(const POL & p,
527  const typename POL::monom_t & mono)
528 {
529  typedef typename POL::coeff_t coeff_t;
530  typename POL::const_iterator m;
531  for(m = p.begin(); m!= p.end() && !IsComparable((*m),mono); m++) {}
532  if(m != p.end())
533  {
534  return m->coeff();
535  }
536  else
537  {
538  return coeff_t(0);
539  }
540 }
541 
542 template<class POL> typename POL::const_iterator
543 last_term(const POL& p) {
544  assert(p.size()>0);
545  typename POL::const_iterator it=p.end();
546  it--;
547  return it;
548 }
549 
550 
551 //----------------------------------------------------------------------
553 template<class R> void
554 div_rem(R & q, R & a, const R & b0) {
555  // std::cout <<"---- Begin div-rem sparse -----"<<std::endl;
556  typedef typename R::monom_t monom_t;
557  typedef typename monom_t::coeff_t coeff_t;
558  q= R((coeff_t)0);
559 
560  if(a==0) return;
561 
562  R b(b0);
563  //coeff_t cb =b0.begin()->coeff();
564  // b/=cb;
565  monom_t mb = (*b.begin()), m;
566  R t;
567  while( a != (coeff_t)0 && divide(*a.begin(), mb, m) )
568  {
569  mul(t,b,m);
570  sub(a,t);
571  if ( m != 0 ) add(q,m);
572  // print(std::cout,a); std::cout<<std::endl;
573  }
574  // std::cout <<"---- End div-rem sparse -----"<<std::endl;
575 }
576 
577 //----------------------------------------------------------------------
579 TMPL void
580 diff(Polynomial & r, const Polynomial & p, int i)
581 {
582  typedef typename Polynomial::Monomial Monomial;
583  typedef typename Polynomial::Scalar Scalar;
584 
585  assert(&r != &p);
586  r= Polynomial((Scalar)0);
587  for (typename Polynomial::const_iterator it = p.begin(); it != p.end(); ++it) {
588  if((*it)[i]>0){
589  Monomial m(*it);
590  m*=(typename Polynomial::coeff_t)(*it)[i];
591  m.set_expt(i,(*it)[i]-1);
592  add(r,m);
593  }
594  }
595 }
596 
597 //----------------------------------------------------------------------
599 TMPL void
600 shift(Polynomial & r, const Polynomial & p, const typename Polynomial::monom_t& m)
601 {
602  assert(&r != &p);
603  //typedef typename Polynomial::monom_t Monomial;
604  r= Polynomial(0);
605  for (typename Polynomial::const_iterator it = p.begin(); it != p.end(); ++it) {
606  add(r,*it*m);
607  }
608 }
609 
610 //----------------------------------------------------------------------
612 TMPL void
614 {
615  //to be modified when bug fixed in gcc
616  // using dense::reserve;
617  reserve(r,a.size());
618  std::copy(a.begin(),a.end(),r.begin());
619 }
620 //----------------------------------------------------------------------
622 TMPL typename Polynomial::coeff_t
623 eval(const Polynomial& p,
624  const typename Polynomial::coeff_t &x,
625  const typename Polynomial::coeff_t &y) {
626  typename Polynomial::coeff_t r(0);
627  for(typename Polynomial::const_iterator it=p.begin(); it!=p.end(); ++it)
628  {
629  typename Polynomial::coeff_t c(it->coeff());
630  //for(unsigned int i=0;i<2;++i)
631  for(int k=0;k<(int)(*it)[0];k++)
632  c*=x;
633  for(int k=0;k<(int)(*it)[1];k++)
634  c*=y;
635  r+=c;
636  }
637  return r;
638 }
639 
640 //--------------------------------------------------------------------
641 template<class C,class O, class MONOM, class REP, class R, class VCT> void
642 eval_at(R& r,
643  const Polynomial& p,
644  const VCT &x) {
645  r= (R)0;
646  for(typename Polynomial::const_iterator it=p.begin(); it!=p.end(); ++it)
647  {
648  R c= it->coeff();
649  for(unsigned j=0; j< (unsigned)x.size() && j< (unsigned)it->nvars();++j)
650  for(int k=0;k<(int)(*it)[j];k++)
651  c*=x[j];
652  r+=c;
653  }
654  //return r;
655 }
656 
657 //--------------------------------------------------------------------
659 template<class R, class C, class O, class MONOM, class REP, class X> inline void
660 eval(R& r, const Polynomial& p, const X& x) {
661  r=(R)0;
662  for(typename Polynomial::const_iterator it=p.begin(); it!=p.end(); ++it)
663  {
664  R c(it->coeff());
665  for(int k=0;k<(int)(*it)[0];k++)
666  c*=x;
667  r+=(R)c;
668  }
669 }
670 
671 //----------------------------------------------------------------------
672 TMPL inline void
673 homogenize(Polynomial& r, const Polynomial& p, const Polynomial& v) {
674  Polynomial t;
675  int d = sparse::degree(p);
676  for(typename Polynomial::const_iterator it=p.begin();it != p.end();it++) {
677  t=*it;
678  for (int i=0;i<d-degree(*it);i++) mul(t,v);
679  add(r,t);
680  }
681 }
682 
683 //--------------------------------------------------------------------
684 TMPL inline void
685 homogenize(Polynomial& r, const Polynomial& p, int n, const Polynomial& v) {
686  Polynomial t;
687  int d = degree(p,n);
688  for(typename Polynomial::const_iterator it=p.begin();it != p.end();it++) {
689  t=*it;
690  for (int i=0;i<d-(*it)[n];i++) mul(t,v);
691  add(r,t);
692  }
693 }
694 //----------------------------------------------------------------------
695 
698 template <class MP> MP
699 convert(const MP & P,typename MP::coeff_t x,typename MP::coeff_t y,int ind) {
700  typedef typename MP::const_iterator const_iterator;
701  typedef typename MP::coeff_t coeff_t;
702  typedef typename MP::monom_t monom_t;
703  MP res;
704  int ind1=0;
705  int ind2=0;
706  for(int i=0;i<=2;i++)
707  {
708  if(ind!=i) {ind1=i;break;}
709  }
710  for(int i=0;i<=2;i++)
711  {
712  if(ind!=i && ind1!=i) {ind2=i;break;}
713  }
714  for(const_iterator i = P.begin(); i != P.end(); ++i)
715  {
716  coeff_t k=i->coeff();
717  int puissx=(*i)[ind1];
718  int puissy=(*i)[ind2];
719  int d=(*i)[ind];
720  coeff_t coeff1=pow(x,puissx);
721  coeff_t coeff2=pow(y,puissy);
722  k*=coeff1;k*=coeff2;
723  MP P1=monom_t(k,ind,d);
724  res=res+P1;
725  }
726  return res;
727 }
728 
729 
730 //--------------------------------------------------------------------
731 template <class C, class O, class MONOM, class REP, class VARIABLES>
732 std::string
733 to_string(const Polynomial & P, const VARIABLES & V) {
734  // std::cout<<"print"<<std::endl;
735  // std::string s;
736  if ( P.begin() == P.end() )
737  {
738  return std::string("0");
739  }
740  std::string os;
741  for(typename Polynomial::const_iterator i = P.begin(); i != P.end();i++ ) {
742  std::string s = to_string(*i, V);
743  if(s[0] != '-' && s[0] != '+' && i != P.begin())
744  os += "+";
745  os += s;
746  //print(s,*i,V);
747  }
748  // std::cout<<"print end"<<std::endl;
749  return os;
750 }
751 
752 //--------------------------------------------------------------------
753 template <class OS, class C, class O, class MONOM, class REP, class VARIABLES> OS&
754 print(OS & os, const Polynomial & P, const VARIABLES & V) {
755  // std::cout<<"print"<<std::endl;
756  // std::string s;
757  if ( P.begin() == P.end() )
758  {
759  os<<"0";
760  return os;
761  }
762  for(typename Polynomial::const_iterator i = P.begin(); i != P.end();i++ ) {
763  std::string s = to_string(*i, V);
764  if(s[0] != '-' && s[0] != '+' && i != P.begin())
765  os<< "+";
766  os<<s;
767  //print(s,*i,V);
768  }
769  // std::cout<<"print end"<<std::endl;
770  return os;
771 }
772 
773 
774 template <class OS, class C, class O, class MONOM, class REP, class VARIABLES> OS&
775 print_as_double(OS & os, const Polynomial & P, const VARIABLES & V) {
776  if ( P.begin() == P.end() )
777  {
778  os << '0';
779  return os;
780  }
781  for(typename Polynomial::const_iterator i = P.begin(); i != P.end();i++ ) {
782  std::ostringstream sm;
783  print_as_double(sm,*i,V);
784  if(sm.str()[0] != '-' && sm.str()[0] != '+' && i != P.begin())
785  os <<'+';
786  os<<sm.str().c_str();
787  }
788  return os;
789 }
790 //--------------------------------------------------------------------
791 template <class OS, class C, class O, class MONOM, class REP> OS&
792 print(OS & os, const Polynomial & P)
793 {
794  return print(os,P,variables());
795 }
796 
797 
798 //----------------------------------------------------------------------
799 template <class OS, class C, class O, class MONOM, class REP> OS&
800 print_verbatim(OS & os, const Polynomial & P)
801 {
802  if ( P.begin() == P.end() )
803  {
804  os << '0';
805  return os;
806  }
807  for( typename Polynomial::const_iterator i=P.begin(); i != P.end();++i)
808  {
809  os<<" "<<i->coeff()<<" [";
810  for(int l=0;l<i->size();l++) os<<(*i)[l]<<" ";
811  os<<"]";
812  }
813  return os;
814 }
815 //----------------------------------------------------------------------
819 template <class POL, class C> POL
820 shift(typename POL::const_iterator monom, const C& a, int i) {
821 
822  POL polynom;
823  // Definition du type monome.
824  typedef typename POL::monom_t monomial;
825  // monomiale temporaire.
826  monomial tmpmonomial;
827 
828  int i0 = i;
829  int i1 = (i + 1) % 3;
830  int i2 = (i + 2) % 3;
831 
832  // Si la variable est presente dans le monome.
833  if ( (a!=0) && ( monom->operator[](i0) !=0 ) )
834  {
835  polynom = binomial< POL >(C(1.), i0, monom->operator[](i0), a);
836  int expt[3];
837  expt[i0] = 0;
838  expt[i1] = monom->operator[](i1);
839  expt[i2] = monom->operator[](i2);
840 
841  if ( ( expt[i0] == 0 ) && ( expt[i1] == 0 ) && ( expt[i2] == 0 ) )
842  tmpmonomial = monomial( monom->coeff(), 0, 0 );
843  else tmpmonomial = monomial( monom->coeff(), 3, expt );
844 
845  polynom *= tmpmonomial;
846  }
847  // Si a = 0 alors le monome reste inchange.
848  else polynom = ( *monom );
849 
850  return polynom;
851 
852 }
853 //----------------------------------------------------------------------
856 template < class POL, class C > POL
857 scale( const POL &p, C a, int v) {
858 
859  //typedef typename POL::monom_t monomial;
860 
861  POL np(p);
862 
863  for ( typename POL::const_iterator i = np.begin(); i != np.end(); ++i ) {
864  i->coeff()*= pow( a, int( i->operator[]( v ) ) );
865  }
866  return np;
867 
868 }
869 //----------------------------------------------------------------------
870 template<class T, class MP, class V> T
871 eval(const MP& p, const V& v) {
872  T r((int)0);
873  for(typename MP::const_iterator it=p.begin(); it!=p.end(); ++it)
874  {
875  T c; let::assign(c,it->coeff());
876  for(unsigned i=0;i< it->size()&&i<v.size();++i)
877  for(int k=0;k<(*it)[i];k++)
878  {
879  c*=v[i];
880  }
881  r+=c;
882  }
883  return r;
884 }
885 
886 
887 //----------------------------------------------------------------------
888 template<class R, class MP, class V> void
889 eval(R& r, const MP& p, const V& v, unsigned n) {
890  r=R(0);
891  for(typename MP::const_iterator it=p.begin(); it!=p.end(); ++it)
892  {
893  R c;
894  let::assign(c,it->coeff());
895  for(unsigned i=0;i< it->size()&&i<n;++i)
896  for(int k=0;k<(*it)[i];k++) {
897  c*=v[i];
898  }
899  r+=c;
900  }
901 }
902 
903 //----------------------------------------------------------------------
905 template<class MP,class X> MP
906 subs( unsigned var, const X& val, const MP & P)
907 {
908  MP Result;//("0");
909  //typedef typename MP::coeff_t coeff_t;
910  typedef typename MP::Monomial monom_t;
911 
912  for( typename MP::const_iterator it = P.begin(); it != P.end(); ++it )
913  {
914  if ( it->size() > var )
915  {
916  monom_t m (*it);
917  X tmp = pow(val,m[var]);
918  m.rep()[var] = 0;
919  Result += tmp*m;
920  }
921  else
922  Result += *it;
923 
924  }
925  return Result;
926 }
927 //----------------------------------------------------------------------
929 template<class MP> MP
930 subs(const MP & P, int var, typename MP::coeff_t val)
931 {
932  MP Result= 0;
933  typedef typename MP::coeff_t coeff_t;
934  typedef typename MP::Monomial monom_t;
935  //std::cout<<"Begin subs!! " << std::endl;
936  coeff_t C=0;
937  for ( typename MP::const_iterator it = P.begin();
938  it != P.end(); ++it )
939  {
940  monom_t m(it->coeff());
941  for(int ind=0; ind<(lvar(P)+1); ++ind)
942  {
943  if (ind == var)
944  {
945  for(int k=0;k<(int)(*it)[ind];k++)
946  m*=val;
947  }
948  else
949  {
950  if ((*it)[ind] != 0)
951  {
952  monom_t mon(coeff_t(1),(*it)[ind],ind);
953  m*= mon;
954  }
955  }
956  }
957  if (m.nvars() == -1)
958  {
959  C += m.coeff();
960  }
961  else if (m != 0)
962  {
963  Result+= m;
964  }
965  }
966  if (C != 0)
967  Result += monom_t(C);
968 
969  return Result;
970 }
971 
972 //----------------------------------------------------------------------
974 template<class MP> MP
975 subs(const MP & P, char* x, typename MP::coeff_t val) {
976  int xi = MP::var(x);
977  if (xi<0)
978  return P;
979  else
980  return subs(P,xi,val);
981 }
982 
983 //----------------------------------------------------------------------
984 template<class T> void print(const T & x) {std::cout<<x<<std::endl;}
985 //----------------------------------------------------------------------
987 template<class MP> MP
988 swap(const MP & P, int var_i, int var_j)
989 {
990  MP Result;//("0");
991  typedef typename MP::monom_t monom_t;
992  for ( typename MP::const_iterator it = P.begin();
993  it != P.end(); ++it )
994  {
995  monom_t m(it->coeff());
996  for(int ind=0; ind<(lvar(P)+1); ++ind)
997  {
998  if((*it)[ind] !=0 ) {
999  if (ind == var_i) {
1000  m*=monom_t(var_j,(*it)[ind]);
1001  } else {
1002  if (ind == var_j)
1003  m*=monom_t(var_i,(*it)[ind]);
1004  else
1005  m*= monom_t(ind,(*it)[ind]);
1006  }
1007  }
1008  }
1009  Result+=m;
1010  }
1011  return Result;
1012 }
1013 
1014 //----------------------------------------------------------------------
1016 template<class MP> MP
1017 swap(const MP & P, char* x_i, char* x_j)
1018 {
1019  typedef typename MP::monom_t monom_t;
1020  int xi = monom_t::index_of_var(x_i);
1021  int xj = monom_t::index_of_var(x_j);
1022  return swap(P,xi,xj);
1023 }
1024 
1025 //--------------------------------------------------------------------
1026 template <class C, class O, class MONOM, class REP> C
1028 {
1029  C d=0;
1030  for(typename Polynomial::const_iterator i = P.begin(); i != P.end();i++ ) {
1031  d= gcd(d,i->coeff());
1032  }
1033  return d;
1034 }
1035 
1036 } //namespace sparse
1037 
1038 //====================================================================
1039 namespace let {
1040 
1041 TMPL void
1042 assign(sparse::monomial_seq<C,O,MONOM,REP>& p, const C&c) {
1043  p = sparse::monomial_seq<C,O,MONOM,REP>(); p.push_back(c);
1044 }
1045 
1046 template<class U, class V, class O, class UMONOM, class UREP, class VMONOM, class VREP> void
1047 assign(sparse::monomial_seq<U,O,UMONOM,UREP>& p,
1048  const sparse::monomial_seq<V,O,VMONOM,VREP>& q) {
1049 
1050  typedef typename sparse::monomial_seq<U,O,UMONOM,UREP>::Monomial MonomialU;
1051  //typedef typename sparse::monomial_seq<V,O,VMONOM,VREP>::Monomial MonomialV;
1052 
1053  for ( typename sparse::monomial_seq<V,O,VMONOM,VREP>::const_iterator it = q.begin();
1054  it != q.end(); ++it ) {
1055  U c; assign(c,it->coeff());
1056  MonomialU m(c,it->rep());
1057  p.push_back(m);
1058  }
1059 }
1060 
1061 }
1062 //======================================================================
1063 # define SparsePolynomial sparse:: monomial_seq<C,O,MONOM,REP>
1064 
1065 template<class A, class B> struct use;
1066 struct operators_of;
1067 
1069 
1070  static inline void
1072  sparse::add (r, a);
1073  }
1074  static inline void
1076  sparse::add (r, a, b);
1077  }
1078  static inline void
1079  add (SparsePolynomial &r, const SparsePolynomial &a, const C & b) {
1080  sparse::add (r, a, b);
1081  }
1082  static inline void
1083  add (SparsePolynomial &r, const C & a, const SparsePolynomial &b) {
1084  sparse::add (r, b, a);
1085  }
1086  static inline void
1088  sparse::sub (r, a );
1089  }
1090  static inline void
1092  sparse::sub (r, a, b);
1093  }
1094  static inline void
1095  sub (SparsePolynomial &r, const C & a, const SparsePolynomial &b) {
1096  sparse::sub (r, a, b);
1097  }
1098  static inline void
1099  sub (SparsePolynomial &r, const SparsePolynomial &a, const C & b) {
1100  sparse::sub (r, a, b);
1101  }
1102  static inline void
1104  sparse::mul (r, a );
1105  }
1106  static inline void
1108  sparse::mul (r, a, b);
1109  }
1110  static inline void
1111  mul (SparsePolynomial &r, const SparsePolynomial &a, const C & b) {
1112  sparse::mul (r, a, b); }
1113  static inline void
1114  mul (SparsePolynomial &r, const C & a, const SparsePolynomial &b) {
1115  sparse::mul (r, b, a);
1116  }
1117  static inline void
1119  sparse::div (r, a, b);
1120  }
1121  static inline void
1122  div (SparsePolynomial &r, const SparsePolynomial &a, const C & b) {
1123  sparse::div (r, a, b);
1124  }
1125  static inline void
1127  sparse::div (a, b);
1128  }
1129  static inline void
1130  div (SparsePolynomial &a, const C & c) {
1131  sparse::div (a, c);
1132  }
1133  static inline void
1135  sparse::rem (r, b, a);
1136  }
1137 };
1138 #undef SparsePolynomial
1139 //====================================================================
1140 }// namespace mmx
1141 #undef TMPL
1142 #undef TMPLX
1143 #undef CLASS
1144 #undef Polynomial
1145 #endif // realroot_sparse_monomial_hpp
1146 
static void mul(SparsePolynomial &r, const C &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1114
static void div(SparsePolynomial &r, const SparsePolynomial &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1118
void sub(dual< C, O > &res, const dual< C, O > &a, const dual< C, O > &b)
Definition: sparse_dual.hpp:120
bool operator==(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:88
MP convert(const MP &P, typename MP::coeff_t x, typename MP::coeff_t y, int ind)
Definition: sparse_monomials.hpp:699
Sequence of terms with reference counter.
Definition: Seq.hpp:28
void div_rem(R &q, R &a, const R &b0)
Divide a in place by b, concidering all the monomials.
Definition: sparse_monomials.hpp:554
void mul(dual< C, O > &res, const dual< C, O > &a, const dual< C, O > &b)
Definition: sparse_dual.hpp:135
T pow(const T &a, int i)
Definition: binomials.hpp:12
TMPL void diff(Polynomial &r, const Polynomial &p, int i)
Derivative of p with respect to i th variable put in r.
Definition: sparse_monomials.hpp:580
R::coeff_t & leadingcoeff(R &a)
Definition: sparse_monomials.hpp:516
const C & b
Definition: Interval_glue.hpp:25
TMPL X
Definition: polynomial_operators.hpp:148
void mul_ext_e(Polynomial &result, const Polynomial &a, const M &m)
Definition: sparse_monomials.hpp:330
int nbvar() const
static void sub(SparsePolynomial &r, const SparsePolynomial &a, const C &b)
Definition: sparse_monomials.hpp:1099
static MonomialOrdering * order()
Definition: sparse_monomials.hpp:60
const Interval & I
Definition: Interval_glue.hpp:49
Polynomial()
Definition: sparse_monomials.hpp:42
POL::const_iterator last_term(const POL &p)
Definition: sparse_monomials.hpp:543
static void add(SparsePolynomial &r, const SparsePolynomial &a, const C &b)
Definition: sparse_monomials.hpp:1079
base_t::const_reverse_iterator const_reverse_iterator
Definition: sparse_monomials.hpp:39
MP subs(unsigned var, const X &val, const MP &P)
Definition: sparse_monomials.hpp:906
MP swap(const MP &P, int var_i, int var_j)
Definition: sparse_monomials.hpp:988
void eval_at(R &r, const Polynomial &p, const VCT &x)
Definition: sparse_monomials.hpp:642
double gcd(const double &, const double &)
Definition: GMP.hpp:90
Definition: sparse_monomials.hpp:27
void coefficients(Seq< U > &r, const Polynomial &f, int v)
Definition: sparse_monomials.hpp:454
Virtual class of monomial ordering.
Definition: monomial_ordering.hpp:32
static void rem(SparsePolynomial &r, const SparsePolynomial &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1134
static void mul(SparsePolynomial &r, const SparsePolynomial &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1107
static void div(SparsePolynomial &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1126
#define Monomial
Definition: monomial.hpp:56
void add(dual< C, O > &res, const dual< C, O > &a, const dual< C, O > &b)
Definition: sparse_dual.hpp:105
TMPL int N(const MONOMIAL &v)
Definition: monomial_glue.hpp:60
int lvar(const R &p)
Index of the leading variable (of maximal index) of a polynomial.
Definition: sparse_monomials.hpp:473
#define REP
Definition: fatarcs.hpp:14
int degree(const R &p)
Degree of a polynomial.
Definition: sparse_monomials.hpp:487
static void add(SparsePolynomial &r, const C &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1083
base_t::const_iterator const_iterator
Definition: sparse_monomials.hpp:37
TMPL void shift(Polynomial &r, const Polynomial &p, const typename Polynomial::monom_t &m)
Multiply p by a monomial m and put the result in r.
Definition: sparse_monomials.hpp:600
base_t::value_type monom_t
Definition: sparse_monomials.hpp:34
virtual bool less(const int *m1, int s1, const int *m2, int s2) const =0
#define TMPL
Definition: sparse_monomials.hpp:11
#define SparsePolynomial
Definition: sparse_monomials.hpp:1063
#define TMPLX
Definition: sparse_monomials.hpp:12
TMPL void homogenize(Polynomial &r, const Polynomial &p, const Polynomial &v)
Definition: sparse_monomials.hpp:673
polynomial< COEFF, with< MonomialTensor > > Polynomial
Definition: solver_mv_cf.cpp:23
TMPL bool divide(const Monomial &m1, const Monomial &m2, Monomial &r)
Definition: monomial.hpp:207
size_type size() const
Definition: Seq.hpp:166
TMPL void rem(Polynomial &r, const Polynomial &a, const Polynomial &b)
Definition: sparse_monomials.hpp:446
#define Polynomial
Definition: sparse_monomials.hpp:13
OS & print_verbatim(OS &os, const Polynomial &P)
Definition: sparse_monomials.hpp:800
Polynomial(const monom_t &m)
Definition: sparse_monomials.hpp:50
base_t::value_type Monomial
Definition: sparse_monomials.hpp:35
static void sub(SparsePolynomial &r, const C &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1095
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
TMPL void mul_iterator(Polynomial &r, typename Polynomial::const_iterator b, typename Polynomial::const_iterator e, const Polynomial &p)
Definition: sparse_monomials.hpp:389
static MonomialOrdering * m_order
Definition: sparse_monomials.hpp:59
C coeff_t
Definition: sparse_monomials.hpp:29
C value_type
Definition: sparse_monomials.hpp:31
static bool less(const monom_t &m1, const monom_t &m2)
Definition: sparse_monomials.hpp:62
static void add(SparsePolynomial &r, const SparsePolynomial &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1075
base_t::reverse_iterator reverse_iterator
Definition: sparse_monomials.hpp:38
C Scalar
Definition: sparse_monomials.hpp:30
bool operator==(const Polynomial &p) const
Definition: polynomial.hpp:34
TMPL Polynomial::coeff_t eval(const Polynomial &p, const typename Polynomial::coeff_t &x, const typename Polynomial::coeff_t &y)
Evaluate the polynomial p for x0=x, x1=y, and the other xi=1.
Definition: sparse_monomials.hpp:623
REP base_t
Definition: sparse_monomials.hpp:33
Definition: polynomial.hpp:37
std::string to_string(const Polynomial &P, const VARIABLES &V)
Definition: sparse_monomials.hpp:733
ZZ size(const ZZ &z)
Definition: GMPXX.hpp:67
O Order
Definition: sparse_monomials.hpp:32
TMPL POL
Definition: polynomial_dual.hpp:74
Polynomial(const C &c)
Definition: sparse_monomials.hpp:43
bool operator!=(const C &c) const
Definition: sparse_monomials.hpp:55
#define Scalar
Definition: polynomial_operators.hpp:12
Polynomial self_t
Definition: sparse_monomials.hpp:40
POL::coeff_t coeffof(const POL &p, const typename POL::monom_t &mono)
Definition: sparse_monomials.hpp:526
void div(dual< C, O > &f, const C &c)
Definition: sparse_dual.hpp:205
Polynomial P
Definition: solver_mv_cf.cpp:24
static void add(SparsePolynomial &r, const SparsePolynomial &a)
Definition: sparse_monomials.hpp:1071
static void sub(SparsePolynomial &r, const SparsePolynomial &a, const SparsePolynomial &b)
Definition: sparse_monomials.hpp:1091
POL scale(const POL &p, C a, int v)
Definition: sparse_monomials.hpp:857
static void sub(SparsePolynomial &r, const SparsePolynomial &a)
Definition: sparse_monomials.hpp:1087
void mul_ext(Polynomial &r, const Polynomial &a, const M &m)
Multiplication of a polynomial by a monomial or a scalar.
Definition: sparse_monomials.hpp:308
bool operator!=(const Polynomial &p) const
Definition: sparse_monomials.hpp:53
const C & c
Definition: Interval_glue.hpp:45
C content(const Polynomial &P)
Definition: sparse_monomials.hpp:1027
Definition: polynomial_operators.hpp:77
unsigned nbvar(const R &p)
Number of variables of a polynomial.
Definition: sparse_monomials.hpp:481
static void mul(SparsePolynomial &r, const SparsePolynomial &a, const C &b)
Definition: sparse_monomials.hpp:1111
double C
Definition: solver_mv_fatarcs.cpp:16
base_t::iterator iterator
Definition: sparse_monomials.hpp:36
static void div(SparsePolynomial &r, const SparsePolynomial &a, const C &b)
Definition: sparse_monomials.hpp:1122
OSTREAM & print(OSTREAM &os, const dual< C, O > &P, const variables &V)
Output operator.
Definition: sparse_dual.hpp:260
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
Monomial class.
Definition: monomial.hpp:62
OS & print_as_double(OS &os, const Polynomial &P, const VARIABLES &V)
Definition: sparse_monomials.hpp:775
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
static void mul(SparsePolynomial &r, const SparsePolynomial &a)
Definition: sparse_monomials.hpp:1103
Definition: array.hpp:12
Definition: variables.hpp:65
static void div(SparsePolynomial &a, const C &c)
Definition: sparse_monomials.hpp:1130
#define CLASS
Definition: sparse_monomials.hpp:14
#define assert(expr, msg)
Definition: shared_object.hpp:57
Home