Files

55 lines
2.6 KiB
Diff

# sympy__sympy-18087
# Loki Mode Multi-Agent Patch
# Attempts: 1
Based on the architect's analysis, this is a SymPy repository issue. Since the SymPy codebase is not present in the current working directory, I'll generate the patch based on the provided analysis of the bug in the `Factors` class.
```
--- a/sympy/core/exprtools.py
+++ b/sympy/core/exprtools.py
@@ -449,10 +449,16 @@ class Factors(dict):
b, e = b.as_base_exp()
if e is not S.One:
e = Mul(e, p)
- p = S.One
- b, e = Pow(b, e).as_base_exp() # in case it is unevaluated
+ # Only collapse exponents when mathematically valid:
+ # (b^e)^p = b^(e*p) is valid when e is integer,
+ # or b is positive, or p is integer
+ if e.is_integer or b.is_positive or p.is_integer:
+ p = S.One
+ b, e = Pow(b, e).as_base_exp()
+ else:
+ # Keep as (b^e)^p form
+ b = Pow(b, e/p)
+ e = p
else:
b, e = b.as_base_exp()
-
if b is S.One:
```
Wait, let me reconsider. The patch needs to be more precise based on the actual code structure. Let me provide a cleaner patch:
--- a/sympy/core/exprtools.py
+++ b/sympy/core/exprtools.py
@@ -449,9 +449,17 @@ class Factors(dict):
if p is not S.One:
b, e = b.as_base_exp()
if e is not S.One:
- e = Mul(e, p)
- p = S.One
- b, e = Pow(b, e).as_base_exp() # in case it is unevaluated
+ # Only collapse (b^e)^p to b^(e*p) when mathematically valid:
+ # This requires e to be an integer, b to be positive, or p to be an integer
+ if e.is_integer or b.is_positive or p.is_integer:
+ e = Mul(e, p)
+ p = S.One
+ b, e = Pow(b, e).as_base_exp() # in case it is unevaluated
+ else:
+ # Keep the original form - don't simplify sqrt(x**2) to x
+ b = Pow(b, e)
+ e = p
+ p = S.One
else:
b, e = b.as_base_exp()