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

数学计算

开发平台:

Unix_Linux

  1. /* test mpz_divisible_2exp_p */
  2. /*
  3. Copyright 2001 Free Software Foundation, 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. #include "tests.h"
  20. void
  21. check_one (mpz_srcptr a, unsigned long d, int want)
  22. {
  23.   int   got;
  24.   got = (mpz_divisible_2exp_p (a, d) != 0);
  25.   if (want != got)
  26.     {
  27.       printf ("mpz_divisible_2exp_p wrongn");
  28.       printf ("   expected %d got %dn", want, got);
  29.       mpz_trace ("   a", a);
  30.       printf    ("   d=%lun", d);
  31.       mp_trace_base = -16;
  32.       mpz_trace ("   a", a);
  33.       printf    ("   d=0x%lXn", d);
  34.       abort ();
  35.     }
  36. }
  37. void
  38. check_data (void)
  39. {
  40.   static const struct {
  41.     const char    *a;
  42.     unsigned long d;
  43.     int           want;
  44.   } data[] = {
  45.     { "0", 0, 1 },
  46.     { "0", 1, 1 },
  47.     { "0", 2, 1 },
  48.     { "0", 3, 1 },
  49.     { "1", 0, 1 },
  50.     { "1", 1, 0 },
  51.     { "1", 2, 0 },
  52.     { "1", 3, 0 },
  53.     { "1", 10000, 0 },
  54.     { "4", 0, 1 },
  55.     { "4", 1, 1 },
  56.     { "4", 2, 1 },
  57.     { "4", 3, 0 },
  58.     { "4", 4, 0 },
  59.     { "4", 10000, 0 },
  60.     { "0x80000000", 31, 1 },
  61.     { "0x80000000", 32, 0 },
  62.     { "0x80000000", 64, 0 },
  63.     { "0x100000000", 32, 1 },
  64.     { "0x100000000", 33, 0 },
  65.     { "0x100000000", 64, 0 },
  66.     { "0x8000000000000000", 63, 1 },
  67.     { "0x8000000000000000", 64, 0 },
  68.     { "0x8000000000000000", 128, 0 },
  69.     { "0x10000000000000000", 64, 1 },
  70.     { "0x10000000000000000", 65, 0 },
  71.     { "0x10000000000000000", 128, 0 },
  72.     { "0x10000000000000000", 256, 0 },
  73.     { "0x10000000000000000100000000", 32, 1 },
  74.     { "0x10000000000000000100000000", 33, 0 },
  75.     { "0x10000000000000000100000000", 64, 0 },
  76.     { "0x1000000000000000010000000000000000", 64, 1 },
  77.     { "0x1000000000000000010000000000000000", 65, 0 },
  78.     { "0x1000000000000000010000000000000000", 128, 0 },
  79.     { "0x1000000000000000010000000000000000", 256, 0 },
  80.     { "0x1000000000000000010000000000000000", 1024, 0 },
  81.   };
  82.   mpz_t   a, d;
  83.   int     i;
  84.   mpz_init (a);
  85.   mpz_init (d);
  86.   for (i = 0; i < numberof (data); i++)
  87.     {
  88.       mpz_set_str_or_abort (a, data[i].a, 0);
  89.       check_one (a, data[i].d, data[i].want);
  90.       mpz_neg (a, a);
  91.       check_one (a, data[i].d, data[i].want);
  92.     }
  93.   mpz_clear (a);
  94.   mpz_clear (d);
  95. }
  96. int
  97. main (int argc, char *argv[])
  98. {
  99.   tests_start ();
  100.   check_data ();
  101.   tests_end ();
  102.   exit (0);
  103. }