diff options
author | Niels M?ller <nisse@lysator.liu.se> | 2012-10-31 13:56:30 +0100 |
---|---|---|
committer | Niels M?ller <nisse@lysator.liu.se> | 2012-10-31 13:56:30 +0100 |
commit | 0941d53ad41f00aa7e0fc13bda40ec5971163650 (patch) | |
tree | 1b219b5e4f4d9dbb66230999211c42d5e6d37df5 /tests | |
parent | 44572c7f9509973793cb92c899f1c38b1d0cc21c (diff) | |
download | gmp-0941d53ad41f00aa7e0fc13bda40ec5971163650.tar.gz |
Test mpn_brootinv.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/mpn/Makefile.am | 3 | ||||
-rw-r--r-- | tests/mpn/t-brootinv.c | 104 |
2 files changed, 106 insertions, 1 deletions
diff --git a/tests/mpn/Makefile.am b/tests/mpn/Makefile.am index 084e598e7..c7603ddd1 100644 --- a/tests/mpn/Makefile.am +++ b/tests/mpn/Makefile.am @@ -28,7 +28,8 @@ check_PROGRAMS = t-asmtype t-aors_1 t-divrem_1 t-mod_1 t-fat t-get_d \ t-toom52 t-toom53 t-toom54 t-toom62 t-toom63 t-toom6h t-toom8h \ t-toom2-sqr t-toom3-sqr t-toom4-sqr t-toom6-sqr t-toom8-sqr \ t-mul t-mullo t-mulmod_bnm1 t-sqrmod_bnm1 t-mulmid \ - t-hgcd t-hgcd_appr t-matrix22 t-invert t-div t-bdiv t-broot + t-hgcd t-hgcd_appr t-matrix22 t-invert t-div t-bdiv \ + t-broot t-brootinv EXTRA_DIST = toom-shared.h toom-sqr-shared.h diff --git a/tests/mpn/t-brootinv.c b/tests/mpn/t-brootinv.c new file mode 100644 index 000000000..7fec9e0dd --- /dev/null +++ b/tests/mpn/t-brootinv.c @@ -0,0 +1,104 @@ +/* Copyright 2012 Free Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see http://www.gnu.org/licenses/. */ + + +#include <stdlib.h> /* for strtol */ +#include <stdio.h> /* for printf */ + +#include "gmp.h" +#include "gmp-impl.h" +#include "longlong.h" +#include "tests/tests.h" + +#define MAX_LIMBS 150 +#define COUNT 500 + +int +main (int argc, char **argv) +{ + gmp_randstate_ptr rands; + + mp_ptr ap, rp, pp, app, scratch; + int count = COUNT; + unsigned i; + TMP_DECL; + + TMP_MARK; + + if (argc > 1) + { + char *end; + count = strtol (argv[1], &end, 0); + if (*end || count <= 0) + { + fprintf (stderr, "Invalid test count: %s.\n", argv[1]); + return 1; + } + } + + tests_start (); + rands = RANDS; + + ap = TMP_ALLOC_LIMBS (MAX_LIMBS); + rp = TMP_ALLOC_LIMBS (MAX_LIMBS); + pp = TMP_ALLOC_LIMBS (MAX_LIMBS); + app = TMP_ALLOC_LIMBS (MAX_LIMBS); + scratch = TMP_ALLOC_LIMBS (5*MAX_LIMBS); + + for (i = 0; i < count; i++) + { + mp_size_t n; + mp_limb_t k; + int c; + + n = 1 + gmp_urandomm_ui (rands, MAX_LIMBS); + + if (i & 1) + mpn_random2 (ap, n); + else + mpn_random (ap, n); + + ap[0] |= 1; + + if (i < 100) + k = 3 + 2*i; + else + { + mpn_random (&k, 1); + if (k < 3) + k = 3; + else + k |= 1; + } + mpn_brootinv (rp, ap, n * GMP_NUMB_BITS, k, scratch); + mpn_powlo (pp, rp, &k, 1, n, scratch); + mpn_mullo_n (app, ap, pp, n); + + if (app[0] != 1 || !mpn_zero_p (app+1, n-1)) + { + gmp_fprintf (stderr, + "mpn_brootinv returned bad result: %u limbs\n", + (unsigned) n); + gmp_fprintf (stderr, "k = %Mx\n", k); + gmp_fprintf (stderr, "a = %Nx\n", ap, n); + gmp_fprintf (stderr, "r = %Nx\n", rp, n); + gmp_fprintf (stderr, "r^n = %Nx\n", pp, n); + gmp_fprintf (stderr, "a r^n = %Nx\n", app, n); + abort (); + } + } + TMP_FREE; + tests_end (); + return 0; +} |