From b63ce509840430ff48896ae7795ad1d393edd5b4 Mon Sep 17 00:00:00 2001
From: Solomon Foster <colomon@gmail.com>
Date: Tue, 1 Sep 2009 07:14:26 -0400
Subject: [PATCH] Switch GCD routine to use % instead of -, for a vast performance increase on widely mismatched numbers.  Add Rat * Int, Int * Rat, Rat / Int, and Int / Rat overloads.

---
 src/setting/Rat.pm |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/src/setting/Rat.pm b/src/setting/Rat.pm
index 06f08f3..f2355da 100644
--- a/src/setting/Rat.pm
+++ b/src/setting/Rat.pm
@@ -9,7 +9,7 @@ class Rat {
         while $a > 0 && $b > 0
         {
             ($a, $b) = ($b, $a) if ($b > $a);
-            $a -= $b;
+            $a %= $b;
         }
         return $a + $b;
     }
@@ -62,10 +62,26 @@ multi sub infix:<*>(Rat $a, Rat $b) {
     Rat.new($a.numerator * $b.numerator, $a.denominator * $b.denominator);
 }
 
+multi sub infix:<*>(Rat $a, Int $b) {
+    Rat.new($a.numerator * $b, $a.denominator);
+}
+
+multi sub infix:<*>(Int $a, Rat $b) {
+    Rat.new($a * $b.numerator, $b.denominator);
+}
+
 multi sub infix:</>(Rat $a, Rat $b) {
     Rat.new($a.numerator * $b.denominator, $a.denominator * $b.numerator);
 }
 
+multi sub infix:</>(Rat $a, Int $b) {
+    Rat.new($a.numerator, $a.denominator * $b);
+}
+
+multi sub infix:</>(Int $a, Rat $b) {
+    Rat.new($b.denominator, $a * $b.numerator);
+}
+
 multi sub infix:</>(Int $a, Int $b) {
     Rat.new($a, $b);
 }
-- 
1.6.0.5

