1/* Test mpz_hamdist.
2
3Copyright 2001, 2002 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library.
6
7The GNU MP Library is free software; you can redistribute it and/or modify
8it under the terms of the GNU Lesser General Public License as published by
9the Free Software Foundation; either version 3 of the License, or (at your
10option) any later version.
11
12The GNU MP Library is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15License for more details.
16
17You should have received a copy of the GNU Lesser General Public License
18along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
19
20#include <stdio.h>
21#include <stdlib.h>
22#include "gmp.h"
23#include "gmp-impl.h"
24#include "tests.h"
25
26
27void
28check_twobits (void)
29{
30  unsigned long  i, j, got, want;
31  mpz_t  x, y;
32
33  mpz_init (x);
34  mpz_init (y);
35  for (i = 0; i < 5 * GMP_NUMB_BITS; i++)
36    {
37      for (j = 0; j < 5 * GMP_NUMB_BITS; j++)
38        {
39          mpz_set_ui (x, 0L);
40          mpz_setbit (x, i);
41          mpz_set_ui (y, 0L);
42          mpz_setbit (y, j);
43
44          want = 2 * (i != j);
45          got = mpz_hamdist (x, y);
46          if (got != want)
47            {
48              printf    ("mpz_hamdist wrong on 2 bits pos/pos\n");
49            wrong:
50              printf    ("  i    %lu\n", i);
51              printf    ("  j    %lu\n", j);
52              printf    ("  got  %lu\n", got);
53              printf    ("  want %lu\n", want);
54              mpz_trace ("  x   ", x);
55              mpz_trace ("  y   ", y);
56              abort();
57            }
58
59          mpz_neg (x, x);
60          mpz_neg (y, y);
61          want = ABS ((long) (i-j));
62          got = mpz_hamdist (x, y);
63          if (got != want)
64            {
65              printf    ("mpz_hamdist wrong on 2 bits neg/neg\n");
66              goto wrong;
67            }
68        }
69
70    }
71  mpz_clear (x);
72  mpz_clear (y);
73}
74
75
76void
77check_rand (void)
78{
79  gmp_randstate_ptr  rands = RANDS;
80  unsigned long  got, want;
81  int    i;
82  mpz_t  x, y;
83
84  mpz_init (x);
85  mpz_init (y);
86
87  for (i = 0; i < 2000; i++)
88    {
89      mpz_erandomb (x, rands, 6 * GMP_NUMB_BITS);
90      mpz_negrandom (x, rands);
91      mpz_mul_2exp (x, x, urandom() % (4 * GMP_NUMB_BITS));
92
93      mpz_erandomb (y, rands, 6 * GMP_NUMB_BITS);
94      mpz_negrandom (y, rands);
95      mpz_mul_2exp (y, y, urandom() % (4 * GMP_NUMB_BITS));
96
97      want = refmpz_hamdist (x, y);
98      got = mpz_hamdist (x, y);
99      if (got != want)
100        {
101          printf    ("mpz_hamdist wrong on random\n");
102          printf    ("  got  %lu\n", got);
103          printf    ("  want %lu\n", want);
104          mpz_trace ("  x   ", x);
105          mpz_trace ("  y   ", y);
106          abort();
107        }
108    }
109  mpz_clear (x);
110  mpz_clear (y);
111}
112
113int
114main (void)
115{
116  tests_start ();
117  mp_trace_base = -16;
118
119  check_twobits ();
120  check_rand ();
121
122  tests_end ();
123  exit (0);
124}
125