Forráskód Böngészése

Extending exponents is now limited to 1 < exponent < 4

Taddeus Kroes 13 éve
szülő
commit
63b9dd9647
1 módosított fájl, 12 hozzáadás és 5 törlés
  1. 12 5
      src/rules/powers.py

+ 12 - 5
src/rules/powers.py

@@ -278,16 +278,20 @@ MESSAGES[exponent_to_root] = \
 
 def match_extend_exponent(node):
     """
-    (a + ... + z)^n -> (a + ... + z)(a + ... + z)^(n - 1)  # n > 1
+    (a + ... + z)^n -> (a + ... + z)(a + ... + z)^(n - 1)  # 1 < n < 4
+
+    n is maxed at 3 because otherwise evaluations may get out of hand, and high
+    school expressions do not contain powers higher than 3
     """
     assert node.is_op(OP_POW)
 
     left, right = node
 
-    if right.is_numeric():
+    if right.is_numeric() and 1 < right.actual_value() < 4:
         for n in Scope(node):
             if n.is_op(OP_ADD):
-                return [P(node, extend_exponent, (left, right))]
+                return [P(node, extend_exponent,
+                          (left, right, right.actual_value() - 1))]
 
     return []
 
@@ -296,14 +300,17 @@ def extend_exponent(root, args):
     """
     (a + ... + z)^n -> (a + ... + z)(a + ... + z)^(n - 1)  # n > 1
     """
-    left, right = args
+    left, right, extended_exp = args
 
     if right.value > 2:
-        return left * left ** L(right.value - 1)
+        return left * left ** L(extended_exp)
 
     return left * left
 
 
+MESSAGES[extend_exponent] = _('Split exponent {2} to exponents `1` and {3}.')
+
+
 def match_constant_exponent(node):
     """
     (a + ... + z)^n -> (a + ... + z)(a + ... + z)^(n - 1)  # n > 1