/* * lib_q.h * * Created on: Sep 29, 2010 * Author: anders */ #ifndef LIB_Q_H_ #define LIB_Q_H_ #include #include #include #include "gmp.h" #include "gfanlib_z.h" namespace gfan{ class Rational { mpq_t value; public: static bool isField() { return true; } Rational() { mpq_init(value); } Rational(signed long int value_) { mpq_init(value); // mpz_init_set_si(mpq_numref(value), value_); // mpz_init_set_ui(mpq_denref(value), 1); mpz_set_si(mpq_numref(value), value_); mpz_set_ui(mpq_denref(value), 1); mpq_canonicalize(value); } Rational(Rational const & value_) { mpq_init(value); mpq_set(value,value_.value); } Rational(mpq_t value_) { mpq_init(value); mpq_set(value,value_); } explicit Rational(Integer const & value_) { mpq_init(value); // mpz_init_set(mpq_numref(value), value_.value); // mpz_init_set_ui(mpq_denref(value), 1); mpz_set(mpq_numref(value), value_.value); mpz_set_ui(mpq_denref(value), 1); mpq_canonicalize(value); } ~Rational() { mpq_clear(value); } Rational& operator=(const Rational& a) { const Rational *A=(const Rational*)&a; if (this != A) { mpq_clear(value); mpq_init(value); mpq_set(value,a.value); } return *this; } bool isZero()const{ return mpz_sgn(mpq_numref(value))==0; } friend std::ostream &operator<<(std::ostream &f, Rational const &a) { void (*freefunc)(void *, size_t); mp_get_memory_functions(0,0,&freefunc); char *str=mpq_get_str(0,10,a.value); f<