/* Copyright (C) 2015 Ashish Kedia 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 #include "flint.h" #include "nmod_poly.h" #include "ulong_extras.h" #include "fmpz.h" #include "nmod_mat.h" #include #define MIN_DIMENSION 1 #define MAX_DIMENSION 501 #define DIMENSION_SCALE 5 #define MIN_LENGTH 1 #define MAX_LENGTH 40 int main() { FLINT_TEST_INIT(state); slong dim, len, i; int result; nmod_mat_t A, B, C; nmod_poly_t poly; mp_limb_t n = n_randtest_not_zero(state); clock_t horner_begin, paterson_begin; double horner_time, paterson_time; printf ("#Dimension\tLength\t\tHoner's\t\t\tPaterson\t\tBetter(0 = Horner, 1 = Paterson)\n"); for (dim = MIN_DIMENSION; dim <= MAX_DIMENSION; dim += DIMENSION_SCALE) { nmod_mat_init(A, dim, dim, n); nmod_mat_init(B, dim, dim, n); nmod_mat_init(C, dim, dim, n); do { nmod_mat_randtest(A, state); } while (nmod_mat_is_zero(A)); for (len = MIN_LENGTH; len <= MAX_LENGTH; len++) { nmod_poly_init2(poly, n, len); for (i = 0; i < len; i++) { poly->coeffs[i] = n_randint(state, n); } poly->length = len; horner_begin = clock(); nmod_poly_evaluate_mat_horner(B, poly, A); horner_time = (double) (clock() - horner_begin) / CLOCKS_PER_SEC; paterson_begin = clock(); nmod_poly_evaluate_mat_paterson_stockmeyer(C, poly, A); paterson_time = (double) (clock() - paterson_begin) / CLOCKS_PER_SEC; result = horner_time < paterson_time ? 0 : 1; flint_printf("%wd\t\t%wd\t\t%lf\t\t%lf\t\t%d\n", dim, len, horner_time, paterson_time, result); nmod_poly_clear(poly); } nmod_mat_clear(A); nmod_mat_clear(B); nmod_mat_clear(C); } FLINT_TEST_CLEANUP(state); return 0; }