diff --git a/mpn/generic/invert.c b/mpn/generic/invert.c index 3c73daf5..a9f228f2 100644 --- a/mpn/generic/invert.c +++ b/mpn/generic/invert.c @@ -21,17 +21,6 @@ along with the MPIR Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* #define WRAP_AROUND */ -/* #define WANT_ASSERT 1 */ - -#ifdef WRAP_AROUND -#define INVERT_VERSION 3 -#define WRAP_AROUND_BOUND 1500 -#else -#define INVERT_VERSION 2 -#define WRAP_AROUND_BOUND ~0UL -#endif - #include #include #include @@ -41,19 +30,35 @@ MA 02110-1301, USA. */ #define ZERO (mp_limb_t) 0 #define ONE (mp_limb_t) 1 +#define WRAP_AROUND_BOUND 1500 -void -mpn_print (mp_ptr A, mp_size_t n) +int +test_invert (mp_ptr xp, mp_srcptr ap, mp_size_t n) { - int j; + int res = 1; + mp_size_t i; + mp_ptr tp, up; + mp_limb_t cy; + TMP_DECL; - for (j=0; j -#include - -int -cputime () -{ - struct rusage rus; - - getrusage (0, &rus); - return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000; -} - -int -main (int argc, char *argv[]) -{ - mp_size_t n = atoi (argv[1]), i, j, k; - mp_ptr qp, rp, dp, tp, qp2, rp2; - mp_limb_t cy; - pid_t pid; - int st; - - k = (argc <= 2) ? 1 : atoi(argv[2]); - - qp = malloc (n * sizeof (mp_limb_t)); - qp2 = malloc (n * sizeof (mp_limb_t)); - rp = malloc (n * sizeof (mp_limb_t)); - rp2 = malloc (2 * n * sizeof (mp_limb_t)); - dp = malloc (n * sizeof (mp_limb_t)); - tp = malloc (2 * n * sizeof (mp_limb_t)); - - pid = getpid (); - printf ("Seed=%lu\n", pid); - srand48 (pid); - for (i = 0; i < n; i++) - dp[i] = lrand48 (); - dp[n - 1] |= GMP_NUMB_HIGHBIT; - - mpn_random (rp, n); - st = cputime (); - for (i = 0; i < k; i++) - mpn_mul_n (tp, dp, rp, n); - printf ("mpn_mul_n took %dms\n", cputime () - st); - - st = cputime (); - for (i = 0; i < k; i++) - { -#ifdef CHECK - // printf ("Test %lu\n", i); - for (j = 0; j < n; j++) - dp[j] = lrand48 (); - dp[n - 1] |= GMP_NUMB_HIGHBIT; -#endif - mpn_invert (qp, dp, n); -#ifdef CHECK - if (test_invert (qp, dp, n) == 0) - { - fprintf (stderr, "test_invert failed at i=%lu\n", i); - printf ("A:="); mpn_print (dp, n); - printf ("X:=B^%lu", n); mpn_print (qp, n); - exit (1); - } -#endif - } - printf ("mpn_invert%d took %dms", INVERT_VERSION, cputime () - st); -#ifdef WRAP_AROUND - printf (" (with wrap-around trick, WRAP_AROUND_BOUND=%lu)", - WRAP_AROUND_BOUND); -#endif - printf ("\n"); - - // printf ("xp="); mpn_print (qp, n); - - MPN_ZERO (rp2, 2 * n); - rp2[2 * n - 1] = GMP_LIMB_HIGHBIT; - st = cputime (); - for (i = 0; i < k; i++) - { - MPN_ZERO (rp2, 2 * n); - rp2[2 * n - 1] = GMP_LIMB_HIGHBIT; - mpn_divrem (qp2, 0, rp2, 2 * n, dp, n); - } - printf ("mpn_divrem took %dms\n", cputime () - st); - - free (qp); - free (rp); - free (dp); - free (tp); - - return 0; -} -#endif