(extension, x=None, **args)
Construct a common number field for all extensions.
Construct a common number field for all extensions.
Construct a common number field for all extensions .
def primitive_element(extension, x=None, **args):
    """Construct a common number field for all extensions. """
    if not extension:
        raise ValueError("can't compute primitive element for empty extension")

    if x is not None:
        x, cls = sympify(x), Poly
    else:
        x, cls = Dummy('x'), PurePoly
    if not args.get('ex', False):
        extension = [ AlgebraicNumber(ext, gen=x) for ext in extension ]

        g, coeffs = extension[0].minpoly.replace(x), [1]

        for ext in extension[1:]:
            s, _, g = sqf_norm(g, x, extension=ext)
            coeffs = [ s*c for c in coeffs ] + [1]

        if not args.get('polys', False):
            return g.as_expr(), coeffs
        else:
            return cls(g), coeffs

    generator = numbered_symbols('y', cls=Dummy)

    F, Y = [], []

    for ext in extension:
        y = next(generator)

        if ext.is_Poly:
            if ext.is_univariate:
                f = ext.as_expr(y)
            else:
                raise ValueError("expected minimal polynomial, got %s" % ext)
        else:
            f = minpoly(ext, y)

        F.append(f)
        Y.append(y)

    coeffs_generator = args.get('coeffs', _coeffs_generator)

    for coeffs in coeffs_generator(len(Y)):
        f = x - sum([ c*y for c, y in zip(coeffs, Y)])
        G = groebner(F + [f], Y + [x], order='lex', field=True)

        H, g = G[:-1], cls(G[-1], x, domain='QQ')

        for i, (h, y) in enumerate(zip(H, Y)):
            try:
                H[i] = Poly(y - h, x,
                            domain='QQ').all_coeffs()  # XXX: composite=False
            except CoercionFailed:  # pragma: no cover
                break  # G is not a triangular set
        else:
            break
    else:  # pragma: no cover
        raise RuntimeError("run out of coefficient configurations")

    _, g = g.clear_denoms()

    if not args.get('polys', False):
        return g.as_expr(), coeffs, H
    else:
        return g, coeffs, H
def primitive_element ( extension , x = None , * * args ) : if not extension : raise ValueError ( "can't compute primitive element for empty extension" ) if x is not None : x , cls = sympify ( x ) , Poly else : x , cls = Dummy ( 'x' ) , PurePoly if not args . get ( 'ex' , False ) : extension = [ AlgebraicNumber ( ext , gen = x ) for ext in extension ] g , coeffs = extension [ 0 ] . minpoly . replace ( x ) , [ 1 ] for ext in extension [ 1 : ] : s , _ , g = sqf_norm ( g , x , extension = ext ) coeffs = [ s * c for c in coeffs ] + [ 1 ] if not args . get ( 'polys' , False ) : return g . as_expr ( ) , coeffs else : return cls ( g ) , coeffs generator = numbered_symbols ( 'y' , cls = Dummy ) F , Y = [ ] , [ ] for ext in extension : y = next ( generator ) if ext . is_Poly : if ext . is_univariate : f = ext . as_expr ( y ) else : raise ValueError ( "expected minimal polynomial, got %s" % ext ) else : f = minpoly ( ext , y ) F . append ( f ) Y . append ( y ) coeffs_generator = args . get ( 'coeffs' , _coeffs_generator ) for coeffs in coeffs_generator ( len ( Y ) ) : f = x - sum ( [ c * y for c , y in zip ( coeffs , Y ) ] ) G = groebner ( F + [ f ] , Y + [ x ] , order = 'lex' , field = True ) H , g = G [ : - 1 ] , cls ( G [ - 1 ] , x , domain = 'QQ' ) for i , ( h , y ) in enumerate ( zip ( H , Y ) ) : try : H [ i ] = Poly ( y - h , x , domain = 'QQ' ) . all_coeffs ( ) # XXX: composite=False except CoercionFailed : # pragma: no cover break # G is not a triangular set else : break else : # pragma: no cover raise RuntimeError ( "run out of coefficient configurations" ) _ , g = g . clear_denoms ( ) if not args . get ( 'polys' , False ) : return g . as_expr ( ) , coeffs , H else : return g , coeffs , H