divrem.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:3k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /*
  2. Copyright 1996, 1997, 1998, 2000, 2001, 2007, 2009 Free Software Foundation,
  3. Inc.
  4. This file is part of the GNU MP Library.
  5. The GNU MP Library is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU Lesser General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or (at your
  8. option) any later version.
  9. The GNU MP Library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. License for more details.
  13. You should have received a copy of the GNU Lesser General Public License
  14. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include "gmp.h"
  18. #include "gmp-impl.h"
  19. #if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux)
  20. #include <time.h>
  21. int
  22. cputime ()
  23. {
  24.   if (CLOCKS_PER_SEC < 100000)
  25.     return clock () * 1000 / CLOCKS_PER_SEC;
  26.   return clock () / (CLOCKS_PER_SEC / 1000);
  27. }
  28. #else
  29. #include <sys/types.h>
  30. #include <sys/time.h>
  31. #include <sys/resource.h>
  32. int
  33. cputime ()
  34. {
  35.   struct rusage rus;
  36.   getrusage (0, &rus);
  37.   return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
  38. }
  39. #endif
  40. #define M * 1000000
  41. #ifndef CLOCK
  42. #error "Don't know CLOCK of your machine"
  43. #endif
  44. #ifndef OPS
  45. #define OPS 20000000
  46. #endif
  47. #ifndef SIZE
  48. #define SIZE 100
  49. #endif
  50. #ifndef TIMES
  51. #define TIMES OPS/(SIZE+1)
  52. #endif
  53. int
  54. main ()
  55. {
  56.   mp_limb_t nptr[2 * SIZE];
  57.   mp_limb_t dptr[2 * SIZE];
  58.   mp_limb_t qptr[2 * SIZE];
  59.   mp_limb_t pptr[2 * SIZE + 1];
  60.   mp_limb_t rptr[2 * SIZE];
  61.   mp_size_t nsize, dsize, qsize, rsize, psize;
  62.   int test;
  63.   mp_limb_t qlimb;
  64.   for (test = 0; ; test++)
  65.     {
  66.       printf ("%dn", test);
  67. #ifdef RANDOM
  68.       nsize = random () % (2 * SIZE) + 1;
  69.       dsize = random () % nsize + 1;
  70. #else
  71.       nsize = 2 * SIZE;
  72.       dsize = SIZE;
  73. #endif
  74.       mpn_random2 (nptr, nsize);
  75.       mpn_random2 (dptr, dsize);
  76.       dptr[dsize - 1] |= (mp_limb_t) 1 << (GMP_LIMB_BITS - 1);
  77.       MPN_COPY (rptr, nptr, nsize);
  78.       qlimb = mpn_divrem (qptr, (mp_size_t) 0, rptr, nsize, dptr, dsize);
  79.       rsize = dsize;
  80.       qsize = nsize - dsize;
  81.       qptr[qsize] = qlimb;
  82.       qsize += qlimb;
  83.       if (qsize == 0 || qsize > 2 * SIZE)
  84. {
  85.   continue; /* bogus */
  86. }
  87.       else
  88. {
  89.   mp_limb_t cy;
  90.   if (qsize > dsize)
  91.     mpn_mul (pptr, qptr, qsize, dptr, dsize);
  92.   else
  93.     mpn_mul (pptr, dptr, dsize, qptr, qsize);
  94.   psize = qsize + dsize;
  95.   psize -= pptr[psize - 1] == 0;
  96.   cy = mpn_add (pptr, pptr, psize, rptr, rsize);
  97.   pptr[psize] = cy;
  98.   psize += cy;
  99. }
  100.       if (nsize != psize || mpn_cmp (nptr, pptr, nsize) != 0)
  101. abort ();
  102.     }
  103. }