/* Copyright 2020 Daniel Schultz This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include #include "fq_nmod_mpoly.h" #include "profiler.h" slong count = 0; slong total_super = 0; void profile_gcd( const fq_nmod_mpoly_t realG, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx, unsigned int algo) { fq_nmod_mpoly_t G; timeit_t timer; slong hensel = -1, brown = -1, zippel = -1, zippel2 = -1, super = -1; fq_nmod_mpoly_init(G, ctx); if (algo & MPOLY_GCD_USE_BROWN) { fq_nmod_mpoly_add(G, A, B, ctx); timeit_start(timer); fq_nmod_mpoly_gcd_brown(G, A, B, ctx); timeit_stop(timer); brown = timer->wall; if (!fq_nmod_mpoly_equal(G, realG, ctx)) { flint_printf("brown is wrong\n"); flint_abort(); } } flint_printf("%10wd ", brown); fflush(stdout); if (algo & MPOLY_GCD_USE_HENSEL) { fq_nmod_mpoly_add(G, A, B, ctx); timeit_start(timer); fq_nmod_mpoly_gcd_hensel(G, A, B, ctx); timeit_stop(timer); hensel = timer->wall; if (!fq_nmod_mpoly_equal(G, realG, ctx)) { flint_printf("hensel is wrong\n"); flint_abort(); } } flint_printf("%10wd ", hensel); fflush(stdout); if (algo & MPOLY_GCD_USE_ZIPPEL2) { fq_nmod_mpoly_add(G, A, B, ctx); timeit_start(timer); fq_nmod_mpoly_gcd_zippel2(G, A, B, ctx); timeit_stop(timer); zippel2 = timer->wall; if (!fq_nmod_mpoly_equal(G, realG, ctx)) { flint_printf("zippel2 is wrong\n"); flint_abort(); } } flint_printf("%10wd ", zippel2); fflush(stdout); if (algo & MPOLY_GCD_USE_ZIPPEL) { fq_nmod_mpoly_add(G, A, B, ctx); timeit_start(timer); fq_nmod_mpoly_gcd_zippel(G, A, B, ctx); timeit_stop(timer); zippel = timer->wall; if (!fq_nmod_mpoly_equal(G, realG, ctx)) { flint_printf("zippel is wrong\n"); flint_abort(); } } flint_printf("%10wd ", zippel); fflush(stdout); { fq_nmod_mpoly_add(G, A, B, ctx); timeit_start(timer); fq_nmod_mpoly_gcd(G, A, B, ctx); timeit_stop(timer); super = timer->wall; if (!fq_nmod_mpoly_equal(G, realG, ctx)) { flint_printf("super is wrong\n"); flint_abort(); } } count++; flint_printf("%10wd #%wd\n", super, count); fflush(stdout); total_super += super; fq_nmod_mpoly_clear(G, ctx); } void print_banner() { flint_printf("| brown | hensel | zippel2 | zippel | super |\n"); flint_printf("+----------+----------+----------+----------+----------+\n"); } int main(int argc, char *argv[]) { slong i; const char * vars[] = {"x", "y", "z", "t" ,"u", "v", "w", "s", "p"}; mp_limb_t p = UWORD(4611686018427388073); print_banner(); for (i = 50; i < 100; i += 4) { fq_nmod_mpoly_ctx_t ctx; fq_nmod_mpoly_t a, b, t, m; fq_nmod_mpoly_ctx_init_deg(ctx, 2, ORD_LEX, p, 2); fq_nmod_mpoly_init(a, ctx); fq_nmod_mpoly_init(b, ctx); fq_nmod_mpoly_init(t, ctx); fq_nmod_mpoly_init(m, ctx); fq_nmod_mpoly_set_str_pretty(a, "1+#*x+y", vars, ctx); fq_nmod_mpoly_pow_ui(a, a, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "x", vars, ctx); fq_nmod_mpoly_add(a, a, m, ctx); fq_nmod_mpoly_set_str_pretty(b, "#-2*x-#*y", vars, ctx); fq_nmod_mpoly_pow_ui(b, b, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "y", vars, ctx); fq_nmod_mpoly_add(b, b, m, ctx); fq_nmod_mpoly_set_str_pretty(t, "2+#-x+y", vars, ctx); fq_nmod_mpoly_pow_ui(t, t, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "x-#*y", vars, ctx); fq_nmod_mpoly_add(t, t, m, ctx); fq_nmod_mpoly_mul(a, a, t, ctx); fq_nmod_mpoly_mul(b, b, t, ctx); fq_nmod_mpoly_make_monic(t, t, ctx); profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_BROWN | MPOLY_GCD_USE_HENSEL); fq_nmod_mpoly_clear(a, ctx); fq_nmod_mpoly_clear(b, ctx); fq_nmod_mpoly_clear(t, ctx); fq_nmod_mpoly_clear(m, ctx); fq_nmod_mpoly_ctx_clear(ctx); } print_banner(); for (i = 3; i < 10; i += 1) { fq_nmod_mpoly_ctx_t ctx; fq_nmod_mpoly_t a, b, t, m; fq_nmod_mpoly_ctx_init_deg(ctx, 2, ORD_LEX, p, 2); fq_nmod_mpoly_init(a, ctx); fq_nmod_mpoly_init(b, ctx); fq_nmod_mpoly_init(t, ctx); fq_nmod_mpoly_init(m, ctx); fq_nmod_mpoly_set_str_pretty(a, "#-#*x^31+y^51", vars, ctx); fq_nmod_mpoly_pow_ui(a, a, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "x^7", vars, ctx); fq_nmod_mpoly_add(a, a, m, ctx); fq_nmod_mpoly_set_str_pretty(b, "1-2*#*x^23+#*y^47", vars, ctx); fq_nmod_mpoly_pow_ui(b, b, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "y^9", vars, ctx); fq_nmod_mpoly_add(b, b, m, ctx); fq_nmod_mpoly_set_str_pretty(t, "2*#-x^39+#^2*y^24", vars, ctx); fq_nmod_mpoly_pow_ui(t, t, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "x^6*y^7", vars, ctx); fq_nmod_mpoly_add(t, t, m, ctx); fq_nmod_mpoly_mul(a, a, t, ctx); fq_nmod_mpoly_mul(b, b, t, ctx); fq_nmod_mpoly_make_monic(t, t, ctx); profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_BROWN | MPOLY_GCD_USE_HENSEL); fq_nmod_mpoly_clear(a, ctx); fq_nmod_mpoly_clear(b, ctx); fq_nmod_mpoly_clear(t, ctx); fq_nmod_mpoly_clear(m, ctx); fq_nmod_mpoly_ctx_clear(ctx); } print_banner(); for (i = 15; i < 25; i++) { fq_nmod_mpoly_ctx_t ctx; fq_nmod_mpoly_t a, b, t, m; fq_nmod_mpoly_ctx_init_deg(ctx, 3, ORD_LEX, p, 2); fq_nmod_mpoly_init(a, ctx); fq_nmod_mpoly_init(b, ctx); fq_nmod_mpoly_init(t, ctx); fq_nmod_mpoly_init(m, ctx); fq_nmod_mpoly_set_str_pretty(a, "#+x+#*y+z", vars, ctx); fq_nmod_mpoly_pow_ui(a, a, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "x", vars, ctx); fq_nmod_mpoly_add(a, a, m, ctx); fq_nmod_mpoly_set_str_pretty(b, "1-2*#^2*x-y+#*z", vars, ctx); fq_nmod_mpoly_pow_ui(b, b, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "y", vars, ctx); fq_nmod_mpoly_add(b, b, m, ctx); fq_nmod_mpoly_set_str_pretty(t, "3*#+x+#*y-2*z", vars, ctx); fq_nmod_mpoly_pow_ui(t, t, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "z", vars, ctx); fq_nmod_mpoly_add(t, t, m, ctx); fq_nmod_mpoly_mul(a, a, t, ctx); fq_nmod_mpoly_mul(b, b, t, ctx); fq_nmod_mpoly_make_monic(t, t, ctx); profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_ALL); fq_nmod_mpoly_clear(a, ctx); fq_nmod_mpoly_clear(b, ctx); fq_nmod_mpoly_clear(t, ctx); fq_nmod_mpoly_clear(m, ctx); fq_nmod_mpoly_ctx_clear(ctx); } print_banner(); for (i = 1; i < 10; i++) { fq_nmod_mpoly_ctx_t ctx; fq_nmod_mpoly_t a, b, t, m; fq_nmod_mpoly_ctx_init_deg(ctx, 7, ORD_LEX, p, 2); fq_nmod_mpoly_init(a, ctx); fq_nmod_mpoly_init(b, ctx); fq_nmod_mpoly_init(t, ctx); fq_nmod_mpoly_init(m, ctx); fq_nmod_mpoly_set_str_pretty(a, "1+#*x+y+z+#*t+#*u+2*v+w", vars, ctx); fq_nmod_mpoly_pow_ui(a, a, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "x", vars, ctx); fq_nmod_mpoly_add(a, a, m, ctx); fq_nmod_mpoly_set_str_pretty(b, "1+x+#*y+z+#*t+u+3*v+#*w", vars, ctx); fq_nmod_mpoly_pow_ui(b, b, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "y", vars, ctx); fq_nmod_mpoly_add(b, b, m, ctx); fq_nmod_mpoly_set_str_pretty(t, "1+#*x+y+#*z+#*t+u+4*#*v+#*w", vars, ctx); fq_nmod_mpoly_pow_ui(t, t, i, ctx); fq_nmod_mpoly_set_str_pretty(m, "z", vars, ctx); fq_nmod_mpoly_add(t, t, m, ctx); fq_nmod_mpoly_mul(a, a, t, ctx); fq_nmod_mpoly_mul(b, b, t, ctx); fq_nmod_mpoly_make_monic(t, t, ctx); profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_HENSEL | MPOLY_GCD_USE_ZIPPEL2); fq_nmod_mpoly_clear(a, ctx); fq_nmod_mpoly_clear(b, ctx); fq_nmod_mpoly_clear(t, ctx); fq_nmod_mpoly_clear(m, ctx); fq_nmod_mpoly_ctx_clear(ctx); } flint_printf("--------------------\ntotal time: %wd\n", total_super); flint_cleanup_master(); return 0; }