def test_dup_gcdex(): f = dup_normal([1, -2, -6, 12, 15], QQ) g = dup_normal([1, 1, -4, -4], QQ) s = [QQ(-1, 5), QQ(3, 5)] t = [QQ(1, 5), QQ(-6, 5), QQ(2)] h = [QQ(1), QQ(1)] assert dup_half_gcdex(f, g, QQ) == (s, h) assert dup_gcdex(f, g, QQ) == (s, t, h) f = dup_normal([1, 4, 0, -1, 1], QQ) g = dup_normal([1, 0, -1, 1], QQ) s, t, h = dup_gcdex(f, g, QQ) S, T, H = dup_gcdex(g, f, QQ) assert dup_add(dup_mul(s, f, QQ), dup_mul(t, g, QQ), QQ) == h assert dup_add(dup_mul(S, g, QQ), dup_mul(T, f, QQ), QQ) == H f = dup_normal([2, 0], QQ) g = dup_normal([1, 0, -16], QQ) s = [QQ(1, 32), QQ(0)] t = [QQ(-1, 16)] h = [QQ(1)] assert dup_half_gcdex(f, g, QQ) == (s, h) assert dup_gcdex(f, g, QQ) == (s, t, h)
def test_dup_gcdex(): f = dup_normal([1,-2,-6,12,15], QQ) g = dup_normal([1,1,-4,-4], QQ) s = [QQ(-1,5),QQ(3,5)] t = [QQ(1,5),QQ(-6,5),QQ(2)] h = [QQ(1),QQ(1)] assert dup_half_gcdex(f, g, QQ) == (s, h) assert dup_gcdex(f, g, QQ) == (s, t, h) f = dup_normal([1,4,0,-1,1], QQ) g = dup_normal([1,0,-1,1], QQ) s, t, h = dup_gcdex(f, g, QQ) S, T, H = dup_gcdex(g, f, QQ) assert dup_add(dup_mul(s, f, QQ), dup_mul(t, g, QQ), QQ) == h assert dup_add(dup_mul(S, g, QQ), dup_mul(T, f, QQ), QQ) == H f = dup_normal([2,0], QQ) g = dup_normal([1,0,-16], QQ) s = [QQ(1,32),QQ(0)] t = [QQ(-1,16)] h = [QQ(1)] assert dup_half_gcdex(f, g, QQ) == (s, h) assert dup_gcdex(f, g, QQ) == (s, t, h)
def half_gcdex(f, g): """Half extended Euclidean algorithm, if univariate. """ lev, dom, per, F, G = f.unify(g) if not lev: s, h = dup_half_gcdex(F, G, dom) return per(s), per(h) else: raise ValueError('univariate polynomial expected')