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(m);
245  fmpz_get_mpz(m, i.get_fmpz_t());
246  } else {
247  ptr = COEFF_TO_PTR(*i.get_fmpz_t());
248  }
249  }
250  operator mpz_srcptr() const
251  {
252  if (ptr == nullptr)
253  return m;
254  return ptr;
255  }
256  ~mpz_view_flint()
257  {
258  if (ptr == nullptr)
259  mpz_clear(m);
260  }
261 
262 private:
263  mpz_srcptr ptr = nullptr;
264  mpz_t m;
265 };
266 
268 {
269 private:
270  fmpq_t mp;
271 
272 public:
273  fmpq *get_fmpq_t()
274  {
275  return mp;
276  }
277  const fmpq *get_fmpq_t() const
278  {
279  return mp;
280  }
281  fmpq_wrapper()
282  {
283  fmpq_init(mp);
284  }
285  fmpq_wrapper(const mpz_t m)
286  {
287  fmpq_init(mp);
288  fmpz_set_mpz(fmpq_numref(mp), m);
289  }
290  fmpq_wrapper(const fmpz_t m)
291  {
292  fmpq_init(mp);
293  fmpz_set(fmpq_numref(mp), m);
294  }
295  fmpq_wrapper(const mpq_t m)
296  {
297  fmpq_init(mp);
298  fmpq_set_mpq(mp, m);
299  }
300  fmpq_wrapper(const fmpq_t m)
301  {
302  fmpq_init(mp);
303  fmpq_set(mp, m);
304  }
305  template <
306  typename T,
307  typename std::enable_if<
309  = 0>
310  fmpq_wrapper(const T i)
311  {
312  fmpq_init(mp);
313  fmpz_set_ui(fmpq_numref(mp), i);
314  }
315  template <
316  typename T,
317  typename std::enable_if<
319  = 0>
320  fmpq_wrapper(const T i)
321  {
322  fmpq_init(mp);
323  fmpz_set_si(fmpq_numref(mp), i);
324  }
325  fmpq_wrapper(const fmpz_wrapper &n, const fmpz_wrapper &d = 1)
326  {
327  fmpq_init(mp);
328  fmpz_set(fmpq_numref(mp), n.get_fmpz_t());
329  fmpz_set(fmpq_denref(mp), d.get_fmpz_t());
330  fmpq_canonicalise(mp);
331  }
332  fmpq_wrapper(const fmpq_wrapper &other)
333  {
334  fmpq_init(mp);
335  fmpq_set(mp, other.get_fmpq_t());
336  }
337  fmpq_wrapper(fmpq_wrapper &&other) SYMENGINE_NOEXCEPT
338  {
339  fmpq_init(mp);
340  fmpq_swap(mp, other.get_fmpq_t());
341  }
342  fmpq_wrapper &operator=(const fmpq_wrapper &other)
343  {
344  fmpq_set(mp, other.get_fmpq_t());
345  return *this;
346  }
347  fmpq_wrapper &operator=(fmpq_wrapper &&other) SYMENGINE_NOEXCEPT
348  {
349  fmpq_swap(mp, other.get_fmpq_t());
350  return *this;
351  }
352  ~fmpq_wrapper() SYMENGINE_NOEXCEPT
353  {
354  fmpq_clear(mp);
355  }
356  void canonicalise()
357  {
358  fmpq_canonicalise(mp);
359  }
360  const fmpz_wrapper &get_den() const
361  {
362  return reinterpret_cast<const fmpz_wrapper &>(*fmpq_denref(mp));
363  }
364  const fmpz_wrapper &get_num() const
365  {
366  return reinterpret_cast<const fmpz_wrapper &>(*fmpq_numref(mp));
367  }
368  fmpz_wrapper &get_den()
369  {
370  return reinterpret_cast<fmpz_wrapper &>(*fmpq_denref(mp));
371  }
372  fmpz_wrapper &get_num()
373  {
374  return reinterpret_cast<fmpz_wrapper &>(*fmpq_numref(mp));
375  }
376  friend fmpq_wrapper operator+(const fmpq_wrapper &a, const fmpq_wrapper &b)
377  {
378  fmpq_wrapper res;
379  fmpq_add(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
380  return res;
381  }
382  fmpq_wrapper operator+=(const fmpq_wrapper &a)
383  {
384  fmpq_add(mp, mp, a.get_fmpq_t());
385  return *this;
386  }
387  friend fmpq_wrapper operator-(const fmpq_wrapper &a, const fmpq_wrapper &b)
388  {
389  fmpq_wrapper res;
390  fmpq_sub(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
391  return res;
392  }
393  fmpq_wrapper operator-=(const fmpq_wrapper &a)
394  {
395  fmpq_sub(mp, mp, a.get_fmpq_t());
396  return *this;
397  }
398  fmpq_wrapper operator-() const
399  {
400  fmpq_wrapper res;
401  fmpq_neg(res.get_fmpq_t(), mp);
402  return res;
403  }
404  friend fmpq_wrapper operator*(const fmpq_wrapper &a, const fmpq_wrapper &b)
405  {
406  fmpq_wrapper res;
407  fmpq_mul(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
408  return res;
409  }
410  fmpq_wrapper operator*=(const fmpq_wrapper &a)
411  {
412  fmpq_mul(mp, mp, a.get_fmpq_t());
413  return *this;
414  }
415  friend fmpq_wrapper operator/(const fmpq_wrapper &a, const fmpq_wrapper &b)
416  {
417  fmpq_wrapper res;
418  fmpq_div(res.get_fmpq_t(), a.get_fmpq_t(), b.get_fmpq_t());
419  return res;
420  }
421  fmpq_wrapper operator/=(const fmpq_wrapper &a)
422  {
423  fmpq_div(mp, mp, a.get_fmpq_t());
424  return *this;
425  }
426  bool operator==(const fmpq_wrapper &other) const
427  {
428  return fmpq_equal(mp, other.get_fmpq_t());
429  }
430  bool operator!=(const fmpq_wrapper &other) const
431  {
432  return not(*this == other);
433  }
434  bool operator<(const fmpq_wrapper &other) const
435  {
436  return fmpq_cmp(mp, other.get_fmpq_t()) < 0;
437  }
438  bool operator<=(const fmpq_wrapper &other) const
439  {
440  return fmpq_cmp(mp, other.get_fmpq_t()) <= 0;
441  }
442  bool operator>(const fmpq_wrapper &other) const
443  {
444  return fmpq_cmp(mp, other.get_fmpq_t()) > 0;
445  }
446  bool operator>=(const fmpq_wrapper &other) const
447  {
448  return fmpq_cmp(mp, other.get_fmpq_t()) >= 0;
449  }
450  bool is_zero() const
451  {
452  return fmpq_is_zero(mp);
453  }
454  bool is_one() const
455  {
456  return fmpq_is_one(mp);
457  }
458 };
459 
461 {
462 
463 public:
464  mpq_view_flint(const fmpq_wrapper &i)
465  {
466  mpq_init(m);
467  fmpq_get_mpq(m, i.get_fmpq_t());
468  }
469  operator mpq_srcptr() const
470  {
471  return m;
472  }
473  ~mpq_view_flint()
474  {
475  mpq_clear(m);
476  }
477 
478 private:
479  mpq_t m;
480 };
481 
483 {
484 private:
485  fmpz_poly_factor_t fac;
486 
487 public:
489 
491  {
492  fmpz_poly_factor_init(fac);
493  }
495  {
496  fmpz_poly_factor_init(fac);
497  fmpz_poly_factor_set(fac, other.get_fmpz_poly_factor_t());
498  }
499  fmpz_poly_factor_wrapper &operator=(const fmpz_poly_factor_wrapper &other)
500  {
501  fmpz_poly_factor_set(fac, other.get_fmpz_poly_factor_t());
502  return *this;
503  }
505  {
506  fmpz_poly_factor_clear(fac);
507  }
508 
509  const fmpz_poly_factor_t &get_fmpz_poly_factor_t() const
510  {
511  return fac;
512  }
513  fmpz_poly_factor_t &get_fmpz_poly_factor_t()
514  {
515  return fac;
516  }
517 };
518 
520 {
521 private:
522  fmpz_poly_t poly;
523 
524 public:
526 
528  {
529  fmpz_poly_init(poly);
530  }
531  fmpz_poly_wrapper(int i)
532  {
533  fmpz_poly_init(poly);
534  fmpz_poly_set_si(poly, i);
535  }
536  fmpz_poly_wrapper(const char *cp)
537  {
538  fmpz_poly_init(poly);
539  fmpz_poly_set_str(poly, cp);
540  }
542  {
543  fmpz_poly_init(poly);
544  fmpz_poly_set_fmpz(poly, z.get_fmpz_t());
545  }
547  {
548  fmpz_poly_init(poly);
549  fmpz_poly_set(poly, *other.get_fmpz_poly_t());
550  }
552  {
553  fmpz_poly_init(poly);
554  fmpz_poly_swap(poly, *other.get_fmpz_poly_t());
555  }
556  fmpz_poly_wrapper &operator=(const fmpz_poly_wrapper &other)
557  {
558  fmpz_poly_set(poly, *other.get_fmpz_poly_t());
559  return *this;
560  }
561  fmpz_poly_wrapper &operator=(fmpz_poly_wrapper &&other)
562  {
563  fmpz_poly_swap(poly, *other.get_fmpz_poly_t());
564  return *this;
565  }
566  void swap_fmpz_poly_t(fmpz_poly_struct &other)
567  {
568  fmpz_poly_swap(poly, &other);
569  }
571  {
572  fmpz_poly_clear(poly);
573  }
574  const fmpz_poly_t *get_fmpz_poly_t() const
575  {
576  return &poly;
577  }
578  fmpz_poly_t *get_fmpz_poly_t()
579  {
580  return &poly;
581  }
582  bool operator==(const fmpz_poly_wrapper &other) const
583  {
584  return fmpz_poly_equal(poly, *other.get_fmpz_poly_t()) == 1;
585  }
586  long degree() const
587  {
588  return fmpz_poly_degree(poly);
589  }
590  long length() const
591  {
592  return fmpz_poly_length(poly);
593  }
594  std::string to_string() const
595  {
596  return fmpz_poly_get_str(poly);
597  }
598  fmpz_wrapper get_coeff(unsigned int n) const
599  {
600  fmpz_wrapper z;
601  fmpz_poly_get_coeff_fmpz(z.get_fmpz_t(), poly, n);
602  return z;
603  }
604  void set_coeff(unsigned int n, const fmpz_wrapper &z)
605  {
606  fmpz_poly_set_coeff_fmpz(poly, n, z.get_fmpz_t());
607  }
608  fmpz_wrapper eval(const fmpz_wrapper &z) const
609  {
610  fmpz_wrapper r;
611  fmpz_poly_evaluate_fmpz(r.get_fmpz_t(), poly, z.get_fmpz_t());
612  return r;
613  }
614  void eval_vec(fmpz *ovec, fmpz *ivec, unsigned int n) const
615  {
616  fmpz_poly_evaluate_fmpz_vec(ovec, *get_fmpz_poly_t(), ivec, n);
617  }
618  fmpz_poly_wrapper operator-() const
619  {
621  fmpz_poly_neg(*r.get_fmpz_poly_t(), *get_fmpz_poly_t());
622  return r;
623  }
624  void operator+=(const fmpz_poly_wrapper &other)
625  {
626  fmpz_poly_add(*get_fmpz_poly_t(), *get_fmpz_poly_t(),
627  *other.get_fmpz_poly_t());
628  }
629  void operator-=(const fmpz_poly_wrapper &other)
630  {
631  fmpz_poly_sub(*get_fmpz_poly_t(), *get_fmpz_poly_t(),
632  *other.get_fmpz_poly_t());
633  }
634  void operator*=(const fmpz_poly_wrapper &other)
635  {
636  fmpz_poly_mul(*get_fmpz_poly_t(), *get_fmpz_poly_t(),
637  *other.get_fmpz_poly_t());
638  }
639 
640  friend fmpz_poly_wrapper operator*(const fmpz_poly_wrapper &a,
641  const fmpz_poly_wrapper &b)
642  {
643  fmpz_poly_wrapper res;
644  fmpz_poly_mul(*res.get_fmpz_poly_t(), *a.get_fmpz_poly_t(),
645  *b.get_fmpz_poly_t());
646  return res;
647  }
648 
649  fmpz_poly_wrapper gcd(const fmpz_poly_wrapper &other) const
650  {
652  fmpz_poly_gcd(*r.get_fmpz_poly_t(), poly, *other.get_fmpz_poly_t());
653  return r;
654  }
655  fmpz_poly_wrapper lcm(const fmpz_poly_wrapper &other) const
656  {
658  fmpz_poly_lcm(*r.get_fmpz_poly_t(), poly, *other.get_fmpz_poly_t());
659  return r;
660  }
661  fmpz_poly_wrapper pow(unsigned int n) const
662  {
664  fmpz_poly_pow(*r.get_fmpz_poly_t(), poly, n);
665  return r;
666  }
667  void divrem(fmpz_poly_wrapper &q, fmpz_poly_wrapper &r,
668  const fmpz_poly_wrapper &b) const
669  {
670  return fmpz_poly_divrem(*q.get_fmpz_poly_t(), *r.get_fmpz_poly_t(),
671  *get_fmpz_poly_t(), *b.get_fmpz_poly_t());
672  }
673  fmpz_poly_factor_wrapper factors() const
674  {
676 #if __FLINT_RELEASE > 20502
677  fmpz_poly_factor(r.get_fmpz_poly_factor_t(), poly);
678 #else
679  throw std::runtime_error(
680  "FLINT's Version must be higher than 2.5.2 to obtain factors");
681 #endif
682  return r;
683  }
684  fmpz_poly_wrapper derivative() const
685  {
687  fmpz_poly_derivative(*r.get_fmpz_poly_t(), poly);
688  return r;
689  }
690 };
691 
693 {
694 private:
695  fmpq_poly_t poly;
696 
697 public:
699 
701  {
702  fmpq_poly_init(poly);
703  }
704  fmpq_poly_wrapper(int i)
705  {
706  fmpq_poly_init(poly);
707  fmpq_poly_set_si(poly, i);
708  }
709  fmpq_poly_wrapper(const char *cp)
710  {
711  fmpq_poly_init(poly);
712  fmpq_poly_set_str(poly, cp);
713  }
714  fmpq_poly_wrapper(const mpz_t z)
715  {
716  fmpz_wrapper fz(z);
717  fmpq_poly_init(poly);
718  fmpq_poly_set_fmpz(poly, fz.get_fmpz_t());
719  }
720  fmpq_poly_wrapper(const mpq_t q)
721  {
722  fmpq_wrapper fq(q);
723  fmpq_poly_init(poly);
724  fmpq_poly_set_fmpq(poly, fq.get_fmpq_t());
725  }
727  {
728  fmpq_poly_init(poly);
729  fmpq_poly_set_fmpq(poly, q.get_fmpq_t());
730  }
732  {
733  fmpq_poly_init(poly);
734  fmpq_poly_set(poly, *other.get_fmpq_poly_t());
735  }
737  {
738  fmpq_poly_init(poly);
739  fmpq_poly_swap(poly, *other.get_fmpq_poly_t());
740  }
741  fmpq_poly_wrapper &operator=(const fmpq_poly_wrapper &other)
742  {
743  fmpq_poly_set(poly, *other.get_fmpq_poly_t());
744  return *this;
745  }
746  fmpq_poly_wrapper &operator=(fmpq_poly_wrapper &&other)
747  {
748  fmpq_poly_swap(poly, *other.get_fmpq_poly_t());
749  return *this;
750  }
752  {
753  fmpq_poly_clear(poly);
754  }
755 
756  const fmpq_poly_t *get_fmpq_poly_t() const
757  {
758  return &poly;
759  }
760  fmpq_poly_t *get_fmpq_poly_t()
761  {
762  return &poly;
763  }
764  std::string to_string() const
765  {
766  return fmpq_poly_get_str(poly);
767  }
768  long degree() const
769  {
770  return fmpq_poly_degree(poly);
771  }
772  long length() const
773  {
774  return fmpq_poly_length(poly);
775  }
776  void set_coeff(unsigned int n, const fmpq_wrapper &z)
777  {
778  fmpq_poly_set_coeff_fmpq(poly, n, z.get_fmpq_t());
779  }
780  fmpq_wrapper eval(const fmpq_wrapper &z) const
781  {
782  fmpq_wrapper r;
783  fmpq_poly_evaluate_fmpq(r.get_fmpq_t(), poly, z.get_fmpq_t());
784  return r;
785  }
786  fmpq_wrapper get_coeff(unsigned int deg) const
787  {
788  fmpq_wrapper q;
789  fmpq_poly_get_coeff_fmpq(q.get_fmpq_t(), poly, deg);
790  return q;
791  }
792 
793  fmpq_poly_wrapper mullow(const fmpq_poly_wrapper &o,
794  unsigned int prec) const
795  {
797  fmpq_poly_mullow(*r.get_fmpq_poly_t(), poly, *o.get_fmpq_poly_t(),
798  prec);
799  return r;
800  }
801  fmpq_poly_wrapper pow(unsigned int n) const
802  {
804  fmpq_poly_pow(*r.get_fmpq_poly_t(), poly, n);
805  return r;
806  }
807  fmpq_poly_wrapper derivative() const
808  {
810  fmpq_poly_derivative(*r.get_fmpq_poly_t(), poly);
811  return r;
812  }
813  fmpq_poly_wrapper integral() const
814  {
816  fmpq_poly_integral(*r.get_fmpq_poly_t(), poly);
817  return r;
818  }
819 
820  fmpq_poly_wrapper inv_series(unsigned int prec) const
821  {
823  fmpq_poly_inv_series(*r.get_fmpq_poly_t(), poly, prec);
824  return r;
825  }
826  fmpq_poly_wrapper revert_series(unsigned int prec) const
827  {
829  fmpq_poly_revert_series(*r.get_fmpq_poly_t(), poly, prec);
830  return r;
831  }
832  fmpq_poly_wrapper log_series(unsigned int prec) const
833  {
835  fmpq_poly_log_series(*r.get_fmpq_poly_t(), poly, prec);
836  return r;
837  }
838  fmpq_poly_wrapper exp_series(unsigned int prec) const
839  {
841  fmpq_poly_exp_series(*r.get_fmpq_poly_t(), poly, prec);
842  return r;
843  }
844  fmpq_poly_wrapper sin_series(unsigned int prec) const
845  {
847  fmpq_poly_sin_series(*r.get_fmpq_poly_t(), poly, prec);
848  return r;
849  }
850  fmpq_poly_wrapper cos_series(unsigned int prec) const
851  {
853  fmpq_poly_cos_series(*r.get_fmpq_poly_t(), poly, prec);
854  return r;
855  }
856  fmpq_poly_wrapper tan_series(unsigned int prec) const
857  {
859  fmpq_poly_tan_series(*r.get_fmpq_poly_t(), poly, prec);
860  return r;
861  }
862  fmpq_poly_wrapper asin_series(unsigned int prec) const
863  {
865  fmpq_poly_asin_series(*r.get_fmpq_poly_t(), poly, prec);
866  return r;
867  }
868  fmpq_poly_wrapper atan_series(unsigned int prec) const
869  {
871  fmpq_poly_atan_series(*r.get_fmpq_poly_t(), poly, prec);
872  return r;
873  }
874  fmpq_poly_wrapper sinh_series(unsigned int prec) const
875  {
877  fmpq_poly_sinh_series(*r.get_fmpq_poly_t(), poly, prec);
878  return r;
879  }
880  fmpq_poly_wrapper cosh_series(unsigned int prec) const
881  {
883  fmpq_poly_cosh_series(*r.get_fmpq_poly_t(), poly, prec);
884  return r;
885  }
886  fmpq_poly_wrapper tanh_series(unsigned int prec) const
887  {
889  fmpq_poly_tanh_series(*r.get_fmpq_poly_t(), poly, prec);
890  return r;
891  }
892  fmpq_poly_wrapper asinh_series(unsigned int prec) const
893  {
895  fmpq_poly_asinh_series(*r.get_fmpq_poly_t(), poly, prec);
896  return r;
897  }
898  fmpq_poly_wrapper atanh_series(unsigned int prec) const
899  {
901  fmpq_poly_atanh_series(*r.get_fmpq_poly_t(), poly, prec);
902  return r;
903  }
904  fmpq_poly_wrapper subs(const fmpq_poly_wrapper &o, unsigned int prec) const
905  {
907  fmpq_poly_compose_series(*r.get_fmpq_poly_t(), poly,
908  *o.get_fmpq_poly_t(), prec);
909  return r;
910  }
911  void set_zero()
912  {
913  fmpq_poly_zero(poly);
914  }
915  void set_one()
916  {
917  fmpq_poly_one(poly);
918  }
919 
920  bool operator==(const fmpq_poly_wrapper &o) const
921  {
922  return fmpq_poly_equal(poly, *o.get_fmpq_poly_t()) != 0;
923  }
924  bool operator<(const fmpq_poly_wrapper &o) const
925  {
926  return fmpq_poly_cmp(poly, *o.get_fmpq_poly_t()) == -1;
927  }
928 
929  friend fmpq_poly_wrapper operator+(const fmpq_poly_wrapper &a,
930  const fmpq_poly_wrapper &o)
931  {
933  fmpq_poly_add(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
934  *o.get_fmpq_poly_t());
935  return r;
936  }
937  friend fmpq_poly_wrapper operator-(const fmpq_poly_wrapper &a,
938  const fmpq_poly_wrapper &o)
939  {
941  fmpq_poly_sub(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
942  *o.get_fmpq_poly_t());
943  return r;
944  }
945  fmpq_poly_wrapper operator-() const
946  {
948  fmpq_poly_neg(*r.get_fmpq_poly_t(), *get_fmpq_poly_t());
949  return r;
950  }
951  friend fmpq_poly_wrapper operator*(const fmpq_poly_wrapper &a,
952  const fmpq_wrapper &q)
953  {
955  fmpq_poly_scalar_mul_fmpq(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
956  q.get_fmpq_t());
957  return r;
958  }
959  friend fmpq_poly_wrapper operator*(const fmpq_poly_wrapper &a,
960  const fmpq_poly_wrapper &o)
961  {
963  fmpq_poly_mul(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
964  *o.get_fmpq_poly_t());
965  return r;
966  }
967  friend fmpq_poly_wrapper operator/(const fmpq_poly_wrapper &a,
968  const fmpq_wrapper &q)
969  {
971  fmpq_poly_scalar_div_fmpq(*r.get_fmpq_poly_t(), *a.get_fmpq_poly_t(),
972  q.get_fmpq_t());
973  return r;
974  }
975  void divrem(fmpq_poly_wrapper &q, fmpq_poly_wrapper &r,
976  const fmpq_poly_wrapper &b) const
977  {
978  return fmpq_poly_divrem(*q.get_fmpq_poly_t(), *r.get_fmpq_poly_t(),
979  *get_fmpq_poly_t(), *b.get_fmpq_poly_t());
980  }
981 
982  fmpq_poly_wrapper gcd(const fmpq_poly_wrapper &other) const
983  {
985  fmpq_poly_gcd(*r.get_fmpq_poly_t(), poly, *other.get_fmpq_poly_t());
986  return r;
987  }
988  fmpq_poly_wrapper lcm(const fmpq_poly_wrapper &other) const
989  {
991  fmpq_poly_lcm(*r.get_fmpq_poly_t(), poly, *other.get_fmpq_poly_t());
992  return r;
993  }
994  void operator+=(const fmpq_poly_wrapper &o)
995  {
996  fmpq_poly_add(poly, poly, *o.get_fmpq_poly_t());
997  }
998  void operator-=(const fmpq_poly_wrapper &o)
999  {
1000  fmpq_poly_sub(poly, poly, *o.get_fmpq_poly_t());
1001  }
1002  void operator*=(const fmpq_poly_wrapper &o)
1003  {
1004  fmpq_poly_mul(poly, poly, *o.get_fmpq_poly_t());
1005  }
1006 };
1007 
1008 } // namespace SymEngine
1009 
1010 #endif // SYMENGINE_FLINT_WRAPPER_H
T c_str(T... args)
Main namespace for SymEngine package.
Definition: add.cpp:19