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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_hamdist.
  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_twobits (void)
  21. {
  22.   unsigned long  i, j, got, want;
  23.   mpz_t  x, y;
  24.   mpz_init (x);
  25.   mpz_init (y);
  26.   for (i = 0; i < 5 * GMP_NUMB_BITS; i++)
  27.     {
  28.       for (j = 0; j < 5 * GMP_NUMB_BITS; j++)
  29.         {
  30.           mpz_set_ui (x, 0L);
  31.           mpz_setbit (x, i);
  32.           mpz_set_ui (y, 0L);
  33.           mpz_setbit (y, j);
  34.           want = 2 * (i != j);
  35.           got = mpz_hamdist (x, y);
  36.           if (got != want)
  37.             {
  38.               printf    ("mpz_hamdist wrong on 2 bits pos/posn");
  39.             wrong:
  40.               printf    ("  i    %lun", i);
  41.               printf    ("  j    %lun", j);
  42.               printf    ("  got  %lun", got);
  43.               printf    ("  want %lun", want);
  44.               mpz_trace ("  x   ", x);
  45.               mpz_trace ("  y   ", y);
  46.               abort();
  47.             }
  48.           mpz_neg (x, x);
  49.           mpz_neg (y, y);
  50.           want = ABS ((long) (i-j));
  51.           got = mpz_hamdist (x, y);
  52.           if (got != want)
  53.             {
  54.               printf    ("mpz_hamdist wrong on 2 bits neg/negn");
  55.               goto wrong;
  56.             }
  57.         }
  58.     }
  59.   mpz_clear (x);
  60.   mpz_clear (y);
  61. }
  62. void
  63. check_rand (void)
  64. {
  65.   gmp_randstate_ptr  rands = RANDS;
  66.   unsigned long  got, want;
  67.   int    i;
  68.   mpz_t  x, y;
  69.   mpz_init (x);
  70.   mpz_init (y);
  71.   for (i = 0; i < 2000; i++)
  72.     {
  73.       mpz_erandomb (x, rands, 6 * GMP_NUMB_BITS);
  74.       mpz_negrandom (x, rands);
  75.       mpz_mul_2exp (x, x, urandom() % (4 * GMP_NUMB_BITS));
  76.       mpz_erandomb (y, rands, 6 * GMP_NUMB_BITS);
  77.       mpz_negrandom (y, rands);
  78.       mpz_mul_2exp (y, y, urandom() % (4 * GMP_NUMB_BITS));
  79.       want = refmpz_hamdist (x, y);
  80.       got = mpz_hamdist (x, y);
  81.       if (got != want)
  82.         {
  83.           printf    ("mpz_hamdist wrong on randomn");
  84.           printf    ("  got  %lun", got);
  85.           printf    ("  want %lun", want);
  86.           mpz_trace ("  x   ", x);
  87.           mpz_trace ("  y   ", y);
  88.           abort();
  89.         }
  90.     }
  91.   mpz_clear (x);
  92.   mpz_clear (y);
  93. }
  94. int
  95. main (void)
  96. {
  97.   tests_start ();
  98.   mp_trace_base = -16;
  99.   check_twobits ();
  100.   check_rand ();
  101.   tests_end ();
  102.   exit (0);
  103. }