summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2008-12-16 20:25:08 -0500
committerBen Boeckel <MathStuf@gmail.com>2008-12-16 20:25:08 -0500
commit0f5ff3a39163534d5d7289d3957f4a8d9c54372e (patch)
tree175aee4cdabecb0261ab35404eaa86795af413fb
parent36110d3c54b7bfb0878816a0b96c9075e2b1814f (diff)
downloadsigen-0f5ff3a39163534d5d7289d3957f4a8d9c54372e.tar.gz
sigen-0f5ff3a39163534d5d7289d3957f4a8d9c54372e.tar.xz
sigen-0f5ff3a39163534d5d7289d3957f4a8d9c54372e.zip
Direct formula for modulo in fractions
-rw-r--r--sigcore/Fraction.cpp8
1 files changed, 2 insertions, 6 deletions
diff --git a/sigcore/Fraction.cpp b/sigcore/Fraction.cpp
index 9c4fa1a9..232789fb 100644
--- a/sigcore/Fraction.cpp
+++ b/sigcore/Fraction.cpp
@@ -127,12 +127,8 @@ Sigcore::Fraction Sigcore::Fraction::operator/(const Fraction& rhs) const
Sigcore::Fraction Sigcore::Fraction::operator%(const Fraction& rhs) const
{
- // FIXME: can it be done directly?
- Fraction ans(rhs);
- while (*this < ans)
- ans -= *this;
- while (ans <= 0)
- ans += *this;
+ // Formula from Kevin Kofler
+ Fraction ans((m_numerator * rhs.m_denominator) % (m_denominator * rhs.m_numerator), m_denominator * rhs.m_denominator);
ans.reduce();
return ans;
}