In [2]: zup, zlow = zr, 1/(1/zc + 1/(zc+zr))
In [3]: zc/(zc+zr) * zlow/(zlow+zup)
Out[3]:
zc
────────────────────────────────────────────
⎛1 1 ⎞ ⎛ 1 ⎞
(zc + zr)⋅⎜── + ───────⎟⋅⎜zr + ────────────⎟
⎝zc zc + zr⎠ ⎜ 1 1 ⎟
⎜ ── + ───────⎟
⎝ zc zc + zr⎠
In [4]: simplify(_)
Out[4]:
2
zc
───────────────────
2 2
3⋅zc⋅zr + zc + zr
Previously, both numerator and denominator in the above fraction
returned by simplify() (in fact Poly.cancel) were multiplied by
a constant.
Signed-off-by: Mateusz Paprocki <mat...@gmail.com>
---
sympy/polys/polynomial.py | 10 ++++++++++
sympy/polys/tests/test_polynomial.py | 4 ++++
2 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/sympy/polys/polynomial.py b/sympy/polys/polynomial.py
index 1ccd894..11e0596 100644
--- a/sympy/polys/polynomial.py
+++ b/sympy/polys/polynomial.py
@@ -642,6 +642,15 @@ def cancel(f, *symbols):
p = sympy.polys.algorithms.poly_div(p, g)[0]
q = sympy.polys.algorithms.poly_div(q, g)[0]
+ pc = int(p.content)
+ qc = int(q.content)
+
+ cont = igcd(pc, qc)
+
+ if cont != 1:
+ p = p.div_term(cont)
+ q = q.div_term(cont)
+
return p.as_basic() / q.as_basic()
def as_basic(self):
@@ -2157,3 +2166,4 @@ def multinomial_as_basic(multinomial, *symbols):
l.append(Mul(*term))
result = Add(*l)
return result
+
diff --git a/sympy/polys/tests/test_polynomial.py b/sympy/polys/tests/test_polynomial.py
index 5d7a338..0891a25 100644
--- a/sympy/polys/tests/test_polynomial.py
+++ b/sympy/polys/tests/test_polynomial.py
@@ -185,6 +185,10 @@ def test_poly_cancel():
assert Poly.cancel(f) == -2 + sqrt(2)
+ a, b = x, 1/(1/y + 1/(x+y))
+
+ assert Poly.cancel(y/(x+y) * b/(a+b), x, y) == y**2/(x**2 + 3*x*y + y**2 )
+
raises(SymbolsError, "Poly.cancel((x**2-y**2, x-y))")
def test_poly_characteristics():
--
1.6.1
Ondrej