Example #1
0
def sdp_lcm(f, g, u, O, K):
    """
    Computes LCM of two polynomials in `K[X]`.

    The LCM is computed as the unique generater of the intersection
    of the two ideals generated by `f` and `g`. The approach is to
    compute a Groebner basis with respect to lexicographic ordering
    of `t*f` and `(1 - t)*g`, where `t` is an unrelated variable and
    then filtering out the solution that doesn't contain `t`.

    References
    ==========

    1. [Cox97]_

    """
    from sympy.polys.groebnertools import sdp_groebner

    if not f or not g:
        return []

    if sdp_term_p(f) and sdp_term_p(g):
        monom = monomial_lcm(sdp_LM(f, u), sdp_LM(g, u))

        fc, gc = sdp_LC(f, K), sdp_LC(g, K)

        if K.has_Field:
            coeff = K.one
        else:
            coeff = K.lcm(fc, gc)

        return [(monom, coeff)]

    if not K.has_Field:
        lcm = K.one
    else:
        fc, f = sdp_primitive(f, K)
        gc, g = sdp_primitive(g, K)

        lcm = K.lcm(fc, gc)

    f_terms = tuple( ((1,) + m,  c) for m, c in f )
    g_terms = tuple( ((0,) + m,  c) for m, c in g ) \
            + tuple( ((1,) + m, -c) for m, c in g )

    F = sdp_sort(f_terms, lex)
    G = sdp_sort(g_terms, lex)

    basis = sdp_groebner([F, G], u, lex, K)

    H = [ h for h in basis if sdp_indep_p(h, 0, u) ]

    if K.is_one(lcm):
        h = [ (m[1:], c)     for m, c in H[0] ]
    else:
        h = [ (m[1:], c * lcm) for m, c in H[0] ]

    return sdp_sort(h, O)
Example #2
0
def sdp_lcm(f, g, u, O, K):
    """
    Computes LCM of two polynomials in `K[X]`.

    The LCM is computed as the unique generater of the intersection
    of the two ideals generated by `f` and `g`. The approach is to
    compute a Groebner basis with respect to lexicographic ordering
    of `t*f` and `(1 - t)*g`, where `t` is an unrelated variable and
    then filtering out the solution that doesn't contain `t`.

    References
    ==========

    1. [Cox97]_

    """
    from sympy.polys.groebnertools import sdp_groebner

    if not f or not g:
        return []

    if sdp_term_p(f) and sdp_term_p(g):
        monom = monomial_lcm(sdp_LM(f, u), sdp_LM(g, u))

        fc, gc = sdp_LC(f, K), sdp_LC(g, K)

        if K.has_Field:
            coeff = K.one
        else:
            coeff = K.lcm(fc, gc)

        return [(monom, coeff)]

    if not K.has_Field:
        lcm = K.one
    else:
        fc, f = sdp_primitive(f, K)
        gc, g = sdp_primitive(g, K)

        lcm = K.lcm(fc, gc)

    f_terms = tuple(((1, ) + m, c) for m, c in f)
    g_terms = tuple( ((0,) + m,  c) for m, c in g ) \
            + tuple( ((1,) + m, -c) for m, c in g )

    F = sdp_sort(f_terms, lex)
    G = sdp_sort(g_terms, lex)

    basis = sdp_groebner([F, G], u, lex, K)

    H = [h for h in basis if sdp_indep_p(h, 0, u)]

    if K.is_one(lcm):
        h = [(m[1:], c) for m, c in H[0]]
    else:
        h = [(m[1:], c * lcm) for m, c in H[0]]

    return sdp_sort(h, O)
