OSDN Git Service

fix is_lowest_term? method for irreducible fractions
authorTomohiro Nishimura <tomohiro68@gmail.com>
Thu, 15 Apr 2010 08:49:39 +0000 (17:49 +0900)
committerTomohiro Nishimura <tomohiro68@gmail.com>
Thu, 15 Apr 2010 08:49:39 +0000 (17:49 +0900)
lib/mint/generator/arithmetic_base.rb
spec/generator/fractional_arithmetic_spec.rb
spec/spec_helper.rb

index b6cd1ba..75a2498 100644 (file)
@@ -92,16 +92,23 @@ module Mint::Generator
     #
     def fraction
       begin
-        numerator   = numerator_part
-        denominator = denominator_part
-      end until is_lowest_term?(numerator, denominator)
+        numerator   = numerator_part.to_i
+        denominator = denominator_part.to_i
+      end until is_not_same_term?(numerator, denominator)
+      until is_lowest_term?(numerator, denominator)
+        gcd = numerator.gcd(denominator)
+        numerator  /= gcd
+        denominator /= gcd
+      end
       "#{numerator}/#{denominator}"
     end
 
     def is_lowest_term?(numerator, denominator)
-      numerator != denominator     &&
-      numerator % denominator != 0 &&
-      denominator % numerator != 0
+      numerator.gcd(denominator) == 1
+    end
+
+    def is_not_same_term?(numerator, denominator)
+      numerator != denominator
     end
 
     def numerator_part
index ccbe1a6..6ff1c86 100644 (file)
@@ -44,6 +44,9 @@ module Mint::Generator
           [5, 5, false],
           [5, 3, true],
           [8, 5, true],
+          [12, 16, false],
+          [3, 9, false],
+          [9, 3, false],
           [7, 13, true],
         ].each do |numerator, denominator, expect|
           context "#{numerator}/#{denominator}" do
index 17831e8..c977da7 100644 (file)
@@ -180,10 +180,10 @@ shared_examples_for 'Arithmetic' do
           :denominator_max => nil,
           :minus           => nil
         )
-        subject.should_receive(:numerator_part).and_return('a')
-        subject.should_receive(:denominator_part).and_return('b')
+        subject.should_receive(:numerator_part).and_return('5')
+        subject.should_receive(:denominator_part).and_return('4')
       end
-      it { subject.__send__(:fraction).should == "a/b" }
+      it { subject.__send__(:fraction).should == "5/4" }
     end
   end
 end