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)
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)
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)")
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))
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), ]