source: git/gfanlib/gfanlib_q.h @ 68b4d3

spielwiese
Last change on this file since 68b4d3 was 68b4d3, checked in by Hans Schoenemann <hannes@…>, 10 years ago
porting: gfanlib and gmp 4.0/4.1 (redhat)
  • Property mode set to 100644
File size: 4.0 KB
Line 
1/*
2 * lib_q.h
3 *
4 *  Created on: Sep 29, 2010
5 *      Author: anders
6 */
7
8#ifndef LIB_Q_H_
9#define LIB_Q_H_
10
11#include <string.h>
12#include <ostream>
13#include "gmp.h"
14
15#if (__GNU_MP_VERSION == 4) && (__GNU_MP_VERSION_MINOR<2)
16extern void *  (*__gmp_allocate_func) _PROTO ((size_t));
17extern void *  (*__gmp_reallocate_func) _PROTO ((void *, size_t, size_t));
18extern void    (*__gmp_free_func) _PROTO ((void *, size_t));
19
20static inline void
21mp_get_memory_functions (void *(**alloc_func) (size_t),
22                         void *(**realloc_func) (void *, size_t, size_t),
23                         void (**free_func) (void *, size_t))
24{
25  if (alloc_func != NULL)
26    *alloc_func = __gmp_allocate_func;
27
28  if (realloc_func != NULL)
29    *realloc_func = __gmp_reallocate_func;
30
31  if (free_func != NULL)
32    *free_func = __gmp_free_func;
33}
34#endif
35
36#include "gfanlib_z.h"
37
38namespace gfan{
39class Rational
40{
41  mpq_t value;
42public:
43  static bool isField()
44  {
45    return true;
46  }
47  Rational()
48  {
49    mpq_init(value);
50  }
51  Rational(signed long int value_)
52  {
53    mpq_init(value);
54    mpz_set_si(mpq_numref(value), value_);
55    mpz_set_ui(mpq_denref(value), 1);
56    mpq_canonicalize(value);
57  }
58  Rational(Rational const & value_)
59  {
60    mpq_init(value);
61    mpq_set(value,value_.value);
62  }
63  Rational(mpq_t value_)
64  {
65    mpq_init(value);
66    mpq_set(value,value_);
67  }
68  explicit Rational(Integer const & value_)
69  {
70    mpq_init(value);
71    mpz_set(mpq_numref(value), value_.value);
72    mpz_set_ui(mpq_denref(value), 1);
73    mpq_canonicalize(value);
74  }
75  ~Rational()
76  {
77    mpq_clear(value);
78  }
79  Rational& operator=(const Rational& a)
80    {
81      const Rational *A=(const Rational*)&a;
82      if (this != A) {
83        mpq_clear(value);
84        mpq_init(value);
85        mpq_set(value,a.value);
86      }
87      return *this;
88    }
89  bool isZero()const{
90    return mpz_sgn(mpq_numref(value))==0;
91  }
92  friend std::ostream &operator<<(std::ostream &f, Rational const &a)
93  {
94    void (*freefunc)(void *, size_t);
95    mp_get_memory_functions(0,0,&freefunc);
96    char *str=mpq_get_str(0,10,a.value);
97    f<<str;
98    freefunc(str,strlen(str)+1);
99    return f;
100  }
101  Rational& operator+=(const Rational& a)
102    {
103      mpq_add(value,value,a.value);
104      return *this;
105    }
106  Rational& operator-=(const Rational& a)
107    {
108      mpq_sub(value,value,a.value);
109      return *this;
110    }
111  Rational& operator*=(const Rational& a)
112    {
113      mpq_mul(value,value,a.value);
114      return *this;
115    }
116  Rational& operator/=(const Rational& a)
117    {
118      assert(!a.isZero());
119      mpq_div(value,value,a.value);
120      return *this;
121    }
122  friend Rational operator-(const Rational &b)
123  {
124    Rational ret;
125    ret-=b;
126    return ret;
127  }
128  Rational operator+(const Rational &a)const
129  {
130    Rational ret(*this);
131    ret+=a;
132    return ret;
133  }
134  Rational operator-(const Rational &a)const
135  {
136    Rational ret(*this);
137    ret-=a;
138    return ret;
139  }
140  Rational operator*(const Rational &a)const
141  {
142    Rational ret(*this);
143    ret*=a;
144    return ret;
145  }
146  Rational operator/(const Rational &a)const
147  {
148    Rational ret(*this);
149    ret/=a;
150    return ret;
151  }
152  void madd(const Rational &a,const Rational &b)
153    {
154      mpq_t temp;
155      mpq_init(temp);
156      mpq_mul(temp,a.value,b.value);
157      mpq_add(value,value,temp);
158      mpq_clear(temp);
159    }
160  bool operator<(const Rational &a)const
161  {
162    return mpq_cmp(value,a.value)<0;
163  }
164  bool operator==(const Rational &a)const
165  {
166    return mpq_cmp(value,a.value)==0;
167  }
168  bool operator!=(const Rational &a)const
169  {
170    return mpq_cmp(value,a.value)!=0;
171  }
172  /**
173   * Returns +1,-1, or 0.
174   */
175  int sign()const
176  {
177    return mpq_sgn(value);
178  }
179  static Rational gcd(Rational const &a, Rational const /*&b*/, Rational /*&s*/, Rational /*t*/)
180  {
181/*    mpz_t r;
182    mpz_init(r);
183    mpz_gcdext(r,s.value,t.value,a.value,b.value);
184    Integer ret(r);
185    mpz_clear(r);*/
186    assert(0);
187    return a;
188  }
189  /**
190   * Assigns the value to q. q must have been initialized as a gmp variable.
191   */
192  void setGmp(mpq_t q)const
193  {
194    mpq_set(q,value);
195  }
196};
197
198
199}
200
201#endif /* LIB_Q_H_ */
Note: See TracBrowser for help on using the repository browser.