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

数学计算

开发平台:

Unix_Linux

  1. /* test mpz_divisible_p and mpz_divisible_ui_p
  2. Copyright 2001, 2009 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. void
  20. check_one (mpz_srcptr a, mpz_srcptr d, int want)
  21. {
  22.   int   got;
  23.   if (mpz_fits_ulong_p (d))
  24.     {
  25.       unsigned long  u = mpz_get_ui (d);
  26.       got = (mpz_divisible_ui_p (a, u) != 0);
  27.       if (want != got)
  28.         {
  29.           printf ("mpz_divisible_ui_p wrongn");
  30.           printf ("   expected %d got %dn", want, got);
  31.           mpz_trace ("   a", a);
  32.           printf ("   d=%lun", u);
  33.           mp_trace_base = -16;
  34.           mpz_trace ("   a", a);
  35.           printf ("   d=0x%lXn", u);
  36.           abort ();
  37.         }
  38.     }
  39.   got = (mpz_divisible_p (a, d) != 0);
  40.   if (want != got)
  41.     {
  42.       printf ("mpz_divisible_p wrongn");
  43.       printf ("   expected %d got %dn", want, got);
  44.       mpz_trace ("   a", a);
  45.       mpz_trace ("   d", d);
  46.       mp_trace_base = -16;
  47.       mpz_trace ("   a", a);
  48.       mpz_trace ("   d", d);
  49.       abort ();
  50.     }
  51. }
  52. void
  53. check_data (void)
  54. {
  55.   static const struct {
  56.     const char *a;
  57.     const char *d;
  58.     int        want;
  59.   } data[] = {
  60.     { "0",    "1", 1 },
  61.     { "123",  "1", 1 },
  62.     { "-123", "1", 1 },
  63.     { "0",  "2", 1 },
  64.     { "1",  "2", 0 },
  65.     { "2",  "2", 1 },
  66.     { "-2", "2", 1 },
  67.     { "0x100000000000000000000000000000000", "2", 1 },
  68.     { "0x100000000000000000000000000000001", "2", 0 },
  69.     { "0x3333333333333333", "3", 1 },
  70.     { "0x3333333333333332", "3", 0 },
  71.     { "0x33333333333333333333333333333333", "3", 1 },
  72.     { "0x33333333333333333333333333333332", "3", 0 },
  73.     /* divisor changes from 2 to 1 limb after stripping 2s */
  74.     {          "0x3333333300000000",         "0x180000000",         1 },
  75.     {  "0x33333333333333330000000000000000", "0x18000000000000000", 1 },
  76.     { "0x133333333333333330000000000000000", "0x18000000000000000", 0 },
  77.   };
  78.   mpz_t   a, d;
  79.   int     i;
  80.   mpz_init (a);
  81.   mpz_init (d);
  82.   for (i = 0; i < numberof (data); i++)
  83.     {
  84.       mpz_set_str_or_abort (a, data[i].a, 0);
  85.       mpz_set_str_or_abort (d, data[i].d, 0);
  86.       check_one (a, d, data[i].want);
  87.     }
  88.   mpz_clear (a);
  89.   mpz_clear (d);
  90. }
  91. void
  92. check_random (int reps)
  93. {
  94.   gmp_randstate_ptr rands = RANDS;
  95.   mpz_t   a, d, r;
  96.   int     i;
  97.   int     want;
  98.   mpz_init (a);
  99.   mpz_init (d);
  100.   mpz_init (r);
  101.   for (i = 0; i < reps; i++)
  102.     {
  103.       mpz_erandomb (a, rands, 1 << 19);
  104.       mpz_erandomb_nonzero (d, rands, 1 << 18);
  105.       mpz_fdiv_r (r, a, d);
  106.       want = (mpz_sgn (r) == 0);
  107.       check_one (a, d, want);
  108.       mpz_sub (a, a, r);
  109.       check_one (a, d, 1);
  110.       if (mpz_cmpabs_ui (d, 1L) == 0)
  111.         continue;
  112.       mpz_add_ui (a, a, 1L);
  113.       check_one (a, d, 0);
  114.     }
  115.   mpz_clear (a);
  116.   mpz_clear (d);
  117.   mpz_clear (r);
  118. }
  119. int
  120. main (int argc, char *argv[])
  121. {
  122.   int  reps = 100;
  123.   tests_start ();
  124.   if (argc == 2)
  125.     reps = atoi (argv[1]);
  126.   check_data ();
  127.   check_random (reps);
  128.   tests_end ();
  129.   exit (0);
  130. }