rationnal.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #ifndef RATIONNAL_HPP
  2. #define RATIONNAL_HPP
  3. #include <iostream>
  4. #include <cstdint>
  5. #include <iostream>
  6. #include "config.hpp"
  7. using namespace std;
  8. //*************
  9. //* Rationnal *
  10. //*************
  11. //! Class for representing rationnals.
  12. class Rationnal{
  13. private:
  14. //! Numerator
  15. Int num;
  16. //! Denominator
  17. Int den;
  18. //! Normalise th fraction
  19. void normalize();
  20. public:
  21. //! Construct the null rationnal
  22. Rationnal();
  23. //! Construct the rationnal n
  24. //! \param n integer
  25. Rationnal(Int n);
  26. //! Construct the rationnal n/d
  27. //! \param n numerator integer
  28. //! \param d denominator integer
  29. Rationnal(Int n,Int d);
  30. //! Copy constructor
  31. //! \param r rationnal to copy
  32. Rationnal(const Rationnal& r);
  33. //! Copy operator
  34. //! \param r rationnal to copy
  35. Rationnal& operator=(const Rationnal& r);
  36. //! Numerator accessor
  37. Int numerator() const;
  38. //! Denominator accessor
  39. Int denominator() const;
  40. //! Return an approximation of the rationnal
  41. explicit operator Reel() const;
  42. //! Addition operators
  43. Rationnal operator+(const Rationnal& r) const;
  44. Rationnal operator+(Int n) const;
  45. friend Rationnal operator+(Int n,const Rationnal& r);
  46. //! Substration operators
  47. Rationnal operator-(const Rationnal& r) const;
  48. Rationnal operator-(Int n) const;
  49. friend Rationnal operator-(Int n,const Rationnal& r);
  50. //! Multiplication operators
  51. Rationnal operator*(const Rationnal& r) const;
  52. Rationnal operator*(Int n) const;
  53. friend Rationnal operator*(Int n,const Rationnal& r);
  54. //! Division operators
  55. Rationnal operator/(const Rationnal& r) const;
  56. Rationnal operator/(Int n) const;
  57. friend Rationnal operator/(Int n,const Rationnal& r);
  58. };
  59. //-----------------
  60. // Other functions
  61. //-----------------
  62. ostream& operator<<(ostream& os,const Rationnal& r);
  63. Int gcd(Int a,Int b);
  64. //********************
  65. //* Inline functions *
  66. //********************
  67. inline
  68. Rationnal::Rationnal():num(0),den(1){
  69. }
  70. inline
  71. Rationnal::Rationnal(Int n):num(n),den(1){
  72. }
  73. inline
  74. Rationnal::Rationnal(Int n,Int d):num(n),den(d){
  75. normalize();
  76. }
  77. inline
  78. Rationnal::Rationnal(const Rationnal& r):num(r.num),den(r.den){
  79. }
  80. inline Rationnal&
  81. Rationnal::operator=(const Rationnal& r){
  82. num=r.num;
  83. den=r.den;
  84. return *this;
  85. }
  86. inline Int
  87. Rationnal::numerator() const{
  88. return num;
  89. }
  90. inline Int
  91. Rationnal::denominator() const{
  92. return den;
  93. }
  94. inline
  95. Rationnal::operator Reel() const{
  96. Reel n=num;
  97. Reel d=den;
  98. return n/d;
  99. }
  100. inline void
  101. Rationnal::normalize(){
  102. Int d=gcd(abs(num),den);
  103. num/=d;
  104. den/=d;
  105. }
  106. inline Rationnal
  107. Rationnal::operator+(const Rationnal& r) const{
  108. return Rationnal(num*r.den+r.num*den,den*r.den);
  109. }
  110. inline Rationnal
  111. Rationnal::operator+(Int n) const{
  112. return Rationnal(num+n*den,den);
  113. }
  114. inline Rationnal
  115. Rationnal::operator-(const Rationnal& r) const{
  116. return Rationnal(num*r.den-r.num*den,den*r.den);
  117. }
  118. inline Rationnal
  119. Rationnal::operator-(Int n) const{
  120. return Rationnal(num-n*den,den);
  121. }
  122. inline Rationnal
  123. Rationnal::operator*(const Rationnal& r) const{
  124. return Rationnal(num*r.num,den*r.den);
  125. }
  126. inline Rationnal
  127. Rationnal::operator*(Int n) const{
  128. return Rationnal(num*n,den);
  129. }
  130. inline Rationnal
  131. Rationnal::operator/(const Rationnal& r) const{
  132. Int s=(r.num<0)?-1:1;
  133. return Rationnal(s*num*r.den,s*den*r.num);
  134. }
  135. inline Rationnal
  136. Rationnal::operator/(Int n) const{
  137. Int s=(n<0)?-1:1;
  138. return Rationnal(s*num,s*den*n);
  139. }
  140. inline Rationnal
  141. operator+(Int n,const Rationnal& r){
  142. return Rationnal(n*r.den+r.num,r.den);
  143. }
  144. inline Rationnal
  145. operator-(Int n,const Rationnal& r){
  146. return Rationnal(-n*r.den+r.num,r.den);
  147. }
  148. inline Rationnal
  149. operator*(Int n,const Rationnal& r){
  150. return Rationnal(n*r.num,r.den);
  151. }
  152. inline Rationnal
  153. operator/(Int n,const Rationnal& r){
  154. Int s=(n<0)?-1:1;
  155. return Rationnal(s*r.num,s*r.den*n);
  156. }
  157. #endif