def test_gf_division(): raises(ZeroDivisionError, lambda: gf_div([1,2,3], [], 11, ZZ)) raises(ZeroDivisionError, lambda: gf_rem([1,2,3], [], 11, ZZ)) raises(ZeroDivisionError, lambda: gf_quo([1,2,3], [], 11, ZZ)) raises(ZeroDivisionError, lambda: gf_quo([1,2,3], [], 11, ZZ)) assert gf_div([1], [1,2,3], 7, ZZ) == ([], [1]) assert gf_rem([1], [1,2,3], 7, ZZ) == [1] assert gf_quo([1], [1,2,3], 7, ZZ) == [] f, g, q, r = [5,4,3,2,1,0], [1,2,3], [5,1,0,6], [3,3] assert gf_div(f, g, 7, ZZ) == (q, r) assert gf_rem(f, g, 7, ZZ) == r assert gf_quo(f, g, 7, ZZ) == q raises(ExactQuotientFailed, lambda: gf_exquo(f, g, 7, ZZ)) f, g, q, r = [5,4,3,2,1,0], [1,2,3,0], [5,1,0], [6,1,0] assert gf_div(f, g, 7, ZZ) == (q, r) assert gf_rem(f, g, 7, ZZ) == r assert gf_quo(f, g, 7, ZZ) == q raises(ExactQuotientFailed, lambda: gf_exquo(f, g, 7, ZZ)) assert gf_quo([1,2,1], [1,1], 11, ZZ) == [1,1]
def dup_zz_diophantine(F, m, p, K): """Wang/EEZ: Solve univariate Diophantine equations. """ if len(F) == 2: a, b = F f = gf_from_int_poly(a, p) g = gf_from_int_poly(b, p) s, t, G = gf_gcdex(g, f, p, K) s = gf_lshift(s, m, K) t = gf_lshift(t, m, K) q, s = gf_div(s, f, p, K) t = gf_add_mul(t, q, g, p, K) s = gf_to_int_poly(s, p) t = gf_to_int_poly(t, p) result = [s, t] else: G = [F[-1]] for f in reversed(F[1:-1]): G.insert(0, dup_mul(f, G[0], K)) S, T = [], [[1]] for f, g in zip(F, G): t, s = dmp_zz_diophantine([g, f], T[-1], [], 0, p, 1, K) T.append(t) S.append(s) result, S = [], S + [T[-1]] for s, f in zip(S, F): s = gf_from_int_poly(s, p) f = gf_from_int_poly(f, p) r = gf_rem(gf_lshift(s, m, K), f, p, K) s = gf_to_int_poly(r, p) result.append(s) return result
def mul(self, x, y): return gf_rem(gf_mul(x, y, self.p, ZZ), self.reducing, self.p, ZZ)
def mul(self, x: list, y: list) -> list: return gf_rem(gf_mul(x, y, self.p, ZZ), self.reducing, self.p, ZZ)