15#if __cpp_constexpr >= 201304
16# define CONSTEXPR14 constexpr
18# define CONSTEXPR14 inline
33 typename std::enable_if<std::is_unsigned<T>::value, T>::type {
44 typename std::enable_if<!std::is_unsigned<T>::value, T>::type {
45 return (a < T(0)) ? -a : a;
75 template <
typename Mn>
CONSTEXPR14 auto gcd(
const Mn& _m,
const Mn& _n) -> Mn {
90 template <
typename Mn>
CONSTEXPR14 auto lcm(
const Mn& _m,
const Mn& _n) -> Mn {
91 if (_m == 0 || _n == 0) {
132 if (this->_den < Z(0)) {
133 this->_num = -this->
_num;
134 this->_den = -this->
_den;
144 Z common =
gcd(this->_num, this->_den);
145 if (common == Z(1) || common == Z(0)) {
148 this->_num /= common;
149 this->_den /= common;
193 return this->_num * rhs._den - this->_den * rhs._num;
209 if (lhs._den == Z(1) || rhs == Z(0)) {
210 return lhs._num == rhs;
214 std::swap(lhs2._den, rhs2);
216 return lhs2._num < lhs2._den * rhs2;
227 if (lhs._den == Z(1) || rhs == Z(0)) {
228 return lhs._num < rhs;
232 std::swap(lhs2._den, rhs2);
234 return lhs2._num < lhs2._den * rhs2;
245 if (rhs._den == Z(1) || lhs == Z(0)) {
246 return lhs < rhs._num;
250 std::swap(rhs2._den, lhs2);
252 return rhs2._den * lhs2 < rhs2._num;
274 if (lhs._den == rhs._den) {
275 return lhs._num == rhs._num;
279 std::swap(lhs2._den, rhs2._num);
282 return lhs2._num * rhs2._den == lhs2._den * rhs2._num;
293 if (lhs._den == rhs._den) {
294 return lhs._num < rhs._num;
298 std::swap(lhs2._den, rhs2._num);
301 return lhs2._num * rhs2._den < lhs2._den * rhs2._num;
400 std::swap(this->_num, this->_den);
411 std::swap(this->_num, rhs._num);
414 this->_num *= rhs._num;
415 this->_den *= rhs._den;
437 std::swap(this->_num, rhs);
472 std::swap(this->_den, rhs._num);
475 this->_num *= rhs._den;
476 this->_den *= rhs._num;
498 std::swap(this->_den, rhs);
534 res._num = -res._num;
545 if (this->_den == rhs._den) {
546 return Fraction(this->_num + rhs._num, this->_den);
548 const auto common =
gcd(this->_den, rhs._den);
549 if (common == Z(0)) {
550 return Fraction(rhs._den * this->_num + this->_den * rhs._num, Z(0));
552 const auto l = this->_den / common;
553 const auto r = rhs._den / common;
554 auto d = this->_den * r;
555 auto n = r * this->_num + l * rhs._num;
556 return Fraction(std::move(n), std::move(d));
566 return *
this + (-frac);
614 if (this->_den == rhs._den) {
615 this->_num -= rhs.
_num;
621 std::swap(this->_den, other._num);
623 auto common_d = other.normalize2();
624 std::swap(this->_den, other._num);
625 this->_num = this->
cross(other);
626 this->_den *= other._den;
627 std::swap(this->_den, common_d);
629 this->_num *= common_n;
630 this->_den *= common_d;
650 if (this->_den == Z(1)) {
656 std::swap(this->_den, other);
658 std::swap(this->_den, other);
659 this->_num -= other * this->
_den;
660 this->_num *= common_n;
695 return (-frac) + Z(c);
719 os <<
"(" << frac.num() <<
"/" << frac.den() <<
")";
#define CONSTEXPR14
Definition fractions.hpp:18
Definition fractions.hpp:21
CONSTEXPR14 auto gcd(const Mn &_m, const Mn &_n) -> Mn
Greatest common divisor.
Definition fractions.hpp:75
CONSTEXPR14 auto lcm(const Mn &_m, const Mn &_n) -> Mn
Least common multiple.
Definition fractions.hpp:90
CONSTEXPR14 auto abs(const T &a) -> typename std::enable_if< std::is_unsigned< T >::value, T >::type
Absolute value for unsigned types.
Definition fractions.hpp:32
CONSTEXPR14 auto gcd_recur(const Mn &_m, const Mn &_n) -> Mn
Greatest common divisor (recursive)
Definition fractions.hpp:58
Fraction.
Definition fractions.hpp:102
friend auto operator<<(Stream &os, const Fraction &frac) -> Stream &
Stream output operator for Fraction.
Definition fractions.hpp:717
Z _den
Definition fractions.hpp:104
CONSTEXPR14 auto operator>(const Fraction &rhs) const -> bool
Greater than.
Definition fractions.hpp:318
CONSTEXPR14 auto operator-(const Fraction &frac) const -> Fraction
Subtract.
Definition fractions.hpp:565
CONSTEXPR14 auto operator+=(const Z &i) -> Fraction &
Add and assign an integer.
Definition fractions.hpp:641
friend CONSTEXPR14 auto operator<(const Z &lhs, const Fraction &rhs) -> bool
Less than.
Definition fractions.hpp:244
friend CONSTEXPR14 auto operator+(Fraction frac, const Z &i) -> Fraction
Add.
Definition fractions.hpp:576
CONSTEXPR14 auto operator>(const Z &rhs) const -> bool
Greater than.
Definition fractions.hpp:342
CONSTEXPR14 auto normalize2() -> Z
normalize to a canonical form
Definition fractions.hpp:143
friend CONSTEXPR14 auto operator==(const Fraction &lhs, const Z &rhs) -> bool
Equal to.
Definition fractions.hpp:208
CONSTEXPR14 auto operator!=(const Fraction &rhs) const -> bool
Not equal to.
Definition fractions.hpp:310
CONSTEXPR14 auto num() const noexcept -> const Z &
Get the numerator.
Definition fractions.hpp:177
friend CONSTEXPR14 auto operator*(const Z &lhs, Fraction rhs) -> Fraction
multiply
Definition fractions.hpp:461
CONSTEXPR14 auto operator-=(const Fraction &rhs) -> Fraction &
Subtract and assign a fraction.
Definition fractions.hpp:613
friend CONSTEXPR14 auto operator*(Fraction lhs, const Z &rhs) -> Fraction
multiply
Definition fractions.hpp:450
CONSTEXPR14 auto operator/=(Fraction rhs) -> Fraction &
divide and assign
Definition fractions.hpp:471
friend CONSTEXPR14 auto operator-(const Z &c, const Fraction &frac) -> Fraction
Subtract a fraction from an integer.
Definition fractions.hpp:672
CONSTEXPR14 auto operator>=(const Z &rhs) const -> bool
Greater than or equal to.
Definition fractions.hpp:358
CONSTEXPR14 void reciprocal()
reciprocal
Definition fractions.hpp:399
CONSTEXPR14 auto operator*=(Fraction rhs) -> Fraction &
multiply and assign
Definition fractions.hpp:410
friend CONSTEXPR14 auto operator>(const Z &lhs, const Fraction &rhs) -> bool
Greater than.
Definition fractions.hpp:367
CONSTEXPR14 auto operator>=(const Fraction &rhs) const -> bool
Greater than or euqal to.
Definition fractions.hpp:326
CONSTEXPR14 Fraction(Z num, Z den)
Construct a new Fraction object.
Definition fractions.hpp:112
friend CONSTEXPR14 auto operator<(const Fraction &lhs, const Fraction &rhs) -> bool
Less than.
Definition fractions.hpp:292
CONSTEXPR14 void normalize1()
normalize to a canonical form
Definition fractions.hpp:131
friend CONSTEXPR14 auto operator==(const Z &lhs, const Fraction &rhs) -> bool
Equal to.
Definition fractions.hpp:262
CONSTEXPR14 auto operator<=(const Fraction &rhs) const -> bool
Less than or equal to.
Definition fractions.hpp:334
Z _num
Definition fractions.hpp:103
CONSTEXPR14 auto normalize() -> Z
normalize to a canonical form
Definition fractions.hpp:121
CONSTEXPR14 auto cross(const Fraction &rhs) const -> Z
cross product
Definition fractions.hpp:192
CONSTEXPR14 Fraction()
Construct a new Fraction object (default constructor)
Definition fractions.hpp:170
friend CONSTEXPR14 auto operator<=(const Z &lhs, const Fraction &rhs) -> bool
Less than or equal to.
Definition fractions.hpp:378
CONSTEXPR14 auto operator+(const Fraction &rhs) const -> Fraction
Add.
Definition fractions.hpp:544
friend CONSTEXPR14 auto operator/(Fraction lhs, const Z &rhs) -> Fraction
divide
Definition fractions.hpp:511
friend CONSTEXPR14 auto operator>=(const Z &lhs, const Fraction &rhs) -> bool
Greater than or euqal to.
Definition fractions.hpp:389
CONSTEXPR14 auto operator*=(Z rhs) -> Fraction &
multiply and assign
Definition fractions.hpp:436
CONSTEXPR14 auto operator-=(const Z &rhs) -> Fraction &
Subtract and assign an integer.
Definition fractions.hpp:649
friend CONSTEXPR14 auto operator==(const Fraction &lhs, const Fraction &rhs) -> bool
Equal to.
Definition fractions.hpp:273
friend CONSTEXPR14 auto operator*(Fraction lhs, const Fraction &rhs) -> Fraction
multiply
Definition fractions.hpp:426
friend CONSTEXPR14 auto operator/(const Z &lhs, Fraction rhs) -> Fraction
divide
Definition fractions.hpp:522
friend CONSTEXPR14 auto operator*(int &&c, const Fraction &frac) -> Fraction
Multiply a fraction by an integer rvalue.
Definition fractions.hpp:705
CONSTEXPR14 auto operator-(const Z &i) const -> Fraction
Subtract an integer from the fraction.
Definition fractions.hpp:597
friend CONSTEXPR14 auto operator-(int &&c, const Fraction &frac) -> Fraction
Subtract a fraction from an integer rvalue.
Definition fractions.hpp:694
friend CONSTEXPR14 auto operator+(const Z &i, Fraction frac) -> Fraction
Add.
Definition fractions.hpp:587
CONSTEXPR14 auto operator/=(Z rhs) -> Fraction &
divide and assign
Definition fractions.hpp:497
CONSTEXPR14 auto operator-() const -> Fraction
Negate.
Definition fractions.hpp:532
friend CONSTEXPR14 auto operator+(int &&c, const Fraction &frac) -> Fraction
Add a fraction to an integer rvalue.
Definition fractions.hpp:683
CONSTEXPR14 Fraction(const Z &num)
Construct a new Fraction object.
Definition fractions.hpp:165
CONSTEXPR14 auto operator+=(const Fraction &rhs) -> Fraction &
Add and assign a fraction.
Definition fractions.hpp:605
friend CONSTEXPR14 auto operator/(Fraction lhs, const Fraction &rhs) -> Fraction
divide
Definition fractions.hpp:487
CONSTEXPR14 auto den() const noexcept -> const Z &
Get the denominator.
Definition fractions.hpp:184
CONSTEXPR14 Fraction(Z &&num)
Construct a new Fraction object.
Definition fractions.hpp:158
CONSTEXPR14 auto operator<=(const Z &rhs) const -> bool
Less than or equal to.
Definition fractions.hpp:350
friend CONSTEXPR14 auto operator<(const Fraction &lhs, const Z &rhs) -> bool
Less than.
Definition fractions.hpp:226