Skip to content

Commit

Permalink
Make &[-]/&[+] with Rationals 30%-50% faster
Browse files Browse the repository at this point in the history
We already reduce inside DIVIDE-NUMBERS, so we don't need to
mess with gcd in the ops themselves.
  • Loading branch information
zoffixznet committed Dec 4, 2017
1 parent 928ada0 commit 6c299bf
Showing 1 changed file with 12 additions and 21 deletions.
33 changes: 12 additions & 21 deletions src/core/Rat.pm
Expand Up @@ -84,18 +84,13 @@ multi sub prefix:<->(FatRat:D \a) {
}

multi sub infix:<+>(Rational \a, Rational \b) {
if a.denominator == b.denominator {
DON'T_DIVIDE_NUMBERS(a.numerator + b.numerator, a.denominator, a, b);
}
else {
my Int $gcd := a.denominator gcd b.denominator;
DIVIDE_NUMBERS(
(a.numerator * (b.denominator div $gcd) + b.numerator * (a.denominator div $gcd)),
((a.denominator div $gcd) * b.denominator),
a.denominator == b.denominator
?? DON'T_DIVIDE_NUMBERS(a.numerator + b.numerator, a.denominator, a, b)
!! DIVIDE_NUMBERS
a.numerator*b.denominator + b.numerator*a.denominator,
a.denominator*b.denominator,
a,
b,
);
}
b
}
multi sub infix:<+>(Rational \a, Int \b) {
DON'T_DIVIDE_NUMBERS(
Expand All @@ -115,17 +110,13 @@ multi sub infix:<+>(Int \a, Rational \b) {
}

multi sub infix:<->(Rational \a, Rational \b) {
if a.denominator == b.denominator {
DON'T_DIVIDE_NUMBERS(a.numerator - b.numerator, a.denominator, a, b);
}
else {
my Int $gcd = a.denominator gcd b.denominator;
DIVIDE_NUMBERS
a.numerator * (b.denominator div $gcd) - b.numerator * (a.denominator div $gcd),
(a.denominator div $gcd) * b.denominator,
a.denominator == b.denominator
?? DON'T_DIVIDE_NUMBERS(a.numerator - b.numerator, a.denominator, a, b)
!! DIVIDE_NUMBERS
a.numerator*b.denominator - b.numerator*a.denominator,
a.denominator*b.denominator,
a,
b;
}
b
}

multi sub infix:<->(Rational \a, Int \b) {
Expand Down

0 comments on commit 6c299bf

Please sign in to comment.