flint_wrapper.h
1 #ifndef SYMENGINE_FLINT_WRAPPER_H
2 #define SYMENGINE_FLINT_WRAPPER_H
3 
4 #include <symengine/symengine_rcp.h>
5 #include <gmp.h>
6 
7 #include <flint/fmpz.h>
8 #include <flint/fmpq.h>
9 #include <flint/fmpz_poly.h>
10 #include <flint/fmpz_poly_factor.h>
11 #include <flint/fmpq_poly.h>
12 
13 namespace SymEngine
14 {
15 
17 {
18 private:
19  fmpz_t mp;
20 
21 public:
22  template <
23  typename T,
24  typename std::enable_if<
26  = 0>
27  inline fmpz_wrapper(const T i)
28  {
29  fmpz_init(mp);
30  fmpz_set_ui(mp, i);
31  }
32  template <
33  typename T,
34  typename std::enable_if<
36  = 0>
37  inline fmpz_wrapper(const T i)
38  {
39  fmpz_init(mp);
40  fmpz_set_si(mp, i);
41  }
42  inline fmpz_wrapper()
43  {
44  fmpz_init(mp);
45  }
46  inline fmpz_wrapper(const mpz_t m)
47  {
48  fmpz_init(mp);
49  fmpz_set_mpz(mp, m);
50  }
51  inline fmpz_wrapper(const fmpz_t m)
52  {
53  fmpz_init(mp);
54  fmpz_set(mp, m);
55  }
56  inline fmpz_wrapper(const std::string &s, unsigned base = 10)
57  {
58  fmpz_init(mp);
59  fmpz_set_str(mp, s.c_str(), base);
60  }
61  inline fmpz_wrapper(const fmpz_wrapper &other)
62  {
63  fmpz_init(mp);
64  fmpz_set(mp, other.get_fmpz_t());
65  }
66  inline fmpz_wrapper(fmpz_wrapper &&other) SYMENGINE_NOEXCEPT
67  {
68  fmpz_init(mp);
69  fmpz_swap(mp, other.get_fmpz_t());
70  }
71  inline fmpz_wrapper &operator=(const fmpz_wrapper &other)
72  {
73  fmpz_set(mp, other.get_fmpz_t());
74  return *this;
75  }
76  inline fmpz_wrapper &operator=(fmpz_wrapper &&other) SYMENGINE_NOEXCEPT
77  {
78  fmpz_swap(mp, other.get_fmpz_t());
79  return *this;
80  }
81  inline ~fmpz_wrapper() SYMENGINE_NOEXCEPT
82  {
83  fmpz_clear(mp);
84  }
85  inline fmpz *get_fmpz_t()
86  {
87  return mp;
88  }
89  inline const fmpz *get_fmpz_t() const
90  {
91  return mp;
92  }
93  inline friend fmpz_wrapper operator+(const fmpz_wrapper &a,
94  const fmpz_wrapper &b)
95  {
96  fmpz_wrapper res;
97  fmpz_add(res.get_fmpz_t(), a.get_fmpz_t(), b.get_fmpz_t());
98  return res;
99  }
100  inline fmpz_wrapper operator+=(const fmpz_wrapper &a)
101  {
102  fmpz_add(mp, mp, a.get_fmpz_t());
103  return *this;
104  }
105  inline friend fmpz_wrapper operator-(const fmpz_wrapper &a,
106  const fmpz_wrapper &b)
107  {
108  fmpz_wrapper res;
109  fmpz_sub(res.get_fmpz_t(), a.get_fmpz_t(), b.get_fmpz_t());
110  return res;
111  }
112  inline fmpz_wrapper operator-=(const fmpz_wrapper &a)
113  {
114  fmpz_sub(mp, mp, a.get_fmpz_t());
115  return *this;
116  }
117  inline fmpz_wrapper operator-() const
118  {
119  fmpz_wrapper res;
120  fmpz_neg(res.get_fmpz_t(), mp);
121  return res;
122  }
123  inline friend fmpz_wrapper operator*(const fmpz_wrapper &a,
124  const fmpz_wrapper &b)
125  {
126  fmpz_wrapper res;
127  fmpz_mul(res.get_fmpz_t(), a.get_fmpz_t(), b.get_fmpz_t());
128  return res;
129  }
130  inline fmpz_wrapper operator*=(const fmpz_wrapper &a)
131  {
132  fmpz_mul(mp, mp, a.get_fmpz_t());
133  return *this;
134  }
135  inline friend fmpz_wrapper operator/(const fmpz_wrapper &a,
136  const fmpz_wrapper &b)
137  {
138  fmpz_wrapper res;
139  fmpz_tdiv_q(res.get_fmpz_t(), a.get_fmpz_t(), b.get_fmpz_t());
140  return res;
141  }
142  inline fmpz_wrapper operator/=(const fmpz_wrapper &a)
143  {
144  fmpz_tdiv_q(mp, mp, a.get_fmpz_t());
145  return *this;
146  }
147  inline friend fmpz_wrapper operator%(const fmpz_wrapper &a,
148  const fmpz_wrapper &b)
149  {
150  fmpz_wrapper res, tmp;
151  fmpz_tdiv_qr(tmp.get_fmpz_t(), res.get_fmpz_t(), a.get_fmpz_t(),
152  b.get_fmpz_t());
153  return res;
154  }
155  inline fmpz_wrapper operator%=(const fmpz_wrapper &a)
156  {
157  fmpz_wrapper tmp;
158  fmpz_tdiv_qr(tmp.get_fmpz_t(), mp, mp, a.get_fmpz_t());
159  return *this;
160  }
161  inline fmpz_wrapper operator++()
162  {
163  fmpz_add_ui(mp, mp, 1);
164  return *this;
165  }
166  inline fmpz_wrapper operator++(int)
167  {
168  fmpz_wrapper orig = *this;
169  ++(*this);
170  return orig;
171  }
172  inline fmpz_wrapper operator--()
173  {
174  fmpz_sub_ui(mp, mp, 1);
175  return *this;
176  }
177  inline fmpz_wrapper operator--(int)
178  {
179  fmpz_wrapper orig = *this;
180  --(*this);
181  return orig;
182  }
183  inline friend bool operator==(const fmpz_wrapper &a, const fmpz_wrapper &b)
184  {
185  return fmpz_equal(a.get_fmpz_t(), b.get_fmpz_t()) == 1;
186  }
187  inline friend bool operator!=(const fmpz_wrapper &a, const fmpz_wrapper &b)
188  {
189  return fmpz_equal(a.get_fmpz_t(), b.get_fmpz_t()) != 1;
190  }
191  inline friend bool operator<(const fmpz_wrapper &a, const fmpz_wrapper &b)
192  {
193  return fmpz_cmp(a.get_fmpz_t(), b.get_fmpz_t()) < 0;
194  }
195  inline friend bool operator<=(const fmpz_wrapper &a, const fmpz_wrapper &b)
196  {
197  return fmpz_cmp(a.get_fmpz_t(), b.get_fmpz_t()) <= 0;
198  }
199  inline friend bool operator>(const fmpz_wrapper &a, const fmpz_wrapper &b)
200  {
201  return fmpz_cmp(a.get_fmpz_t(), b.get_fmpz_t()) > 0;
202  }
203  inline friend bool operator>=(const fmpz_wrapper &a, const fmpz_wrapper &b)
204  {
205  return fmpz_cmp(a.get_fmpz_t(), b.get_fmpz_t()) >= 0;
206  }
207  inline fmpz_wrapper operator<<=(unsigned long u)
208  {
209  fmpz_mul_2exp(mp, mp, u);
210  return *this;
211  }
212  inline fmpz_wrapper operator<<(unsigned long u) const
213  {
214  fmpz_wrapper res;
215  fmpz_mul_2exp(res.get_fmpz_t(), mp, u);
216  return res;
217  }
218  inline fmpz_wrapper operator>>=(unsigned long u)
219  {
220  fmpz_tdiv_q_2exp(mp, mp, u);
221  return *this;
222  }
223  inline fmpz_wrapper operator>>(unsigned long u) const
224  {
225  fmpz_wrapper res;
226  fmpz_tdiv_q_2exp(res.get_fmpz_t(), mp, u);
227  return res;
228  }
229  inline fmpz_wrapper root(unsigned int n) const
230  {
231  fmpz_wrapper res;
232  fmpz_root(res.get_fmpz_t(), mp, n);
233  return res;
234  }
235 };
236 
238 {
239 
240 public:
241  mpz_view_flint(const fmpz_wrapper &i)
242  {
243  if (!COEFF_IS_MPZ(*i.get_fmpz_t())) {
244  mpz_init_set_si(m, *i.get_fmpz_t());
245  } else {
246  ptr = COEFF_TO_PTR(*i.get_fmpz_t());
247  }
248  }
249  operator mpz_srcptr() const
250  {
251  if (ptr == nullptr)
252  return m;
253  return ptr;
254  }
255  ~mpz_view_flint()
256  {
257  if (ptr == nullptr)
258  mpz_clear(m);
259  }
260 
261 private:
262  mpz_srcptr ptr = nullptr;
263  mpz_t m;
264 };
265 
267 {
268 private:
269  fmpq_t mp;
270 
271 public:
272  fmpq *get_fmpq_t()
273  {
274  return mp;
275  }
276  const fmpq *get_fmpq_t() const
277  {
278  return mp;
279  }
280  fmpq_wrapper()
281  {
282  fmpq_init(mp);
283  }
284  fmpq_wrapper(const mpz_t m)
285  {
286  fmpq_init(mp);
287  fmpz_set_mpz(fmpq_numref(mp), m);
288  }
289  fmpq_wrapper(const fmpz_t m)
290  {
291  fmpq_init(mp);
292  fmpz_set(fmpq_numref(mp), m);
293  }
294  fmpq_wrapper(const mpq_t m)
295  {
296  fmpq_init(mp);
297  fmpq_set_mpq(mp, m);
298  }
299  fmpq_wrapper(const fmpq_t m)
300  {
301  fmpq_init(mp);
302  fmpq_set(mp, m);
303  }
304  template <
305  typename T,
306  typename std::enable_if<
308  = 0>
309  fmpq_wrapper(const T i)
310  {
311  fmpq_init(mp);
312  fmpz_set_ui(fmpq_numref(mp), i);
313  }
314  template <
315  typename T,
316  typename std::enable_if<
318  = 0>
319  fmpq_wrapper(const T i)
320  {
321  fmpq_init(mp);
322  fmpz_set_si(fmpq_numref(mp), i);
323  }
324  fmpq_wrapper(const fmpz_wrapper &n, const fmpz_wrapper &d = 1)
325  {
326  fmpq_init(mp);
327  fmpz_set(fmpq_numref(mp), n.get_fmpz_t());
328  fmpz_set(fmpq_denref(mp), d.get_fmpz_t());
329  fmpq_canonicalise(mp);
330  }
331  fmpq_wrapper(const fmpq_wrapper &other)
332  {
333  fmpq_init(mp);
334  fmpq_set(mp, other.get_fmpq_t());
335  }
336  fmpq_wrapper(fmpq_wrapper &&other) SYMENGINE_NOEXCEPT
337  {
338  fmpq_init(mp);
339  fmpq_swap(mp, other.get_fmpq_t());
340  }
341  fmpq_wrapper &operator=(const fmpq_wrapper &other)
342  {
343  fmpq_set(mp, other.get_fmpq_t());
344  return *this;
345  }
346  fmpq_wrapper &operator=(fmpq_wrapper &&other) SYMENGINE_NOEXCEPT
347  {
348  fmpq_swap(mp, other.get_fmpq_t());
349  return *this;
350  }
351  ~fmpq_wrapper() SYMENGINE_NOEXCEPT
352  {
353  fmpq_clear(mp);
354  }
355  void canonicalise()
356  {
357  fmpq_canonicalise(mp);
358  }
359  const fmpz_wrapper &get_den() const
360  {
361  return reinterpret_cast<const fmpz_wrapper &>(*fmpq_denref(mp));
362  }
363  const fmpz_wrapper &get_num() const
364  {
365  return reinterpret_cast<const fmpz_wrapper &>(*fmpq_numref(mp));
366  }
367  fmpz_wrapper &get_den()
368  {
369  return reinterpret_cast<fmpz_wrapper &>(*fmpq_denref(mp));
370  }
371  fmpz_wrapper &get_num()
372  {
373  return reinterpret_cast<fmpz_wrapper &>(*fmpq_numref(mp));
374  }
375  friend fmpq_wrapper operator+(const fmpq_wrapper &a, const fmpq_wrapper &b)
376  {
377  fmpq_wrapper res;
378  fmpq_add(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
379  return res;
380  }
381  fmpq_wrapper operator+=(const fmpq_wrapper &a)
382  {
383  fmpq_add(mp, mp, a.get_fmpq_t());
384  return *this;
385  }
386  friend fmpq_wrapper operator-(const fmpq_wrapper &a, const fmpq_wrapper &b)
387  {
388  fmpq_wrapper res;
389  fmpq_sub(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
390  return res;
391  }
392  fmpq_wrapper operator-=(const fmpq_wrapper &a)
393  {
394  fmpq_sub(mp, mp, a.get_fmpq_t());
395  return *this;
396  }
397  fmpq_wrapper operator-() const
398  {
399  fmpq_wrapper res;
400  fmpq_neg(res.get_fmpq_t(), mp);
401  return res;
402  }
403  friend fmpq_wrapper operator*(const fmpq_wrapper &a, const fmpq_wrapper &b)
404  {
405  fmpq_wrapper res;
406  fmpq_mul(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
407  return res;
408  }
409  fmpq_wrapper operator*=(const fmpq_wrapper &a)
410  {
411  fmpq_mul(mp, mp, a.get_fmpq_t());
412  return *this;
413  }
414  friend fmpq_wrapper operator/(const fmpq_wrapper &a, const fmpq_wrapper &b)
415  {
416  fmpq_wrapper res;
417  fmpq_div(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
418  return res;
419  }
420  fmpq_wrapper operator/=(const fmpq_wrapper &a)
421  {
422  fmpq_div(mp, mp, a.get_fmpq_t());
423  return *this;
424  }
425  bool operator==(const fmpq_wrapper &other) const
426  {
427  return fmpq_equal(mp, other.get_fmpq_t());
428  }
429  bool operator!=(const fmpq_wrapper &other) const
430  {
431  return not(*this == other);
432  }
433  bool operator<(const fmpq_wrapper &other) const
434  {
435  return fmpq_cmp(mp, other.get_fmpq_t()) < 0;
436  }
437  bool operator<=(const fmpq_wrapper &other) const
438  {
439  return fmpq_cmp(mp, other.get_fmpq_t()) <= 0;
440  }
441  bool operator>(const fmpq_wrapper &other) const
442  {
443  return fmpq_cmp(mp, other.get_fmpq_t()) > 0;
444  }
445  bool operator>=(const fmpq_wrapper &other) const
446  {
447  return fmpq_cmp(mp, other.get_fmpq_t()) >= 0;
448  }
449  bool is_zero() const
450  {
451  return fmpq_is_zero(mp);
452  }
453  bool is_one() const
454  {
455  return fmpq_is_one(mp);
456  }
457 };
458 
460 {
461 
462 public:
463  mpq_view_flint(const fmpq_wrapper &i)
464  {
465  mpq_init(m);
466  fmpq_get_mpq(m, i.get_fmpq_t());
467  }
468  operator mpq_srcptr() const
469  {
470  return m;
471  }
472  ~mpq_view_flint()
473  {
474  mpq_clear(m);
475  }
476 
477 private:
478  mpq_t m;
479 };
480 
482 {
483 private:
484  fmpz_poly_factor_t fac;
485 
486 public:
488 
490  {
491  fmpz_poly_factor_init(fac);
492  }
494  {
495  fmpz_poly_factor_init(fac);
496  fmpz_poly_factor_set(fac, other.get_fmpz_poly_factor_t());
497  }
498  fmpz_poly_factor_wrapper &operator=(const fmpz_poly_factor_wrapper &other)
499  {
500  fmpz_poly_factor_set(fac, other.get_fmpz_poly_factor_t());
501  return *this;
502  }
504  {
505  fmpz_poly_factor_clear(fac);
506  }
507 
508  const fmpz_poly_factor_t &get_fmpz_poly_factor_t() const
509  {
510  return fac;
511  }
512  fmpz_poly_factor_t &get_fmpz_poly_factor_t()
513  {
514  return fac;
515  }
516 };
517 
519 {
520 private:
521  fmpz_poly_t poly;
522 
523 public:
525 
527  {
528  fmpz_poly_init(poly);
529  }
530  fmpz_poly_wrapper(int i)
531  {
532  fmpz_poly_init(poly);
533  fmpz_poly_set_si(poly, i);
534  }
535  fmpz_poly_wrapper(const char *cp)
536  {
537  fmpz_poly_init(poly);
538  fmpz_poly_set_str(poly, cp);
539  }
541  {
542  fmpz_poly_init(poly);
543  fmpz_poly_set_fmpz(poly, z.get_fmpz_t());
544  }
546  {
547  fmpz_poly_init(poly);
548  fmpz_poly_set(poly, *other.get_fmpz_poly_t());
549  }
551  {
552  fmpz_poly_init(poly);
553  fmpz_poly_swap(poly, *other.get_fmpz_poly_t());
554  }
555  fmpz_poly_wrapper &operator=(const fmpz_poly_wrapper &other)
556  {
557  fmpz_poly_set(poly, *other.get_fmpz_poly_t());
558  return *this;
559  }
560  fmpz_poly_wrapper &operator=(fmpz_poly_wrapper &&other)
561  {
562  fmpz_poly_swap(poly, *other.get_fmpz_poly_t());
563  return *this;
564  }
565  void swap_fmpz_poly_t(fmpz_poly_struct &other)
566  {
567  fmpz_poly_swap(poly, &other);
568  }
570  {
571  fmpz_poly_clear(poly);
572  }
573  const fmpz_poly_t *get_fmpz_poly_t() const
574  {
575  return &poly;
576  }
577  fmpz_poly_t *get_fmpz_poly_t()
578  {
579  return &poly;
580  }
581  bool operator==(const fmpz_poly_wrapper &other) const
582  {
583  return fmpz_poly_equal(poly, *other.get_fmpz_poly_t()) == 1;
584  }
585  long degree() const
586  {
587  return fmpz_poly_degree(poly);
588  }
589  long length() const
590  {
591  return fmpz_poly_length(poly);
592  }
593  std::string to_string() const
594  {
595  return fmpz_poly_get_str(poly);
596  }
597  fmpz_wrapper get_coeff(unsigned int n) const
598  {
599  fmpz_wrapper z;
600  fmpz_poly_get_coeff_fmpz(z.get_fmpz_t(), poly, n);
601  return z;
602  }
603  void set_coeff(unsigned int n, const fmpz_wrapper &z)
604  {
605  fmpz_poly_set_coeff_fmpz(poly, n, z.get_fmpz_t());
606  }
607  fmpz_wrapper eval(const fmpz_wrapper &z) const
608  {
609  fmpz_wrapper r;
610  fmpz_poly_evaluate_fmpz(r.get_fmpz_t(), poly, z.get_fmpz_t());
611  return r;
612  }
613  void eval_vec(fmpz *ovec, fmpz *ivec, unsigned int n) const
614  {
615  fmpz_poly_evaluate_fmpz_vec(ovec, *get_fmpz_poly_t(), ivec, n);
616  }
617  fmpz_poly_wrapper operator-() const
618  {
620  fmpz_poly_neg(*r.get_fmpz_poly_t(), *get_fmpz_poly_t());
621  return r;
622  }
623  void operator+=(const fmpz_poly_wrapper &other)
624  {
625  fmpz_poly_add(*get_fmpz_poly_t(), *get_fmpz_poly_t(),
626  *other.get_fmpz_poly_t());
627  }
628  void operator-=(const fmpz_poly_wrapper &other)
629  {
630  fmpz_poly_sub(*get_fmpz_poly_t(), *get_fmpz_poly_t(),
631  *other.get_fmpz_poly_t());
632  }
633  void operator*=(const fmpz_poly_wrapper &other)
634  {
635  fmpz_poly_mul(*get_fmpz_poly_t(), *get_fmpz_poly_t(),
636  *other.get_fmpz_poly_t());
637  }
638 
639  friend fmpz_poly_wrapper operator*(const fmpz_poly_wrapper &a,
640  const fmpz_poly_wrapper &b)
641  {
642  fmpz_poly_wrapper res;
643  fmpz_poly_mul(*res.get_fmpz_poly_t(), *a.get_fmpz_poly_t(),
644  *b.get_fmpz_poly_t());
645  return res;
646  }
647 
648  fmpz_poly_wrapper gcd(const fmpz_poly_wrapper &other) const
649  {
651  fmpz_poly_gcd(*r.get_fmpz_poly_t(), poly, *other.get_fmpz_poly_t());
652  return r;
653  }
654  fmpz_poly_wrapper lcm(const fmpz_poly_wrapper &other) const
655  {
657  fmpz_poly_lcm(*r.get_fmpz_poly_t(), poly, *other.get_fmpz_poly_t());
658  return r;
659  }
660  fmpz_poly_wrapper pow(unsigned int n) const
661  {
663  fmpz_poly_pow(*r.get_fmpz_poly_t(), poly, n);
664  return r;
665  }
666  void divrem(fmpz_poly_wrapper &q, fmpz_poly_wrapper &r,
667  const fmpz_poly_wrapper &b) const
668  {
669  return fmpz_poly_divrem(*q.get_fmpz_poly_t(), *r.get_fmpz_poly_t(),
670  *get_fmpz_poly_t(), *b.get_fmpz_poly_t());
671  }
672  fmpz_poly_factor_wrapper factors() const
673  {
675 #if __FLINT_RELEASE > 20502
676  fmpz_poly_factor(r.get_fmpz_poly_factor_t(), poly);
677 #else
678  throw std::runtime_error(
679  "FLINT's Version must be higher than 2.5.2 to obtain factors");
680 #endif
681  return r;
682  }
683  fmpz_poly_wrapper derivative() const
684  {
686  fmpz_poly_derivative(*r.get_fmpz_poly_t(), poly);
687  return r;
688  }
689 };
690 
692 {
693 private:
694  fmpq_poly_t poly;
695 
696 public:
698 
700  {
701  fmpq_poly_init(poly);
702  }
703  fmpq_poly_wrapper(int i)
704  {
705  fmpq_poly_init(poly);
706  fmpq_poly_set_si(poly, i);
707  }
708  fmpq_poly_wrapper(const char *cp)
709  {
710  fmpq_poly_init(poly);
711  fmpq_poly_set_str(poly, cp);
712  }
713  fmpq_poly_wrapper(const mpz_t z)
714  {
715  fmpz_wrapper fz(z);
716  fmpq_poly_init(poly);
717  fmpq_poly_set_fmpz(poly, fz.get_fmpz_t());
718  }
719  fmpq_poly_wrapper(const mpq_t q)
720  {
721  fmpq_wrapper fq(q);
722  fmpq_poly_init(poly);
723  fmpq_poly_set_fmpq(poly, fq.get_fmpq_t());
724  }
726  {
727  fmpq_poly_init(poly);
728  fmpq_poly_set_fmpq(poly, q.get_fmpq_t());
729  }
731  {
732  fmpq_poly_init(poly);
733  fmpq_poly_set(poly, *other.get_fmpq_poly_t());
734  }
736  {
737  fmpq_poly_init(poly);
738  fmpq_poly_swap(poly, *other.get_fmpq_poly_t());
739  }
740  fmpq_poly_wrapper &operator=(const fmpq_poly_wrapper &other)
741  {
742  fmpq_poly_set(poly, *other.get_fmpq_poly_t());
743  return *this;
744  }
745  fmpq_poly_wrapper &operator=(fmpq_poly_wrapper &&other)
746  {
747  fmpq_poly_swap(poly, *other.get_fmpq_poly_t());
748  return *this;
749  }
751  {
752  fmpq_poly_clear(poly);
753  }
754 
755  const fmpq_poly_t *get_fmpq_poly_t() const
756  {
757  return &poly;
758  }
759  fmpq_poly_t *get_fmpq_poly_t()
760  {
761  return &poly;
762  }
763  std::string to_string() const
764  {
765  return fmpq_poly_get_str(poly);
766  }
767  long degree() const
768  {
769  return fmpq_poly_degree(poly);
770  }
771  long length() const
772  {
773  return fmpq_poly_length(poly);
774  }
775  void set_coeff(unsigned int n, const fmpq_wrapper &z)
776  {
777  fmpq_poly_set_coeff_fmpq(poly, n, z.get_fmpq_t());
778  }
779  fmpq_wrapper eval(const fmpq_wrapper &z) const
780  {
781  fmpq_wrapper r;
782  fmpq_poly_evaluate_fmpq(r.get_fmpq_t(), poly, z.get_fmpq_t());
783  return r;
784  }
785  fmpq_wrapper get_coeff(unsigned int deg) const
786  {
787  fmpq_wrapper q;
788  fmpq_poly_get_coeff_fmpq(q.get_fmpq_t(), poly, deg);
789  return q;
790  }
791 
792  fmpq_poly_wrapper mullow(const fmpq_poly_wrapper &o,
793  unsigned int prec) const
794  {
796  fmpq_poly_mullow(*r.get_fmpq_poly_t(), poly, *o.get_fmpq_poly_t(),
797  prec);
798  return r;
799  }
800  fmpq_poly_wrapper pow(unsigned int n) const
801  {
803  fmpq_poly_pow(*r.get_fmpq_poly_t(), poly, n);
804  return r;
805  }
806  fmpq_poly_wrapper derivative() const
807  {
809  fmpq_poly_derivative(*r.get_fmpq_poly_t(), poly);
810  return r;
811  }
812  fmpq_poly_wrapper integral() const
813  {
815  fmpq_poly_integral(*r.get_fmpq_poly_t(), poly);
816  return r;
817  }
818 
819  fmpq_poly_wrapper inv_series(unsigned int prec) const
820  {
822  fmpq_poly_inv_series(*r.get_fmpq_poly_t(), poly, prec);
823  return r;
824  }
825  fmpq_poly_wrapper revert_series(unsigned int prec) const
826  {
828  fmpq_poly_revert_series(*r.get_fmpq_poly_t(), poly, prec);
829  return r;
830  }
831  fmpq_poly_wrapper log_series(unsigned int prec) const
832  {
834  fmpq_poly_log_series(*r.get_fmpq_poly_t(), poly, prec);
835  return r;
836  }
837  fmpq_poly_wrapper exp_series(unsigned int prec) const
838  {
840  fmpq_poly_exp_series(*r.get_fmpq_poly_t(), poly, prec);
841  return r;
842  }
843  fmpq_poly_wrapper sin_series(unsigned int prec) const
844  {
846  fmpq_poly_sin_series(*r.get_fmpq_poly_t(), poly, prec);
847  return r;
848  }
849  fmpq_poly_wrapper cos_series(unsigned int prec) const
850  {
852  fmpq_poly_cos_series(*r.get_fmpq_poly_t(), poly, prec);
853  return r;
854  }
855  fmpq_poly_wrapper tan_series(unsigned int prec) const
856  {
858  fmpq_poly_tan_series(*r.get_fmpq_poly_t(), poly, prec);
859  return r;
860  }
861  fmpq_poly_wrapper asin_series(unsigned int prec) const
862  {
864  fmpq_poly_asin_series(*r.get_fmpq_poly_t(), poly, prec);
865  return r;
866  }
867  fmpq_poly_wrapper atan_series(unsigned int prec) const
868  {
870  fmpq_poly_atan_series(*r.get_fmpq_poly_t(), poly, prec);
871  return r;
872  }
873  fmpq_poly_wrapper sinh_series(unsigned int prec) const
874  {
876  fmpq_poly_sinh_series(*r.get_fmpq_poly_t(), poly, prec);
877  return r;
878  }
879  fmpq_poly_wrapper cosh_series(unsigned int prec) const
880  {
882  fmpq_poly_cosh_series(*r.get_fmpq_poly_t(), poly, prec);
883  return r;
884  }
885  fmpq_poly_wrapper tanh_series(unsigned int prec) const
886  {
888  fmpq_poly_tanh_series(*r.get_fmpq_poly_t(), poly, prec);
889  return r;
890  }
891  fmpq_poly_wrapper asinh_series(unsigned int prec) const
892  {
894  fmpq_poly_asinh_series(*r.get_fmpq_poly_t(), poly, prec);
895  return r;
896  }
897  fmpq_poly_wrapper atanh_series(unsigned int prec) const
898  {
900  fmpq_poly_atanh_series(*r.get_fmpq_poly_t(), poly, prec);
901  return r;
902  }
903  fmpq_poly_wrapper subs(const fmpq_poly_wrapper &o, unsigned int prec) const
904  {
906  fmpq_poly_compose_series(*r.get_fmpq_poly_t(), poly,
907  *o.get_fmpq_poly_t(), prec);
908  return r;
909  }
910  void set_zero()
911  {
912  fmpq_poly_zero(poly);
913  }
914  void set_one()
915  {
916  fmpq_poly_one(poly);
917  }
918 
919  bool operator==(const fmpq_poly_wrapper &o) const
920  {
921  return fmpq_poly_equal(poly, *o.get_fmpq_poly_t()) != 0;
922  }
923  bool operator<(const fmpq_poly_wrapper &o) const
924  {
925  return fmpq_poly_cmp(poly, *o.get_fmpq_poly_t()) == -1;
926  }
927 
928  friend fmpq_poly_wrapper operator+(const fmpq_poly_wrapper &a,
929  const fmpq_poly_wrapper &o)
930  {
932  fmpq_poly_add(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
933  *o.get_fmpq_poly_t());
934  return r;
935  }
936  friend fmpq_poly_wrapper operator-(const fmpq_poly_wrapper &a,
937  const fmpq_poly_wrapper &o)
938  {
940  fmpq_poly_sub(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
941  *o.get_fmpq_poly_t());
942  return r;
943  }
944  fmpq_poly_wrapper operator-() const
945  {
947  fmpq_poly_neg(*r.get_fmpq_poly_t(), *get_fmpq_poly_t());
948  return r;
949  }
950  friend fmpq_poly_wrapper operator*(const fmpq_poly_wrapper &a,
951  const fmpq_wrapper &q)
952  {
954  fmpq_poly_scalar_mul_fmpq(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
955  q.get_fmpq_t());
956  return r;
957  }
958  friend fmpq_poly_wrapper operator*(const fmpq_poly_wrapper &a,
959  const fmpq_poly_wrapper &o)
960  {
962  fmpq_poly_mul(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
963  *o.get_fmpq_poly_t());
964  return r;
965  }
966  friend fmpq_poly_wrapper operator/(const fmpq_poly_wrapper &a,
967  const fmpq_wrapper &q)
968  {
970  fmpq_poly_scalar_div_fmpq(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
971  q.get_fmpq_t());
972  return r;
973  }
974  void divrem(fmpq_poly_wrapper &q, fmpq_poly_wrapper &r,
975  const fmpq_poly_wrapper &b) const
976  {
977  return fmpq_poly_divrem(*q.get_fmpq_poly_t(), *r.get_fmpq_poly_t(),
978  *get_fmpq_poly_t(), *b.get_fmpq_poly_t());
979  }
980 
981  fmpq_poly_wrapper gcd(const fmpq_poly_wrapper &other) const
982  {
984  fmpq_poly_gcd(*r.get_fmpq_poly_t(), poly, *other.get_fmpq_poly_t());
985  return r;
986  }
987  fmpq_poly_wrapper lcm(const fmpq_poly_wrapper &other) const
988  {
990  fmpq_poly_lcm(*r.get_fmpq_poly_t(), poly, *other.get_fmpq_poly_t());
991  return r;
992  }
993  void operator+=(const fmpq_poly_wrapper &o)
994  {
995  fmpq_poly_add(poly, poly, *o.get_fmpq_poly_t());
996  }
997  void operator-=(const fmpq_poly_wrapper &o)
998  {
999  fmpq_poly_sub(poly, poly, *o.get_fmpq_poly_t());
1000  }
1001  void operator*=(const fmpq_poly_wrapper &o)
1002  {
1003  fmpq_poly_mul(poly, poly, *o.get_fmpq_poly_t());
1004  }
1005 };
1006 
1007 } // namespace SymEngine
1008 
1009 #endif // SYMENGINE_FLINT_WRAPPER_H
T c_str(T... args)
Main namespace for SymEngine package.
Definition: add.cpp:19