Example #3
0
def test_sdp_groebner():
    f = sdp_from_dict({(1,2): QQ(2,), (2,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,3): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  O_lex)

    a = sdp_from_dict({(1,0): QQ(1,1)}, O_lex)
    b = sdp_from_dict({(0,3): QQ(1,1), (0,0): QQ(-1,2)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [a, b]

    f = sdp_from_dict({(2,1): QQ(2,), (0,2): QQ(1)}, O_lex)
    g = sdp_from_dict({(3,0): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  O_lex)

    a = sdp_from_dict({(0,1): QQ(1,1)}, O_lex)
    b = sdp_from_dict({(3,0): QQ(1,1), (0,0): QQ(-1,2)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [b, a]

    f = sdp_from_dict({(0,0,2): QQ(-1), (1,0,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,0,3): QQ(-1), (0,1,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [f, g]

    f = sdp_from_dict({(3,0): QQ(1), (1,1): QQ(-2)}, O_grlex)
    g = sdp_from_dict({(2,1): QQ(1), (0,2): QQ(-2), (1,0): QQ(1)}, O_grlex)

    a = sdp_from_dict({(2,0): QQ(1)}, O_grlex)
    b = sdp_from_dict({(1,1): QQ(1)}, O_grlex)
    c = sdp_from_dict({(0,2): QQ(1), (1, 0): QQ(-1,2)}, O_grlex)

    assert sdp_groebner((f, g), 1, O_grlex, QQ) == [a, b, c]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,1,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,0,1): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,1,0): -QQ(1)}, O_lex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,1): -QQ(1)}, O_lex),
        sdp_from_dict({(1,0,1): QQ(1), (0,2,0): -QQ(1)}, O_lex),
        sdp_from_dict({(0,3,0): QQ(1), (0,0,2): -QQ(1)}, O_lex),
    ]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,1,0): QQ(1)}, O_grlex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,0,1): QQ(1)}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, QQ) == [
        sdp_from_dict({(0,3,0): QQ(1), (0,0,2): -QQ(1)}, O_grlex),
        sdp_from_dict({(2,0,0): QQ(1), (0,1,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,1): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,2,0): -QQ(1)}, O_grlex),
    ]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,0,1): QQ(1)}, O_lex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,1,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,0,1): -QQ(1)}, O_lex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,2): -QQ(1)}, O_lex),
        sdp_from_dict({(1,0,1): QQ(1), (0,1,0): -QQ(1)}, O_lex),
        sdp_from_dict({(0,2,0): QQ(1), (0,0,3): -QQ(1)}, O_lex),
    ]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,0,1): QQ(1)}, O_grlex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,1,0): QQ(1)}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, QQ) == [
        sdp_from_dict({(0,0,3): QQ(1), (0,2,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(2,0,0): QQ(1), (0,0,1): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,2): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,1,0): -QQ(1)}, O_grlex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (1,0,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (0,0,1): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,2,0): -QQ(1)}, O_lex),
        sdp_from_dict({(0,3,0): QQ(1), (0,0,1): -QQ(1)}, O_lex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (1,0,0): QQ(1)}, O_grlex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (0,0,1): QQ(1)}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,1,1): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,1): -QQ(1)}, O_grlex),
        sdp_from_dict({(0,2,0): QQ(1), (1,0,0): -QQ(1)}, O_grlex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (1,0,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (0,1,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,0,2): -QQ(1)}, O_lex),
        sdp_from_dict({(0,1,0): QQ(1), (0,0,3): -QQ(1)}, O_lex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (1,0,0): QQ(1)}, O_grlex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (0,1,0): QQ(1)}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,1,1): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,1,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(0,0,2): QQ(1), (1,0,0): -QQ(1)}, O_grlex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (0,0,1): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (1,0,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,1,1): -QQ(1)}, O_lex),
        sdp_from_dict({(0,2,0): QQ(1), (0,0,1): -QQ(1)}, O_lex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (0,0,1): QQ(1)}, O_grlex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (1,0,0): QQ(1)}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, QQ) == [
        sdp_from_dict({(0,0,3): QQ(1), (2,0,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,2): -QQ(1)}, O_grlex),
        sdp_from_dict({(0,2,0): QQ(1), (0,0,1): -QQ(1)}, O_grlex),
        sdp_from_dict({(0,1,1): QQ(1), (1,0,0): -QQ(1)}, O_grlex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (0,1,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (1,0,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,0,3): -QQ(1)}, O_lex),
        sdp_from_dict({(0,1,0): QQ(1), (0,0,2): -QQ(1)}, O_lex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (0,1,0): QQ(1)}, O_grlex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (1,0,0): QQ(1)}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, QQ) == [
        sdp_from_dict({(0,3,0): QQ(1), (2,0,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,2,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(0,1,1): QQ(1), (1,0,0): -QQ(1)}, O_grlex),
        sdp_from_dict({(0,0,2): QQ(1), (0,1,0): -QQ(1)}, O_grlex),
    ]

    f = sdp_from_dict({(2,2): QQ(4), (1,1): QQ(4), (0,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(2,0): QQ(1), (0,2): QQ(1), (0,0):-QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [
        sdp_from_dict({(1,0): QQ(1,1), (0,7): QQ(-4,1), (0,5): QQ(8,1), (0,3): QQ(-7,1), (0,1): QQ(3,1)}, O_lex),
        sdp_from_dict({(0,8): QQ(1,1), (0,6): QQ(-2,1), (0,4): QQ(3,2), (0,2): QQ(-1,2), (0,0): QQ(1,16)}, O_lex),
    ]

    raises(DomainError, "sdp_groebner([], 1, O_lex, ZZ)")
Example #4
0
def helper_test_sdp_groebner():
    f = sdp_from_dict({(1,2): QQ(2,), (2,0): QQ(1)}, lex)
    g = sdp_from_dict({(0,3): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  lex)

    a = sdp_from_dict({(1,0): QQ(1,1)}, lex)
    b = sdp_from_dict({(0,3): QQ(1,1), (0,0): QQ(-1,2)}, lex)

    assert sdp_groebner((f, g), 1, lex, QQ) == [a, b]

    f = sdp_from_dict({(2,1): QQ(2,), (0,2): QQ(1)}, lex)
    g = sdp_from_dict({(3,0): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  lex)

    a = sdp_from_dict({(0,1): QQ(1,1)}, lex)
    b = sdp_from_dict({(3,0): QQ(1,1), (0,0): QQ(-1,2)}, lex)

    assert sdp_groebner((f, g), 1, lex, QQ) == [b, a]

    f = sdp_from_dict({(0,0,2): QQ(-1), (1,0,0): QQ(1)}, lex)
    g = sdp_from_dict({(0,0,3): QQ(-1), (0,1,0): QQ(1)}, lex)

    assert sdp_groebner((f, g), 1, lex, QQ) == [f, g]

    f = sdp_from_dict({(3,0): QQ(1), (1,1): QQ(-2)}, grlex)
    g = sdp_from_dict({(2,1): QQ(1), (0,2): QQ(-2), (1,0): QQ(1)}, grlex)

    a = sdp_from_dict({(2,0): QQ(1)}, grlex)
    b = sdp_from_dict({(1,1): QQ(1)}, grlex)
    c = sdp_from_dict({(0,2): QQ(1), (1, 0): QQ(-1,2)}, grlex)

    assert sdp_groebner((f, g), 1, grlex, QQ) == [a, b, c]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,1,0): QQ(1)}, lex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,0,1): QQ(1)}, lex)

    assert sdp_groebner((f, g), 2, lex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,1,0): -QQ(1)}, lex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,1): -QQ(1)}, lex),
        sdp_from_dict({(1,0,1): QQ(1), (0,2,0): -QQ(1)}, lex),
        sdp_from_dict({(0,3,0): QQ(1), (0,0,2): -QQ(1)}, lex),
    ]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,1,0): QQ(1)}, grlex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,0,1): QQ(1)}, grlex)

    assert sdp_groebner((f, g), 2, grlex, QQ) == [
        sdp_from_dict({(0,3,0): QQ(1), (0,0,2): -QQ(1)}, grlex),
        sdp_from_dict({(2,0,0): QQ(1), (0,1,0): -QQ(1)}, grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,1): -QQ(1)}, grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,2,0): -QQ(1)}, grlex),
    ]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,0,1): QQ(1)}, lex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,1,0): QQ(1)}, lex)

    assert sdp_groebner((f, g), 2, lex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,0,1): -QQ(1)}, lex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,2): -QQ(1)}, lex),
        sdp_from_dict({(1,0,1): QQ(1), (0,1,0): -QQ(1)}, lex),
        sdp_from_dict({(0,2,0): QQ(1), (0,0,3): -QQ(1)}, lex),
    ]

    f = sdp_from_dict({(2,0,0): -QQ(1), (0,0,1): QQ(1)}, grlex)
    g = sdp_from_dict({(3,0,0): -QQ(1), (0,1,0): QQ(1)}, grlex)

    assert sdp_groebner((f, g), 2, grlex, QQ) == [
        sdp_from_dict({(0,0,3): QQ(1), (0,2,0): -QQ(1)}, grlex),
        sdp_from_dict({(2,0,0): QQ(1), (0,0,1): -QQ(1)}, grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,2): -QQ(1)}, grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,1,0): -QQ(1)}, grlex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (1,0,0): QQ(1)}, lex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (0,0,1): QQ(1)}, lex)

    assert sdp_groebner((f, g), 2, lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,2,0): -QQ(1)}, lex),
        sdp_from_dict({(0,3,0): QQ(1), (0,0,1): -QQ(1)}, lex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (1,0,0): QQ(1)}, grlex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (0,0,1): QQ(1)}, grlex)

    assert sdp_groebner((f, g), 2, grlex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,1,1): -QQ(1)}, grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,1): -QQ(1)}, grlex),
        sdp_from_dict({(0,2,0): QQ(1), (1,0,0): -QQ(1)}, grlex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (1,0,0): QQ(1)}, lex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (0,1,0): QQ(1)}, lex)

    assert sdp_groebner((f, g), 2, lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,0,2): -QQ(1)}, lex),
        sdp_from_dict({(0,1,0): QQ(1), (0,0,3): -QQ(1)}, lex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (1,0,0): QQ(1)}, grlex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (0,1,0): QQ(1)}, grlex)

    assert sdp_groebner((f, g), 2, grlex, QQ) == [
        sdp_from_dict({(2,0,0): QQ(1), (0,1,1): -QQ(1)}, grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,1,0): -QQ(1)}, grlex),
        sdp_from_dict({(0,0,2): QQ(1), (1,0,0): -QQ(1)}, grlex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (0,0,1): QQ(1)}, lex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (1,0,0): QQ(1)}, lex)

    assert sdp_groebner((f, g), 2, lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,1,1): -QQ(1)}, lex),
        sdp_from_dict({(0,2,0): QQ(1), (0,0,1): -QQ(1)}, lex),
    ]

    f = sdp_from_dict({(0,2,0): -QQ(1), (0,0,1): QQ(1)}, grlex)
    g = sdp_from_dict({(0,3,0): -QQ(1), (1,0,0): QQ(1)}, grlex)

    assert sdp_groebner((f, g), 2, grlex, QQ) == [
        sdp_from_dict({(0,0,3): QQ(1), (2,0,0): -QQ(1)}, grlex),
        sdp_from_dict({(1,1,0): QQ(1), (0,0,2): -QQ(1)}, grlex),
        sdp_from_dict({(0,2,0): QQ(1), (0,0,1): -QQ(1)}, grlex),
        sdp_from_dict({(0,1,1): QQ(1), (1,0,0): -QQ(1)}, grlex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (0,1,0): QQ(1)}, lex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (1,0,0): QQ(1)}, lex)

    assert sdp_groebner((f, g), 2, lex, QQ) == [
        sdp_from_dict({(1,0,0): QQ(1), (0,0,3): -QQ(1)}, lex),
        sdp_from_dict({(0,1,0): QQ(1), (0,0,2): -QQ(1)}, lex),
    ]

    f = sdp_from_dict({(0,0,2): -QQ(1), (0,1,0): QQ(1)}, grlex)
    g = sdp_from_dict({(0,0,3): -QQ(1), (1,0,0): QQ(1)}, grlex)

    assert sdp_groebner((f, g), 2, grlex, QQ) == [
        sdp_from_dict({(0,3,0): QQ(1), (2,0,0): -QQ(1)}, grlex),
        sdp_from_dict({(1,0,1): QQ(1), (0,2,0): -QQ(1)}, grlex),
        sdp_from_dict({(0,1,1): QQ(1), (1,0,0): -QQ(1)}, grlex),
        sdp_from_dict({(0,0,2): QQ(1), (0,1,0): -QQ(1)}, grlex),
    ]

    f = sdp_from_dict({(2,2): QQ(4), (1,1): QQ(4), (0,0): QQ(1)}, lex)
    g = sdp_from_dict({(2,0): QQ(1), (0,2): QQ(1), (0,0):-QQ(1)}, lex)

    assert sdp_groebner((f, g), 1, lex, QQ) == [
        sdp_from_dict({(1,0): QQ(1,1), (0,7): QQ(-4,1), (0,5): QQ(8,1), (0,3): QQ(-7,1), (0,1): QQ(3,1)}, lex),
        sdp_from_dict({(0,8): QQ(1,1), (0,6): QQ(-2,1), (0,4): QQ(3,2), (0,2): QQ(-1,2), (0,0): QQ(1,16)}, lex),
    ]

    raises(DomainError, lambda: sdp_groebner([], 1, lex, ZZ))
