Updates:
Status: Started
Comment #6 on issue 2283 by matt...@gmail.com: Non-iterative 'in'
http://code.google.com/p/sympy/issues/detail?id=2283
EPath won't help here, but the following code will:
from sympy.core import Add, Mul
def ncsplit(expr):
if expr.is_Add or expr.is_Mul:
cpart, ncpart = [], []
for arg in expr.args:
if arg.is_commutative:
cpart.append(arg)
else:
ncpart.append(arg)
elif expr.is_commutative:
cpart, ncpart = [expr], []
else:
cpart, ncpart = [], [expr]
return set(cpart), ncpart
def contains(expr, subexpr):
if not (subexpr.is_Add or subexpr.is_Mul):
return subexpr in expr
if subexpr.is_Mul:
found = expr.find(Mul)
else:
found = expr.find(Add)
c, nc = ncsplit(subexpr)
for expr in found:
_c, _nc = ncsplit(expr)
if (c & _c) == c:
if not nc:
return True
elif len(nc) <= len(_nc):
for i in xrange(len(_nc) - len(nc)):
if _nc[i:i+len(nc)] == nc:
return True
return False
Could be more efficient, but at least is readable (hopefully). find() is an
addition of famous/infamous (cross out unneeded) polys12 branch.
Examples:
In [2]: var('A,B,C', commutative=False)
Out[2]: (A, B, C)
In [3]: f = x*gamma(x)*sin(x)*exp(x*y)*A*B*C*cot(x*A*B)
In [4]: contains(f, x*y)
Out[4]: True
In [5]: contains(f, x*sin(x))
Out[5]: True
In [6]: contains(f, x*sin(y))
Out[6]: False
In [7]: contains(f, x*A)
Out[7]: True
In [8]: contains(f, x*A*B)
Out[8]: True
In [9]: contains(f, x*A*C)
Out[9]: False
In [10]: contains(f, x*A*B*C)
Out[10]: True
In [11]: contains(f, x*sin(x)*A*B*C)
Out[11]: True
In [12]: contains(f, x*sin(y)*A*B*C)
Out[12]: False
In [13]: contains(f, x)
Out[13]: True
In [14]: contains(f, x*gamma(x))
Out[14]: True
--
You received this message because you are subscribed to the Google Groups
"sympy-issues" group.
To post to this group, send email to sympy-issues@googlegroups.com.
To unsubscribe from this group, send email to
sympy-issues+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sympy-issues?hl=en.