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.

Reply via email to