OSDN Git Service

add multiple variable support for factorization
authorTomohiro Nishimura <tomohiro68@gmail.com>
Fri, 5 Mar 2010 07:54:16 +0000 (16:54 +0900)
committerTomohiro Nishimura <tomohiro68@gmail.com>
Fri, 5 Mar 2010 07:54:46 +0000 (16:54 +0900)
lib/mint/generator/factorization.rb
lib/mint/generator/high_order_expression_base.rb
spec/generator/high_order_expression_base_spec.rb
spec/solver/maxima/factorization_spec.rb

index 3feb3c1..615efe2 100644 (file)
@@ -17,8 +17,12 @@ module Mint::Generator
   #
   class Factorization < HighOrderExpression
 
-    validation /\A(?:\d+)?[a-zA-Z]\^2 [+-] (?:\d+)?[a-zA-Z] [+-] \d+\z/
-    validation /\A(?:\d+)?x\^3 [+-] (?:\d+)?x\^2 [+-] (?:\d+)?x [+-] \d+\z/
+    validation /\A(?:\d+)?([a-zA-Z])\^2 [+-] (?:\d+)?\1 [+-] \d+\z/
+    validation /\A(?:\d+)?([a-zA-Z])\^2 [+-] (?:\d+)?\1([a-zA-Z]) [+-] \d+\2\^2\z/
+    validation /\A(?:\d+)?[a-zA-Z]\^2 [+-] (?:\d+)?[a-zA-Z]\^2\z/
+
+    validation /\A(?:\d+)?([a-zA-Z])\^3 [+-] (?:\d+)?\1\^2 [+-] (?:\d+)?\1 [+-] \d+\z/
+    validation /\A(?:\d+)?([a-zA-Z])\^3 [+-] (?:\d+)?\1\^2([a-zA-Z]) [+-] (?:\d+)?\1\2\^2 [+-] (?:\d+)?\2\^3\z/
 
     private
     def generate_problem
index 44a6994..f1c2a8f 100644 (file)
@@ -79,6 +79,14 @@ module Mint::Generator
     end
 
     def factorization2(a, b, c, x)
+      if x.instance_of?(Array)
+        x, y = x.values_at(0, 1)
+        return factorization2_val2(a, b, c, x, y)
+      end
+      factorization2_val1(a, b, c, x)
+    end
+
+    def factorization2_val1(a, b, c, x)
       e = []
       e << "%1$d%4$s^2" unless a == 0
       e << "%2$d%4$s"   unless b == 0
