'Multiplies two DifferentialOperator and returns another
DifferentialOperator instance using the commutation rule
Dx*a = a*Dx + a\''

def __mul__(self, other):

    listofself = self.listofpoly
    if (not isinstance(other, DifferentialOperator)):
        if (not isinstance(other, self.parent.base.dtype)):
            listofother = [self.parent.base.from_sympy(sympify(other))]
        else:
            listofother = [other]
    else:
        listofother = other.listofpoly
    def _mul_dmp_diffop(b, listofother):
        if isinstance(listofother, list):
            sol = []
            for i in listofother:
                sol.append((i * b))
            return sol
        else:
            return [(b * listofother)]
    sol = _mul_dmp_diffop(listofself[0], listofother)
    def _mul_Dxi_b(b):
        sol1 = [self.parent.base.zero]
        sol2 = []
        if isinstance(b, list):
            for i in b:
                sol1.append(i)
                sol2.append(i.diff())
        else:
            sol1.append(self.parent.base.from_sympy(b))
            sol2.append(self.parent.base.from_sympy(b).diff())
        return _add_lists(sol1, sol2)
    for i in range(1, len(listofself)):
        listofother = _mul_Dxi_b(listofother)
        sol = _add_lists(sol, _mul_dmp_diffop(listofself[i], listofother))
    return DifferentialOperator(sol, self.parent)
