/*
Copyright 2019 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 "fmpz_mod_mpoly.h"
#include "profiler.h"
slong count = 0;
slong total_super = 0;
void profile_gcd(
const fmpz_mod_mpoly_t realG,
const fmpz_mod_mpoly_t A,
const fmpz_mod_mpoly_t B,
const fmpz_mod_mpoly_ctx_t ctx,
unsigned int algo)
{
fmpz_mod_mpoly_t G;
timeit_t timer;
slong hensel = -1, brown = -1, zippel = -1, zippel2 = -1, super = -1;
fmpz_mod_mpoly_init(G, ctx);
if (algo & MPOLY_GCD_USE_BROWN)
{
fmpz_mod_mpoly_add(G, A, B, ctx);
timeit_start(timer);
fmpz_mod_mpoly_gcd_brown(G, A, B, ctx);
timeit_stop(timer);
brown = timer->wall;
if (!fmpz_mod_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)
{
fmpz_mod_mpoly_add(G, A, B, ctx);
timeit_start(timer);
fmpz_mod_mpoly_gcd_hensel(G, A, B, ctx);
timeit_stop(timer);
hensel = timer->wall;
if (!fmpz_mod_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)
{
fmpz_mod_mpoly_add(G, A, B, ctx);
timeit_start(timer);
fmpz_mod_mpoly_gcd_zippel2(G, A, B, ctx);
timeit_stop(timer);
zippel2 = timer->wall;
if (!fmpz_mod_mpoly_equal(G, realG, ctx))
{
flint_printf("zippel2 is wrong\n");
flint_abort();
}
}
flint_printf("%10wd ", zippel2);
fflush(stdout);
if (0 && algo & MPOLY_GCD_USE_ZIPPEL)
{
fmpz_mod_mpoly_add(G, A, B, ctx);
timeit_start(timer);
fmpz_mod_mpoly_gcd_zippel(G, A, B, ctx);
timeit_stop(timer);
zippel = timer->wall;
if (!fmpz_mod_mpoly_equal(G, realG, ctx))
{
flint_printf("zippel is wrong\n");
flint_abort();
}
}
flint_printf("%10wd ", zippel);
fflush(stdout);
{
fmpz_mod_mpoly_add(G, A, B, ctx);
timeit_start(timer);
fmpz_mod_mpoly_gcd(G, A, B, ctx);
timeit_stop(timer);
super = timer->wall;
if (!fmpz_mod_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;
fmpz_mod_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, j;
const char * vars[] = {"x", "y", "z", "t" ,"u", "v", "w", "s", "p"};
fmpz_t p;
fmpz_init(p);
fmpz_set_ui(p, 3);
fmpz_pow_ui(p, p, 70);
fmpz_nextprime(p, p, 1);
print_banner();
for (i = 3; i <= 10; i++)
{
fmpz_mod_mpoly_ctx_t ctx;
fmpz_mod_mpoly_t g, a, b, t;
fmpz_mod_mpoly_ctx_init(ctx, i, ORD_DEGREVLEX, p);
fmpz_mod_mpoly_init(a, ctx);
fmpz_mod_mpoly_init(b, ctx);
fmpz_mod_mpoly_init(g, ctx);
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_one(g, ctx);
fmpz_mod_mpoly_one(a, ctx);
fmpz_mod_mpoly_one(b, ctx);
for (j = 0; j < i; j++)
{
fmpz_mod_mpoly_gen(t, j, ctx);
fmpz_mod_mpoly_add_si(t, t, 1, ctx);
fmpz_mod_mpoly_mul(g, g, t, ctx);
fmpz_mod_mpoly_gen(t, j, ctx);
fmpz_mod_mpoly_sub_si(t, t, 2, ctx);
fmpz_mod_mpoly_mul(a, a, t, ctx);
fmpz_mod_mpoly_gen(t, j, ctx);
fmpz_mod_mpoly_add_si(t, t, 2, ctx);
fmpz_mod_mpoly_mul(b, b, t, ctx);
}
fmpz_mod_mpoly_sub_si(g, g, 2, ctx);
fmpz_mod_mpoly_add_si(a, a, 2, ctx);
fmpz_mod_mpoly_sub_si(b, b, 2, ctx);
fmpz_mod_mpoly_mul(a, a, g, ctx);
fmpz_mod_mpoly_mul(b, b, g, ctx);
fmpz_mod_mpoly_make_monic(g, g, ctx);
profile_gcd(g, a, b, ctx, MPOLY_GCD_USE_BROWN | MPOLY_GCD_USE_HENSEL);
fmpz_mod_mpoly_clear(a, ctx);
fmpz_mod_mpoly_clear(b, ctx);
fmpz_mod_mpoly_clear(g, ctx);
fmpz_mod_mpoly_clear(t, ctx);
fmpz_mod_mpoly_ctx_clear(ctx);
}
print_banner();
for (i = 50; i < 100; i += 4)
{
fmpz_mod_mpoly_ctx_t ctx;
fmpz_mod_mpoly_t a, b, t, m;
fmpz_mod_mpoly_ctx_init(ctx, 2, ORD_LEX, p);
fmpz_mod_mpoly_init(a, ctx);
fmpz_mod_mpoly_init(b, ctx);
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_init(m, ctx);
fmpz_mod_mpoly_set_str_pretty(a, "1+x+y", vars, ctx);
fmpz_mod_mpoly_pow_ui(a, a, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x", vars, ctx);
fmpz_mod_mpoly_add(a, a, m, ctx);
fmpz_mod_mpoly_set_str_pretty(b, "1-2*x-y", vars, ctx);
fmpz_mod_mpoly_pow_ui(b, b, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "y", vars, ctx);
fmpz_mod_mpoly_add(b, b, m, ctx);
fmpz_mod_mpoly_set_str_pretty(t, "2-x+y", vars, ctx);
fmpz_mod_mpoly_pow_ui(t, t, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x-y", vars, ctx);
fmpz_mod_mpoly_add(t, t, m, ctx);
fmpz_mod_mpoly_mul(a, a, t, ctx);
fmpz_mod_mpoly_mul(b, b, t, ctx);
fmpz_mod_mpoly_make_monic(t, t, ctx);
profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_BROWN | MPOLY_GCD_USE_HENSEL);
fmpz_mod_mpoly_clear(a, ctx);
fmpz_mod_mpoly_clear(b, ctx);
fmpz_mod_mpoly_clear(t, ctx);
fmpz_mod_mpoly_clear(m, ctx);
fmpz_mod_mpoly_ctx_clear(ctx);
}
print_banner();
for (i = 5; i < 15; i += 1)
{
fmpz_mod_mpoly_ctx_t ctx;
fmpz_mod_mpoly_t a, b, t, m;
fmpz_mod_mpoly_ctx_init(ctx, 2, ORD_LEX, p);
fmpz_mod_mpoly_init(a, ctx);
fmpz_mod_mpoly_init(b, ctx);
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_init(m, ctx);
fmpz_mod_mpoly_set_str_pretty(a, "1+x^31+y^51", vars, ctx);
fmpz_mod_mpoly_pow_ui(a, a, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x^7", vars, ctx);
fmpz_mod_mpoly_add(a, a, m, ctx);
fmpz_mod_mpoly_set_str_pretty(b, "1-2*x^23-y^47", vars, ctx);
fmpz_mod_mpoly_pow_ui(b, b, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "y^9", vars, ctx);
fmpz_mod_mpoly_add(b, b, m, ctx);
fmpz_mod_mpoly_set_str_pretty(t, "2-x^39+y^24", vars, ctx);
fmpz_mod_mpoly_pow_ui(t, t, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x^6*y^7", vars, ctx);
fmpz_mod_mpoly_add(t, t, m, ctx);
fmpz_mod_mpoly_mul(a, a, t, ctx);
fmpz_mod_mpoly_mul(b, b, t, ctx);
fmpz_mod_mpoly_make_monic(t, t, ctx);
profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_BROWN | MPOLY_GCD_USE_HENSEL);
fmpz_mod_mpoly_clear(a, ctx);
fmpz_mod_mpoly_clear(b, ctx);
fmpz_mod_mpoly_clear(t, ctx);
fmpz_mod_mpoly_clear(m, ctx);
fmpz_mod_mpoly_ctx_clear(ctx);
}
print_banner();
for (i = 15; i < 30; i++)
{
fmpz_mod_mpoly_ctx_t ctx;
fmpz_mod_mpoly_t a, b, t, m;
fmpz_mod_mpoly_ctx_init(ctx, 3, ORD_LEX, p);
fmpz_mod_mpoly_init(a, ctx);
fmpz_mod_mpoly_init(b, ctx);
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_init(m, ctx);
fmpz_mod_mpoly_set_str_pretty(a, "1+x+y+z", vars, ctx);
fmpz_mod_mpoly_pow_ui(a, a, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x", vars, ctx);
fmpz_mod_mpoly_add(a, a, m, ctx);
fmpz_mod_mpoly_set_str_pretty(b, "1-2*x-y+z", vars, ctx);
fmpz_mod_mpoly_pow_ui(b, b, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "y", vars, ctx);
fmpz_mod_mpoly_add(b, b, m, ctx);
fmpz_mod_mpoly_set_str_pretty(t, "3+x+y-2*z", vars, ctx);
fmpz_mod_mpoly_pow_ui(t, t, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "z", vars, ctx);
fmpz_mod_mpoly_add(t, t, m, ctx);
fmpz_mod_mpoly_mul(a, a, t, ctx);
fmpz_mod_mpoly_mul(b, b, t, ctx);
fmpz_mod_mpoly_make_monic(t, t, ctx);
profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_ALL);
fmpz_mod_mpoly_clear(a, ctx);
fmpz_mod_mpoly_clear(b, ctx);
fmpz_mod_mpoly_clear(t, ctx);
fmpz_mod_mpoly_clear(m, ctx);
fmpz_mod_mpoly_ctx_clear(ctx);
}
print_banner();
for (i = 1; i < 7; i++)
{
fmpz_mod_mpoly_ctx_t ctx;
fmpz_mod_mpoly_t a, b, t, m;
fmpz_mod_mpoly_ctx_init(ctx, 7, ORD_LEX, p);
fmpz_mod_mpoly_init(a, ctx);
fmpz_mod_mpoly_init(b, ctx);
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_init(m, ctx);
fmpz_mod_mpoly_set_str_pretty(a, "1+x+y+z+t+u+2*v+w", vars, ctx);
fmpz_mod_mpoly_pow_ui(a, a, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x", vars, ctx);
fmpz_mod_mpoly_add(a, a, m, ctx);
fmpz_mod_mpoly_set_str_pretty(b, "1-2*x-y+z+t+u+v+w", vars, ctx);
fmpz_mod_mpoly_pow_ui(b, b, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "y", vars, ctx);
fmpz_mod_mpoly_add(b, b, m, ctx);
fmpz_mod_mpoly_set_str_pretty(t, "1+x+y+z-t-u+v+3*w", vars, ctx);
fmpz_mod_mpoly_pow_ui(t, t, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "z", vars, ctx);
fmpz_mod_mpoly_add(t, t, m, ctx);
fmpz_mod_mpoly_mul(a, a, t, ctx);
fmpz_mod_mpoly_mul(b, b, t, ctx);
fmpz_mod_mpoly_make_monic(t, t, ctx);
profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_HENSEL | MPOLY_GCD_USE_ZIPPEL2);
fmpz_mod_mpoly_clear(a, ctx);
fmpz_mod_mpoly_clear(b, ctx);
fmpz_mod_mpoly_clear(t, ctx);
fmpz_mod_mpoly_clear(m, ctx);
fmpz_mod_mpoly_ctx_clear(ctx);
}
print_banner();
for (i = 1; i < 5; i++)
{
fmpz_mod_mpoly_ctx_t ctx;
fmpz_mod_mpoly_t a, b, t, m;
fmpz_mod_mpoly_ctx_init(ctx, 9, ORD_LEX, p);
fmpz_mod_mpoly_init(a, ctx);
fmpz_mod_mpoly_init(b, ctx);
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_init(m, ctx);
fmpz_mod_mpoly_set_str_pretty(a, "1+x+y+z+t+u+2*v+w+s-p", vars, ctx);
fmpz_mod_mpoly_pow_ui(a, a, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "x", vars, ctx);
fmpz_mod_mpoly_add(a, a, m, ctx);
fmpz_mod_mpoly_set_str_pretty(b, "1-2*x-y+z+t+u+v+w-2*s+p", vars, ctx);
fmpz_mod_mpoly_pow_ui(b, b, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "y", vars, ctx);
fmpz_mod_mpoly_add(b, b, m, ctx);
fmpz_mod_mpoly_set_str_pretty(t, "1+x+y+z-t-u+v+3*w+2*s-3*p", vars, ctx);
fmpz_mod_mpoly_pow_ui(t, t, i, ctx);
fmpz_mod_mpoly_set_str_pretty(m, "z", vars, ctx);
fmpz_mod_mpoly_add(t, t, m, ctx);
fmpz_mod_mpoly_mul(a, a, t, ctx);
fmpz_mod_mpoly_mul(b, b, t, ctx);
fmpz_mod_mpoly_make_monic(t, t, ctx);
profile_gcd(t, a, b, ctx, MPOLY_GCD_USE_HENSEL | MPOLY_GCD_USE_ZIPPEL2);
fmpz_mod_mpoly_clear(a, ctx);
fmpz_mod_mpoly_clear(b, ctx);
fmpz_mod_mpoly_clear(t, ctx);
fmpz_mod_mpoly_clear(m, ctx);
fmpz_mod_mpoly_ctx_clear(ctx);
}
flint_printf("--------------------\n");
flint_printf("total time: %wd\n", total_super);
flint_printf(" record: 25312\n");
fmpz_clear(p);
flint_cleanup_master();
return 0;
}