

def _separatevars(expr, force):
    if (len(expr.free_symbols) == 1):
        return expr
    if expr.is_Mul:
        args = list(expr.args)
        changed = False
        for (i, a) in enumerate(args):
            args[i] = separatevars(a, force)
            changed = (changed or (args[i] != a))
        if changed:
            expr = expr.func(*args)
        return expr
    if expr.is_Pow:
        expr = Pow(separatevars(expr.base, force=force), expr.exp)
    expr = expr.expand(mul=False, multinomial=False, force=force)
    (_expr, reps) = (posify(expr) if force else (expr, {
        
    }))
    expr = factor(_expr).subs(reps)
    if (not expr.is_Add):
        return expr
    args = list(expr.args)
    commonc = args[0].args_cnc(cset=True, warn=False)[0]
    for i in args[1:]:
        commonc &= i.args_cnc(cset=True, warn=False)[0]
    commonc = Mul(*commonc)
    commonc = commonc.as_coeff_Mul()[1]
    commonc_set = commonc.args_cnc(cset=True, warn=False)[0]
    for (i, a) in enumerate(args):
        (c, nc) = a.args_cnc(cset=True, warn=False)
        c = (c - commonc_set)
        args[i] = (Mul(*c) * Mul(*nc))
    nonsepar = Add(*args)
    if (len(nonsepar.free_symbols) > 1):
        _expr = nonsepar
        (_expr, reps) = (posify(_expr) if force else (_expr, {
            
        }))
        _expr = factor(_expr).subs(reps)
        if (not _expr.is_Add):
            nonsepar = _expr
    return (commonc * nonsepar)

dataset/ETHPy150Open sympy/sympy/sympy/simplify/simplify.py _separatevars/original