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

数学计算

开发平台:

Unix_Linux

  1. /* Tests of mpz_scan0 and mpz_scan1.
  2. Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
  3. This file is part of the GNU MP Library.
  4. The GNU MP Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MP Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include "gmp.h"
  17. #include "gmp-impl.h"
  18. #include "tests.h"
  19. unsigned long
  20. refmpz_scan (mpz_srcptr z, unsigned long i, int sought)
  21. {
  22.   unsigned long  z_bits = (unsigned long) ABSIZ(z) * GMP_NUMB_BITS;
  23.   do
  24.     {
  25.       if (mpz_tstbit (z, i) == sought)
  26.         return i;
  27.       i++;
  28.     }
  29.   while (i <= z_bits);
  30.   return ULONG_MAX;
  31. }
  32. unsigned long
  33. refmpz_scan0 (mpz_srcptr z, unsigned long starting_bit)
  34. {
  35.   return refmpz_scan (z, starting_bit, 0);
  36. }
  37. unsigned long
  38. refmpz_scan1 (mpz_srcptr z, unsigned long starting_bit)
  39. {
  40.   return refmpz_scan (z, starting_bit, 1);
  41. }
  42. void
  43. check_ref (void)
  44. {
  45.   static const int offset[] = {
  46.     -2, -1, 0, 1, 2, 3
  47.   };
  48.   mpz_t          z;
  49.   int            test, neg, sought, oindex, o;
  50.   mp_size_t      size, isize;
  51.   unsigned long  start, got, want;
  52.   mpz_init (z);
  53.   for (test = 0; test < 5; test++)
  54.     {
  55.       for (size = 0; size < 5; size++)
  56.         {
  57.           mpz_random2 (z, size);
  58.           for (neg = 0; neg <= 1; neg++)
  59.             {
  60.               if (neg)
  61.                 mpz_neg (z, z);
  62.               for (isize = 0; isize <= size; isize++)
  63.                 {
  64.                   for (oindex = 0; oindex <= numberof (offset); oindex++)
  65.                     {
  66.                       o = offset[oindex];
  67.                       if ((int) isize*GMP_NUMB_BITS < -o)
  68.                         continue;  /* start would be negative */
  69.                       start = isize*GMP_NUMB_BITS + o;
  70.                       for (sought = 0; sought <= 1; sought++)
  71.                         {
  72.                           if (sought == 0)
  73.                             {
  74.                               got = mpz_scan0 (z, start);
  75.                               want = refmpz_scan0 (z, start);
  76.                             }
  77.                           else
  78.                             {
  79.                               got = mpz_scan1 (z, start);
  80.                               want = refmpz_scan1 (z, start);
  81.                             }
  82.                           if (got != want)
  83.                             {
  84.                               printf ("wrong at test=%d, size=%ld, neg=%d, start=%lu, sought=%dn",
  85.                                       test, size, neg, start, sought);
  86.                               printf ("   z 0x");
  87.                               mpz_out_str (stdout, -16, z);
  88.                               printf ("n");
  89.                               printf ("   got=%lu, want=%lun", got, want);
  90.                               exit (1);
  91.                             }
  92.                         }
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.     }
  98.   mpz_clear (z);
  99. }
  100. int
  101. main (int argc, char *argv[])
  102. {
  103.   tests_start ();
  104.   check_ref ();
  105.   tests_end ();
  106.   exit (0);
  107. }