(node, x)
return (dirac, Mul(*new_args))
change_mul(node, x)

       Rearranges the operands of a product, bringing to front any simple
       DiracDelta expression.

       If no simple DiracDelta expression was found, then all the DiracDelta
       expressions are simplified (using DiracDelta.simplify).

       Return: (dirac, new node)
       Where:
         o dirac is either a simple DiracDelta expression or None (if no simple
           expression was found);
         o new node is either a simplified DiracDelta expressions or None (if it
           could not be simplified).

       Examples
       ========

       >>> from sympy import DiracDelta, cos
       >>> from sympy.integrals.deltafunctions import change_mul
       >>> from sympy.abc import x, y
       >>> change_mul(x*y*DiracDelta(x)*cos(x), x)
       (DiracDelta(x), x*y*cos(x))
       >>> change_mul(x*y*DiracDelta(x**2 - 1)*cos(x), x)
       (None, x*y*cos(x)*DiracDelta(x - 1)/2 + x*y*cos(x)*DiracDelta(x + 1)/2)
       >>> change_mul(x*y*DiracDelta(cos(x))*cos(x), x)
       (None, None)

       See Also
       ========

       sympy.functions.special.delta_functions.DiracDelta
       deltaintegrate
change_mul(node, x)
change_mul ( node x )
def change_mul(node, x):
    """change_mul(node, x)

       Rearranges the operands of a product, bringing to front any simple
       DiracDelta expression.

       If no simple DiracDelta expression was found, then all the DiracDelta
       expressions are simplified (using DiracDelta.simplify).

       Return: (dirac, new node)
       Where:
         o dirac is either a simple DiracDelta expression or None (if no simple
           expression was found);
         o new node is either a simplified DiracDelta expressions or None (if it
           could not be simplified).

       Examples
       ========

       >>> from sympy import DiracDelta, cos
       >>> from sympy.integrals.deltafunctions import change_mul
       >>> from sympy.abc import x, y
       >>> change_mul(x*y*DiracDelta(x)*cos(x), x)
       (DiracDelta(x), x*y*cos(x))
       >>> change_mul(x*y*DiracDelta(x**2 - 1)*cos(x), x)
       (None, x*y*cos(x)*DiracDelta(x - 1)/2 + x*y*cos(x)*DiracDelta(x + 1)/2)
       >>> change_mul(x*y*DiracDelta(cos(x))*cos(x), x)
       (None, None)

       See Also
       ========

       sympy.functions.special.delta_functions.DiracDelta
       deltaintegrate
    """
    if not (node.is_Mul or node.is_Pow):
        return node

    new_args = []
    dirac = None

    #Sorting is needed so that we consistently collapse the same delta;
    #However, we must preserve the ordering of non-commutative terms
    c, nc = node.args_cnc()
    sorted_args = sorted(c, key=default_sort_key)
    sorted_args.extend(nc)

    for arg in sorted_args:
        if arg.is_Pow and arg.base.func is DiracDelta:
            new_args.append(arg.func(arg.base, arg.exp - 1))
            arg = arg.base
        if dirac is None and (arg.func is DiracDelta and arg.is_simple(x)
                and (len(arg.args) <= 1 or arg.args[1] == 0)):
            dirac = arg
        else:
            new_args.append(arg)
    if not dirac:  # there was no simple dirac
        new_args = []
        for arg in sorted_args:
            if arg.func is DiracDelta:
                new_args.append(arg.simplify(x))
            elif arg.is_Pow and arg.base.func is DiracDelta:
                new_args.append(arg.func(arg.base.simplify(x), arg.exp))
            else:
                new_args.append(change_mul(arg, x))
        if new_args != sorted_args:
            nnode = Mul(*new_args).expand()
        else:  # if the node didn't change there is nothing to do
            nnode = None
        return (None, nnode)
    return (dirac, Mul(*new_args))
def change_mul ( node , x ) : if not ( node . is_Mul or node . is_Pow ) : return node new_args = [ ] dirac = None #Sorting is needed so that we consistently collapse the same delta; #However, we must preserve the ordering of non-commutative terms c , nc = node . args_cnc ( ) sorted_args = sorted ( c , key = default_sort_key ) sorted_args . extend ( nc ) for arg in sorted_args : if arg . is_Pow and arg . base . func is DiracDelta : new_args . append ( arg . func ( arg . base , arg . exp - 1 ) ) arg = arg . base if dirac is None and ( arg . func is DiracDelta and arg . is_simple ( x ) and ( len ( arg . args ) <= 1 or arg . args [ 1 ] == 0 ) ) : dirac = arg else : new_args . append ( arg ) if not dirac : # there was no simple dirac new_args = [ ] for arg in sorted_args : if arg . func is DiracDelta : new_args . append ( arg . simplify ( x ) ) elif arg . is_Pow and arg . base . func is DiracDelta : new_args . append ( arg . func ( arg . base . simplify ( x ) , arg . exp ) ) else : new_args . append ( change_mul ( arg , x ) ) if new_args != sorted_args : nnode = Mul ( * new_args ) . expand ( ) else : # if the node didn't change there is nothing to do nnode = None return ( None , nnode ) return ( dirac , Mul ( * new_args ) )