@@ -87,7 +95,27 @@ module Mint::Generator
         gsub(%r!\+ -!, '- ').gsub(/\A1#{x}|([ -])1#{x}/, '\1'+x)
     end
 
+    def factorization2_val2(a, b, c, x, y)
+      e = []
+      e << "%1$d%4$s^2"   unless a == 0
+      e << "%2$d%4$s%5$s" unless b == 0
+      e << "%3$d%5$s^2"   unless c == 0
+      (e.join(" + ") % [a, b, c, x, y]).
+        gsub(%r!\+ -!, '- ').
+        gsub(/\A1#{x}|([ -])1#{x}/, '\1'+x).
+        gsub(/1#{y}|([ -])1#{y}/, '\1'+x+y).
+        gsub(/1#{x}#{y}|([ -])1#{x}#{y}\z/, '\1'+x+y)
+    end
+
     def factorization3(a, b, c, d, x)
+      if x.instance_of?(Array)
+        x, y = x.values_at(0, 1)
+        return factorization3_val2(a, b, c, d, x, y)
+      end
+      factorization3_val1(a, b, c, d, x)
+    end
+
+    def factorization3_val1(a, b, c, d, x)
       e = []
       e << "%1$d%5$s^3" unless a == 0
       e << "%2$d%5$s^2" unless b == 0
@@ -97,6 +125,16 @@ module Mint::Generator
         gsub(%r!\+ -!, '- ').gsub(/\A1#{x}|([ -])1#{x}/, '\1'+x)
     end
 
+    def factorization3_val2(a, b, c, d, x, y)
+      e = []
+      e << "%1$d%5$s^3"     unless a == 0
+      e << "%2$d%5$s^2%6$s" unless b == 0
+      e << "%3$d%5$s%6$s^2" unless c == 0
+      e << "%4$d%6$s^3"     unless d == 0
+      (e.join(" + ") % [a, b, c, d, x, y]).
+        gsub(%r!\+ -!, '- ').gsub(/\A1#{x}|([ -])1#{x}/, '\1'+x)
+    end
+
     def expansion
       result = []
       order = create_integer(options[:order_min], options[:order_max], false)
index 5fff504..5baee07 100644 (file)
@@ -61,35 +61,49 @@ module Mint::Generator
 
         context 'factorization2' do
 
-          [
-            [2, 3, 4,  '2x^2 + 3x + 4'],
-            [1, 3, 4,  'x^2 + 3x + 4'],
-            [-1, 3, 4, '-x^2 + 3x + 4'],
-            [2, 1, 4,  '2x^2 + x + 4'],
-            [2, -1, 4,  '2x^2 - x + 4'],
-
-          ].each do |a, b, c, ptn|
-
+          values = [[2, 3, 4], [1, 3, 4], [-1, 3, 4], [2, 1, 4], [2, -1, 4]]
+
+          values.zip([
+            '2x^2 + 3x + 4',
+            'x^2 + 3x + 4',
+            '-x^2 + 3x + 4',
+            '2x^2 + x + 4',
+            '2x^2 - x + 4',
+          ]).each do |(a, b, c), ptn|
             it ptn do
               expression = subject.__send__(:factorization2, a, b, c, 'x')
               expression.should == ptn
             end
           end
+
+          values.zip([
+            '2x^2 + 3xy + 4y^2',
+            'x^2 + 3xy + 4y^2',
+            '-x^2 + 3xy + 4y^2',
+            '2x^2 + xy + 4y^2',
+            '2x^2 - xy + 4y^2',
+          ]).each do |(a, b, c), ptn|
+            it ptn do
+              expression = subject.__send__(:factorization2, a, b, c, ['x', 'y'])
+              expression.should == ptn
+            end
+          end
         end
 
         context 'factorization3' do
 
-          [
-            [2, 3, 4, 5, '2x^3 + 3x^2 + 4x + 5'],
-            [1, 3, 4, 5,  'x^3 + 3x^2 + 4x + 5'],
-            [-1, 3, 4, 5, '-x^3 + 3x^2 + 4x + 5'],
-            [2, 1, 4, 5,  '2x^3 + x^2 + 4x + 5'],
-            [2, -1, 4, 5,  '2x^3 - x^2 + 4x + 5'],
+          values = [[2, 3, 4, 5], [1, 3, 4, 5], [-1, 3, 4, 5], [2, 1, 4, 5], [2, -1, 4, 5]]
 
-          ].each do |a, b, c, d, ptn|
+          values.zip([
+            '2x^3 + 3x^2y + 4xy^2 + 5y^3',
+            'x^3 + 3x^2y + 4xy^2 + 5y^3',
+            '-x^3 + 3x^2y + 4xy^2 + 5y^3',
+            '2x^3 + x^2y + 4xy^2 + 5y^3',
+            '2x^3 - x^2y + 4xy^2 + 5y^3',
+          ]).each do |(a, b, c, d), ptn|
 
             it ptn do
-              expression = subject.__send__(:factorization3, a, b, c, d, 'x')
+              expression = subject.__send__(:factorization3, a, b, c, d, ['x', 'y'])
               expression.should == ptn
             end
           end
index 13a9591..78d3dc9 100644 (file)
@@ -9,6 +9,10 @@ module Mint::Solver::Maxima
     subject { Factorization.new }
     [
       ['6a^2 - a - 2', '(2a + 1)(3a - 2)'],
+      ['6a^2 - ab - 2b^2', '(2a + b)(3a - 2b)'],
+      ['6a^2 - ab - 2b^2', '(2a + b)(3a - 2b)'],
+      ['x^3 + 6x^2 - 51x + 44', '(x-4)(x-1)(x+11)'],
+      ['x^3 + 6x^2y - 51xy^2 + 44y^3', '(x-4y)(x-1y)(x+11y)'],
     ].each do |exp, ans|
       it exp do
         expression = Mint::Builder.build(exp)