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

数学计算

开发平台:

Unix_Linux

  1. /* test mpz_congruent_p and mpz_congruent_ui_p
  2. Copyright 2001, 2002 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 c, mpz_srcptr d, int want)
  21. {
  22.   int   got;
  23.   int   swap;
  24.   for (swap = 0; swap <= 1; swap++)
  25.     {
  26.       got = (mpz_congruent_p (a, c, d) != 0);
  27.       if (want != got)
  28.         {
  29.           printf ("mpz_congruent_p wrongn");
  30.           printf ("   expected %d got %dn", want, got);
  31.           mpz_trace ("   a", a);
  32.           mpz_trace ("   c", c);
  33.           mpz_trace ("   d", d);
  34.           mp_trace_base = -16;
  35.           mpz_trace ("   a", a);
  36.           mpz_trace ("   c", c);
  37.           mpz_trace ("   d", d);
  38.           abort ();
  39.         }
  40.       if (mpz_fits_ulong_p (c) && mpz_fits_ulong_p (d))
  41.         {
  42.           unsigned long  uc = mpz_get_ui (c);
  43.           unsigned long  ud = mpz_get_ui (d);
  44.           got = (mpz_congruent_ui_p (a, uc, ud) != 0);
  45.           if (want != got)
  46.             {
  47.               printf    ("mpz_congruent_ui_p wrongn");
  48.               printf    ("   expected %d got %dn", want, got);
  49.               mpz_trace ("   a", a);
  50.               printf    ("   c=%lun", uc);
  51.               printf    ("   d=%lun", ud);
  52.               mp_trace_base = -16;
  53.               mpz_trace ("   a", a);
  54.               printf    ("   c=0x%lXn", uc);
  55.               printf    ("   d=0x%lXn", ud);
  56.               abort ();
  57.             }
  58.         }
  59.       MPZ_SRCPTR_SWAP (a, c);
  60.     }
  61. }
  62. void
  63. check_data (void)
  64. {
  65.   static const struct {
  66.     const char *a;
  67.     const char *c;
  68.     const char *d;
  69.     int        want;
  70.   } data[] = {
  71.     /* anything congruent mod 1 */
  72.     { "0", "0", "1", 1 },
  73.     { "1", "0", "1", 1 },
  74.     { "0", "1", "1", 1 },
  75.     { "123", "456", "1", 1 },
  76.     { "0x123456789123456789", "0x987654321987654321", "1", 1 },
  77.     /* csize==1, dsize==2 changing to 1 after stripping 2s */
  78.     { "0x3333333333333333",  "0x33333333",
  79.       "0x180000000", 1 },
  80.     { "0x33333333333333333333333333333333", "0x3333333333333333",
  81.       "0x18000000000000000", 1 },
  82.     /* another dsize==2 becoming 1, with opposite signs this time */
  83.     {  "0x444444441",
  84.       "-0x22222221F",
  85.        "0x333333330", 1 },
  86.     {  "0x44444444444444441",
  87.       "-0x2222222222222221F",
  88.        "0x33333333333333330", 1 },
  89.   };
  90.   mpz_t   a, c, d;
  91.   int     i;
  92.   mpz_init (a);
  93.   mpz_init (c);
  94.   mpz_init (d);
  95.   for (i = 0; i < numberof (data); i++)
  96.     {
  97.       mpz_set_str_or_abort (a, data[i].a, 0);
  98.       mpz_set_str_or_abort (c, data[i].c, 0);
  99.       mpz_set_str_or_abort (d, data[i].d, 0);
  100.       check_one (a, c, d, data[i].want);
  101.     }
  102.   mpz_clear (a);
  103.   mpz_clear (c);
  104.   mpz_clear (d);
  105. }
  106. void
  107. check_random (int argc, char *argv[])
  108. {
  109.   gmp_randstate_ptr rands = RANDS;
  110.   mpz_t   a, c, d, ra, rc;
  111.   int     i;
  112.   int     want;
  113.   int     reps = 50000;
  114.   if (argc >= 2)
  115.     reps = atoi (argv[1]);
  116.   mpz_init (a);
  117.   mpz_init (c);
  118.   mpz_init (d);
  119.   mpz_init (ra);
  120.   mpz_init (rc);
  121.   for (i = 0; i < reps; i++)
  122.     {
  123.       mpz_errandomb (a, rands, 8*GMP_LIMB_BITS);
  124.       MPZ_CHECK_FORMAT (a);
  125.       mpz_errandomb (c, rands, 8*GMP_LIMB_BITS);
  126.       MPZ_CHECK_FORMAT (c);
  127.       mpz_errandomb_nonzero (d, rands, 8*GMP_LIMB_BITS);
  128.       mpz_negrandom (a, rands);
  129.       MPZ_CHECK_FORMAT (a);
  130.       mpz_negrandom (c, rands);
  131.       MPZ_CHECK_FORMAT (c);
  132.       mpz_negrandom (d, rands);
  133.       mpz_fdiv_r (ra, a, d);
  134.       mpz_fdiv_r (rc, c, d);
  135.       want = (mpz_cmp (ra, rc) == 0);
  136.       check_one (a, c, d, want);
  137.       mpz_sub (ra, ra, rc);
  138.       mpz_sub (a, a, ra);
  139.       MPZ_CHECK_FORMAT (a);
  140.       check_one (a, c, d, 1);
  141.       if (! mpz_pow2abs_p (d))
  142.         {
  143.           refmpz_combit (a, urandom() % (8*GMP_LIMB_BITS));
  144.           check_one (a, c, d, 0);
  145.         }
  146.     }
  147.   mpz_clear (a);
  148.   mpz_clear (c);
  149.   mpz_clear (d);
  150.   mpz_clear (ra);
  151.   mpz_clear (rc);
  152. }
  153. int
  154. main (int argc, char *argv[])
  155. {
  156.   tests_start ();
  157.   check_data ();
  158.   check_random (argc, argv);
  159.   tests_end ();
  160.   exit (0);
  161. }