From f64162f850e5b071ee2c3512b296a24006668130 Mon Sep 17 00:00:00 2001
From: Solomon Foster <colomon@gmail.com>
Date: Mon, 31 Aug 2009 14:01:33 -0400
Subject: [PATCH] Add gcd function and use it to reduce Rats to simplest form.  Also fix - operator.

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

diff --git a/src/setting/Rat.pm b/src/setting/Rat.pm
index 188cccd..428c021 100644
--- a/src/setting/Rat.pm
+++ b/src/setting/Rat.pm
@@ -1,12 +1,27 @@
 class Rat {
     has $.numerator;
     has $.denominator;
+    
+    my sub gcd(Int $a is copy, Int $b is copy)
+    {
+        $a = -$a if ($a < 0);
+        $b = -$b if ($b < 0);
+        while $a > 0 && $b > 0
+        {
+            ($a, $b) = ($b, $a) if ($b > $a);
+            $a -= $b;
+        }
+        return $a + $b;
+    }
 
     multi method new(Int $numerator is copy, Int $denominator is copy) {
         if $denominator < 0 {
             $numerator = -$numerator;
             $denominator = -$denominator;
         }
+        my $gcd = gcd($numerator, $denominator);
+        $numerator /= $gcd;
+        $denominator /= $gcd;
         self.bless(*, :$numerator, :$denominator);
     }
 
@@ -29,7 +44,7 @@ multi sub infix:<+>(Int $a, Rat $b) {
 }
 
 multi sub infix:<->(Rat $a, Rat $b) {
-    Rat.new($a.numerator * $b.denominator + $b.numerator * $a.denominator,
+    Rat.new($a.numerator * $b.denominator - $b.numerator * $a.denominator,
             $a.denominator * $b.denominator );
 }
 
-- 
1.6.0.5

