template <class T> T Tabs(const T & a)
{
- return llabs(a);
+ return abs(a);
}
+template <> Arbint Tabs(const Arbint & a);
/* Recursive version of GCD
Rational(double d=0) : P(d*1e6), Q(1e6) // Possibly the worst thing ever...
{
Simplify();
- //if (!CheckAccuracy(d, "Construct from double"))
- {
- //Fatal("Bwah bwah :(");
- }
}
Rational(const T & _P, const T & _Q) : P(_P), Q(_Q)
Q = T(1);
return;
}
+ if (P == Q)
+ {
+ P = Q = T(1);
+ return;
+ }
+
T g = gcd(Tabs(P), Tabs(Q));
//Debug("Got gcd!");
P /= g;
//Rational operator*(const Rational & r) const {return Rational(ToDouble()*r.ToDouble());}
//Rational operator/(const Rational & r) const {return Rational(ToDouble()/r.ToDouble());}
- Rational & operator=(const Rational & r) {P = r.P; Q = r.Q; return *this;}
+ Rational & operator=(const Rational & r) {P = r.P; Q = r.Q; Simplify(); return *this;}
Rational & operator+=(const Rational & r) {this->operator=(*this+r); return *this;}
Rational & operator-=(const Rational & r) {this->operator=(*this-r); return *this;}
Rational & operator*=(const Rational & r) {this->operator=(*this*r); return *this;}