(op, ex1, ex2, x, dom, mp1=None, mp2=None)
return res.as_expr()
return the minimal polynomial for ``op(ex1, ex2)``

    Parameters
    ==========

    op : operation ``Add`` or ``Mul``
    ex1, ex2 : expressions for the algebraic elements
    x : indeterminate of the polynomials
    dom: ground domain
    mp1, mp2 : minimal polynomials for ``ex1`` and ``ex2`` or None

    Examples
    ========

    >>> from sympy import sqrt, Add, Mul, QQ
    >>> from sympy.polys.numberfields import _minpoly_op_algebraic_element
    >>> from sympy.abc import x, y
    >>> p1 = sqrt(sqrt(2) + 1)
    >>> p2 = sqrt(sqrt(2) - 1)
    >>> _minpoly_op_algebraic_element(Mul, p1, p2, x, QQ)
    x - 1
    >>> q1 = sqrt(y)
    >>> q2 = 1 / y
    >>> _minpoly_op_algebraic_element(Add, q1, q2, x, QQ.frac_field(y))
    x**2*y**2 - 2*x*y - y**3 + 1

    References
    ==========

    [1] http://en.wikipedia.org/wiki/Resultant
    [2] I.M. Isaacs, Proc. Amer. Math. Soc. 25 (1970), 638
    "Degrees of sums in a separable field extension".
return the minimal polynomial for ``op(ex1, ex2)``
return the minimal polynomial for op ( ex1 ex2 )
def _minpoly_op_algebraic_element(op, ex1, ex2, x, dom, mp1=None, mp2=None):
    """
    return the minimal polynomial for ``op(ex1, ex2)``

    Parameters
    ==========

    op : operation ``Add`` or ``Mul``
    ex1, ex2 : expressions for the algebraic elements
    x : indeterminate of the polynomials
    dom: ground domain
    mp1, mp2 : minimal polynomials for ``ex1`` and ``ex2`` or None

    Examples
    ========

    >>> from sympy import sqrt, Add, Mul, QQ
    >>> from sympy.polys.numberfields import _minpoly_op_algebraic_element
    >>> from sympy.abc import x, y
    >>> p1 = sqrt(sqrt(2) + 1)
    >>> p2 = sqrt(sqrt(2) - 1)
    >>> _minpoly_op_algebraic_element(Mul, p1, p2, x, QQ)
    x - 1
    >>> q1 = sqrt(y)
    >>> q2 = 1 / y
    >>> _minpoly_op_algebraic_element(Add, q1, q2, x, QQ.frac_field(y))
    x**2*y**2 - 2*x*y - y**3 + 1

    References
    ==========

    [1] http://en.wikipedia.org/wiki/Resultant
    [2] I.M. Isaacs, Proc. Amer. Math. Soc. 25 (1970), 638
    "Degrees of sums in a separable field extension".
    """
    from sympy import gcd
    y = Dummy(str(x))
    if mp1 is None:
        mp1 = _minpoly_compose(ex1, x, dom)
    if mp2 is None:
        mp2 = _minpoly_compose(ex2, y, dom)
    else:
        mp2 = mp2.subs({x: y})

    if op is Add:
        # mp1a = mp1.subs({x: x - y})
        if dom == QQ:
            R, X = ring('X', QQ)
            p1 = R(dict_from_expr(mp1)[0])
            p2 = R(dict_from_expr(mp2)[0])
        else:
            (p1, p2), _ = parallel_poly_from_expr((mp1, x - y), x, y)
            r = p1.compose(p2)
            mp1a = r.as_expr()

    elif op is Mul:
        mp1a = _muly(mp1, x, y)
    else:
        raise NotImplementedError('option not available')

    if op is Mul or dom != QQ:
        r = resultant(mp1a, mp2, gens=[y, x])
    else:
        r = rs_compose_add(p1, p2)
        r = expr_from_dict(r.as_expr_dict(), x)

    deg1 = degree(mp1, x)
    deg2 = degree(mp2, y)
    if op is Add and gcd(deg1, deg2) == 1:
        # `r` is irreducible, see [2]
        return r
    if op is Mul and deg1 == 1 or deg2 == 1:
        # if deg1 = 1, then mp1 = x - a; mp1a = x - y - a;
        # r = mp2(x - a), so that `r` is irreducible
        return r

    r = Poly(r, x, domain=dom)
    _, factors = r.factor_list()
    res = _choose_factor(factors, x, op(ex1, ex2), dom)
    return res.as_expr()
def _minpoly_op_algebraic_element ( op , ex1 , ex2 , x , dom , mp1 = None , mp2 = None ) : from sympy import gcd y = Dummy ( str ( x ) ) if mp1 is None : mp1 = _minpoly_compose ( ex1 , x , dom ) if mp2 is None : mp2 = _minpoly_compose ( ex2 , y , dom ) else : mp2 = mp2 . subs ( { x : y } ) if op is Add : # mp1a = mp1.subs({x: x - y}) if dom == QQ : R , X = ring ( 'X' , QQ ) p1 = R ( dict_from_expr ( mp1 ) [ 0 ] ) p2 = R ( dict_from_expr ( mp2 ) [ 0 ] ) else : ( p1 , p2 ) , _ = parallel_poly_from_expr ( ( mp1 , x - y ) , x , y ) r = p1 . compose ( p2 ) mp1a = r . as_expr ( ) elif op is Mul : mp1a = _muly ( mp1 , x , y ) else : raise NotImplementedError ( 'option not available' ) if op is Mul or dom != QQ : r = resultant ( mp1a , mp2 , gens = [ y , x ] ) else : r = rs_compose_add ( p1 , p2 ) r = expr_from_dict ( r . as_expr_dict ( ) , x ) deg1 = degree ( mp1 , x ) deg2 = degree ( mp2 , y ) if op is Add and gcd ( deg1 , deg2 ) == 1 : # `r` is irreducible, see [2] return r if op is Mul and deg1 == 1 or deg2 == 1 : # if deg1 = 1, then mp1 = x - a; mp1a = x - y - a; # r = mp2(x - a), so that `r` is irreducible return r r = Poly ( r , x , domain = dom ) _ , factors = r . factor_list ( ) res = _choose_factor ( factors , x , op ( ex1 , ex2 ) , dom ) return res . as_expr ( )