Example #5
0
def test_sdp_groebner():
    f = sdp_from_dict({(1,2): QQ(2,), (2,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,3): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  O_lex)

    a = sdp_from_dict({(1,0): QQ(1,1)}, O_lex)
    b = sdp_from_dict({(0,3): QQ(1,1), (0,0): QQ(-1,2)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [a, b]

    f = sdp_from_dict({(2,1): QQ(2,), (0,2): QQ(1)}, O_lex)
    g = sdp_from_dict({(3,0): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  O_lex)

    a = sdp_from_dict({(0,1): QQ(1,1)}, O_lex)
    b = sdp_from_dict({(3,0): QQ(1,1), (0,0): QQ(-1,2)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [b, a]

    f = sdp_from_dict({(0,0,2): QQ(-1), (1,0,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,0,3): QQ(-1), (0,1,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [f, g]

    f = sdp_from_dict({(3,0): QQ(1), (1,1): QQ(-2)}, O_grlex)
    g = sdp_from_dict({(2,1): QQ(1), (0,2): QQ(-2), (1,0): QQ(1)}, O_grlex)

    a = sdp_from_dict({(2,0): QQ(1)}, O_grlex)
    b = sdp_from_dict({(1,1): QQ(1)}, O_grlex)
    c = sdp_from_dict({(0,2): QQ(1), (1, 0): QQ(-1,2)}, O_grlex)

    assert sdp_groebner((f, g), 1, O_grlex, QQ) == [a, b, c]

    f = sdp_from_dict({(2,0,0): -1, (0,1,0): 1}, O_lex)
    g = sdp_from_dict({(3,0,0): -1, (0,0,1): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,1,0): -1}, O_lex),
        sdp_from_dict({(1,1,0): 1, (0,0,1): -1}, O_lex),
        sdp_from_dict({(1,0,1): 1, (0,2,0): -1}, O_lex),
        sdp_from_dict({(0,3,0): 1, (0,0,2): -1}, O_lex),
    ]

    f = sdp_from_dict({(2,0,0): -1, (0,1,0): 1}, O_grlex)
    g = sdp_from_dict({(3,0,0): -1, (0,0,1): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,3,0): 1, (0,0,2): -1}, O_grlex),
        sdp_from_dict({(2,0,0): 1, (0,1,0): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,2,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(2,0,0): -1, (0,0,1): 1}, O_lex)
    g = sdp_from_dict({(3,0,0): -1, (0,1,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,0,1): -1}, O_lex),
        sdp_from_dict({(1,1,0): 1, (0,0,2): -1}, O_lex),
        sdp_from_dict({(1,0,1): 1, (0,1,0): -1}, O_lex),
        sdp_from_dict({(0,2,0): 1, (0,0,3): -1}, O_lex),
    ]

    f = sdp_from_dict({(2,0,0): -1, (0,0,1): 1}, O_grlex)
    g = sdp_from_dict({(3,0,0): -1, (0,1,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,0,3): 1, (0,2,0): -1}, O_grlex),
        sdp_from_dict({(2,0,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,2): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,1,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (1,0,0): 1}, O_lex)
    g = sdp_from_dict({(0,3,0): -1, (0,0,1): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,2,0): -1}, O_lex),
        sdp_from_dict({(0,3,0): 1, (0,0,1): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (1,0,0): 1}, O_grlex)
    g = sdp_from_dict({(0,3,0): -1, (0,0,1): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,1,1): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(0,2,0): 1, (1,0,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (1,0,0): 1}, O_lex)
    g = sdp_from_dict({(0,0,3): -1, (0,1,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,0,2): -1}, O_lex),
        sdp_from_dict({(0,1,0): 1, (0,0,3): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (1,0,0): 1}, O_grlex)
    g = sdp_from_dict({(0,0,3): -1, (0,1,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,1,1): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,1,0): -1}, O_grlex),
        sdp_from_dict({(0,0,2): 1, (1,0,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (0,0,1): 1}, O_lex)
    g = sdp_from_dict({(0,3,0): -1, (1,0,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,1,1): -1}, O_lex),
        sdp_from_dict({(0,2,0): 1, (0,0,1): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (0,0,1): 1}, O_grlex)
    g = sdp_from_dict({(0,3,0): -1, (1,0,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,0,3): 1, (2,0,0): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,2): -1}, O_grlex),
        sdp_from_dict({(0,2,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(0,1,1): 1, (1,0,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (0,1,0): 1}, O_lex)
    g = sdp_from_dict({(0,0,3): -1, (1,0,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,0,3): -1}, O_lex),
        sdp_from_dict({(0,1,0): 1, (0,0,2): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (0,1,0): 1}, O_grlex)
    g = sdp_from_dict({(0,0,3): -1, (1,0,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,3,0): 1, (2,0,0): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,2,0): -1}, O_grlex),
        sdp_from_dict({(0,1,1): 1, (1,0,0): -1}, O_grlex),
        sdp_from_dict({(0,0,2): 1, (0,1,0): -1}, O_grlex),
    ]
def test_sdp_groebner():
    f = sdp_from_dict({(1,2): QQ(2,), (2,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,3): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  O_lex)

    a = sdp_from_dict({(1,0): QQ(1,1)}, O_lex)
    b = sdp_from_dict({(0,3): QQ(1,1), (0,0): QQ(-1,2)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [a, b]

    f = sdp_from_dict({(2,1): QQ(2,), (0,2): QQ(1)}, O_lex)
    g = sdp_from_dict({(3,0): QQ(2), (1,1): QQ(1), (0,0): QQ(-1)},  O_lex)

    a = sdp_from_dict({(0,1): QQ(1,1)}, O_lex)
    b = sdp_from_dict({(3,0): QQ(1,1), (0,0): QQ(-1,2)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [b, a]

    f = sdp_from_dict({(0,0,2): QQ(-1), (1,0,0): QQ(1)}, O_lex)
    g = sdp_from_dict({(0,0,3): QQ(-1), (0,1,0): QQ(1)}, O_lex)

    assert sdp_groebner((f, g), 1, O_lex, QQ) == [f, g]

    f = sdp_from_dict({(3,0): QQ(1), (1,1): QQ(-2)}, O_grlex)
    g = sdp_from_dict({(2,1): QQ(1), (0,2): QQ(-2), (1,0): QQ(1)}, O_grlex)

    a = sdp_from_dict({(2,0): QQ(1)}, O_grlex)
    b = sdp_from_dict({(1,1): QQ(1)}, O_grlex)
    c = sdp_from_dict({(0,2): QQ(1), (1, 0): QQ(-1,2)}, O_grlex)

    assert sdp_groebner((f, g), 1, O_grlex, QQ) == [a, b, c]

    f = sdp_from_dict({(2,0,0): -1, (0,1,0): 1}, O_lex)
    g = sdp_from_dict({(3,0,0): -1, (0,0,1): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,1,0): -1}, O_lex),
        sdp_from_dict({(1,1,0): 1, (0,0,1): -1}, O_lex),
        sdp_from_dict({(1,0,1): 1, (0,2,0): -1}, O_lex),
        sdp_from_dict({(0,3,0): 1, (0,0,2): -1}, O_lex),
    ]

    f = sdp_from_dict({(2,0,0): -1, (0,1,0): 1}, O_grlex)
    g = sdp_from_dict({(3,0,0): -1, (0,0,1): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,3,0): 1, (0,0,2): -1}, O_grlex),
        sdp_from_dict({(2,0,0): 1, (0,1,0): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,2,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(2,0,0): -1, (0,0,1): 1}, O_lex)
    g = sdp_from_dict({(3,0,0): -1, (0,1,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,0,1): -1}, O_lex),
        sdp_from_dict({(1,1,0): 1, (0,0,2): -1}, O_lex),
        sdp_from_dict({(1,0,1): 1, (0,1,0): -1}, O_lex),
        sdp_from_dict({(0,2,0): 1, (0,0,3): -1}, O_lex),
    ]

    f = sdp_from_dict({(2,0,0): -1, (0,0,1): 1}, O_grlex)
    g = sdp_from_dict({(3,0,0): -1, (0,1,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,0,3): 1, (0,2,0): -1}, O_grlex),
        sdp_from_dict({(2,0,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,2): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,1,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (1,0,0): 1}, O_lex)
    g = sdp_from_dict({(0,3,0): -1, (0,0,1): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,2,0): -1}, O_lex),
        sdp_from_dict({(0,3,0): 1, (0,0,1): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (1,0,0): 1}, O_grlex)
    g = sdp_from_dict({(0,3,0): -1, (0,0,1): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,1,1): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(0,2,0): 1, (1,0,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (1,0,0): 1}, O_lex)
    g = sdp_from_dict({(0,0,3): -1, (0,1,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,0,2): -1}, O_lex),
        sdp_from_dict({(0,1,0): 1, (0,0,3): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (1,0,0): 1}, O_grlex)
    g = sdp_from_dict({(0,0,3): -1, (0,1,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(2,0,0): 1, (0,1,1): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,1,0): -1}, O_grlex),
        sdp_from_dict({(0,0,2): 1, (1,0,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (0,0,1): 1}, O_lex)
    g = sdp_from_dict({(0,3,0): -1, (1,0,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,1,1): -1}, O_lex),
        sdp_from_dict({(0,2,0): 1, (0,0,1): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,2,0): -1, (0,0,1): 1}, O_grlex)
    g = sdp_from_dict({(0,3,0): -1, (1,0,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,0,3): 1, (2,0,0): -1}, O_grlex),
        sdp_from_dict({(1,1,0): 1, (0,0,2): -1}, O_grlex),
        sdp_from_dict({(0,2,0): 1, (0,0,1): -1}, O_grlex),
        sdp_from_dict({(0,1,1): 1, (1,0,0): -1}, O_grlex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (0,1,0): 1}, O_lex)
    g = sdp_from_dict({(0,0,3): -1, (1,0,0): 1}, O_lex)

    assert sdp_groebner((f, g), 2, O_lex, ZZ) == [
        sdp_from_dict({(1,0,0): 1, (0,0,3): -1}, O_lex),
        sdp_from_dict({(0,1,0): 1, (0,0,2): -1}, O_lex),
    ]

    f = sdp_from_dict({(0,0,2): -1, (0,1,0): 1}, O_grlex)
    g = sdp_from_dict({(0,0,3): -1, (1,0,0): 1}, O_grlex)

    assert sdp_groebner((f, g), 2, O_grlex, ZZ) == [
        sdp_from_dict({(0,3,0): 1, (2,0,0): -1}, O_grlex),
        sdp_from_dict({(1,0,1): 1, (0,2,0): -1}, O_grlex),
        sdp_from_dict({(0,1,1): 1, (1,0,0): -1}, O_grlex),
        sdp_from_dict({(0,0,2): 1, (0,1,0): -1}, O_grlex),
    ]