def zzX_fateman_poly_F_2(n): """Fateman's GCD benchmark: linearly dense quartic inputs """ u = [1, 0] for i in xrange(1, n): u = [zzX_const(i, 1), u] v = zzX_add_term(u, zzX_const(n - 1, 2)) f = zzX_sqr([zzX_const(n, 1), zzX_neg(v)]) g = zzX_sqr([zzX_const(n, 1), v]) v = zzX_add_term(u, zzX_const(n - 1, 1)) h = zzX_sqr([zzX_const(n, 1), v]) return zzX_mul(f, h), zzX_mul(g, h), h
def zzX_fateman_poly_F_2(n): """Fateman's GCD benchmark: linearly dense quartic inputs """ u = [1, 0] for i in xrange(1, n): u = [zzX_const(i, 1), u] v = zzX_add_term(u, zzX_const(n-1, 2)) f = zzX_sqr([zzX_const(n, 1), zzX_neg(v)]) g = zzX_sqr([zzX_const(n, 1), v]) v = zzX_add_term(u, zzX_const(n-1, 1)) h = zzX_sqr([zzX_const(n, 1), v]) return zzX_mul(f,h), zzX_mul(g,h), h
def zzX_fateman_poly_F_1(n): """Fateman's GCD benchmark: trivial GCD """ u = [1, 0] for i in xrange(1, n+1): u = [zzX_const(i, 1), u] v = [1, 0, 0] for i in xrange(1, n+1): v = [zzX_const(i, 1), zzX_zero(i), v] U = zzX_add_term(u, zzX_const(n, 1)) V = zzX_add_term(u, zzX_const(n, 2)) W = zzX_add_term(v, zzX_const(n, 1)) Y = zzX_lift(n-1, [[-3, 0], [], [1, 0, -1]]) F = zzX_mul(U, V) G = zzX_mul(W, Y) H = zzX_const(n+1, 1) return F, G, H
def zzX_fateman_poly_F_1(n): """Fateman's GCD benchmark: trivial GCD """ u = [1, 0] for i in xrange(1, n + 1): u = [zzX_const(i, 1), u] v = [1, 0, 0] for i in xrange(1, n + 1): v = [zzX_const(i, 1), zzX_zero(i), v] U = zzX_add_term(u, zzX_const(n, 1)) V = zzX_add_term(u, zzX_const(n, 2)) W = zzX_add_term(v, zzX_const(n, 1)) Y = zzX_lift(n - 1, [[-3, 0], [], [1, 0, -1]]) F = zzX_mul(U, V) G = zzX_mul(W, Y) H = zzX_const(n + 1, 1) return F, G, H
def zzX_fateman_poly_F_3(n): """Fateman's GCD benchmark: sparse inputs (deg f ~ vars f) """ u = zzx_from_dict({n+1:1}) for i in xrange(1, n): u = zzX_add_term([u], zzX_const(i, 1), n+1) v = zzX_add_term(u, zzX_const(n-1, 2)) f = zzX_sqr(zzX_add_term([zzX_neg(v)], zzX_const(n, 1), n+1)) g = zzX_sqr(zzX_add_term([v], zzX_const(n, 1), n+1)) v = zzX_add_term(u, zzX_const(n-1, 1)) h = zzX_sqr(zzX_add_term([v], zzX_const(n, 1), n+1)) return zzX_mul(f,h), zzX_mul(g,h), h
def zzX_fateman_poly_F_3(n): """Fateman's GCD benchmark: sparse inputs (deg f ~ vars f) """ u = zzx_from_dict({n + 1: 1}) for i in xrange(1, n): u = zzX_add_term([u], zzX_const(i, 1), n + 1) v = zzX_add_term(u, zzX_const(n - 1, 2)) f = zzX_sqr(zzX_add_term([zzX_neg(v)], zzX_const(n, 1), n + 1)) g = zzX_sqr(zzX_add_term([v], zzX_const(n, 1), n + 1)) v = zzX_add_term(u, zzX_const(n - 1, 1)) h = zzX_sqr(zzX_add_term([v], zzX_const(n, 1), n + 1)) return zzX_mul(f, h), zzX_mul(g, h), h
def test_zzX_add_term(): assert zzX_add_term(f_0, [[[]]], 3) == f_0