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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_com, mpz_and, mpz_ior, and mpz_xor.
  2. Copyright 1993, 1994, 1996, 1997, 2001 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 dump_abort __GMP_PROTO (());
  20. void debug_mp __GMP_PROTO ((mpz_t, int));
  21. int
  22. main (int argc, char **argv)
  23. {
  24.   mpz_t x, y, r1, r2;
  25.   mpz_t t1, t2, t3;
  26.   mp_size_t xsize, ysize;
  27.   int i;
  28.   int reps = 100000;
  29.   gmp_randstate_ptr rands;
  30.   mpz_t bs;
  31.   unsigned long bsi, size_range;
  32.   tests_start ();
  33.   rands = RANDS;
  34.   mpz_init (bs);
  35.   if (argc == 2)
  36.      reps = atoi (argv[1]);
  37.   mpz_init (x);
  38.   mpz_init (y);
  39.   mpz_init (r1);
  40.   mpz_init (r2);
  41.   mpz_init (t1);
  42.   mpz_init (t2);
  43.   mpz_init (t3);
  44.   for (i = 0; i < reps; i++)
  45.     {
  46.       mpz_urandomb (bs, rands, 32);
  47.       size_range = mpz_get_ui (bs) % 8 + 2;
  48.       mpz_urandomb (bs, rands, size_range);
  49.       xsize = mpz_get_ui (bs);
  50.       mpz_rrandomb (x, rands, xsize);
  51.       mpz_urandomb (bs, rands, 1);
  52.       bsi = mpz_get_ui (bs);
  53.       if ((bsi & 1) != 0)
  54. mpz_neg (x, x);
  55.       mpz_urandomb (bs, rands, size_range);
  56.       ysize = mpz_get_ui (bs);
  57.       mpz_rrandomb (y, rands, ysize);
  58.       mpz_urandomb (bs, rands, 1);
  59.       bsi = mpz_get_ui (bs);
  60.       if ((bsi & 1) != 0)
  61. mpz_neg (y, y);
  62.       mpz_com (r1, x);
  63.       MPZ_CHECK_FORMAT (r1);
  64.       mpz_com (r1, r1);
  65.       MPZ_CHECK_FORMAT (r1);
  66.       if (mpz_cmp (r1, x) != 0)
  67. dump_abort ();
  68.       mpz_com (r1, y);
  69.       MPZ_CHECK_FORMAT (r1);
  70.       mpz_com (r2, r1);
  71.       MPZ_CHECK_FORMAT (r2);
  72.       if (mpz_cmp (r2, y) != 0)
  73. dump_abort ();
  74.       mpz_com (t1, x);
  75.       MPZ_CHECK_FORMAT (t1);
  76.       mpz_com (t2, y);
  77.       MPZ_CHECK_FORMAT (t2);
  78.       mpz_and (t3, t1, t2);
  79.       MPZ_CHECK_FORMAT (t3);
  80.       mpz_com (r1, t3);
  81.       MPZ_CHECK_FORMAT (r1);
  82.       mpz_ior (r2, x, y);
  83.       MPZ_CHECK_FORMAT (r2);
  84.       if (mpz_cmp (r1, r2) != 0)
  85. dump_abort ();
  86.       mpz_com (t1, x);
  87.       MPZ_CHECK_FORMAT (t1);
  88.       mpz_com (t2, y);
  89.       MPZ_CHECK_FORMAT (t2);
  90.       mpz_ior (t3, t1, t2);
  91.       MPZ_CHECK_FORMAT (t3);
  92.       mpz_com (r1, t3);
  93.       MPZ_CHECK_FORMAT (r1);
  94.       mpz_and (r2, x, y);
  95.       MPZ_CHECK_FORMAT (r2);
  96.       if (mpz_cmp (r1, r2) != 0)
  97. dump_abort ();
  98.       mpz_ior (t1, x, y);
  99.       MPZ_CHECK_FORMAT (t1);
  100.       mpz_and (t2, x, y);
  101.       MPZ_CHECK_FORMAT (t2);
  102.       mpz_com (t3, t2);
  103.       MPZ_CHECK_FORMAT (t3);
  104.       mpz_and (r1, t1, t3);
  105.       MPZ_CHECK_FORMAT (r1);
  106.       mpz_xor (r2, x, y);
  107.       MPZ_CHECK_FORMAT (r2);
  108.       if (mpz_cmp (r1, r2) != 0)
  109. dump_abort ();
  110.     }
  111.   mpz_clear (bs);
  112.   mpz_clear (x);
  113.   mpz_clear (y);
  114.   mpz_clear (r1);
  115.   mpz_clear (r2);
  116.   mpz_clear (t1);
  117.   mpz_clear (t2);
  118.   mpz_clear (t3);
  119.   tests_end ();
  120.   exit (0);
  121. }
  122. void
  123. dump_abort ()
  124. {
  125.   abort();
  126. }
  127. void
  128. debug_mp (mpz_t x, int base)
  129. {
  130.   mpz_out_str (stderr, base, x); fputc ('n', stderr);
  131. }