Annotation of OpenXM_contrib/gmp/tests/mpz/bit.c, Revision 1.1.1.1
1.1 ohara 1: /* Test mpz_setbit, mpz_clrbit, mpz_tstbit.
2:
3: Copyright 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
4:
5: This file is part of the GNU MP Library.
6:
7: The GNU MP Library is free software; you can redistribute it and/or modify
8: it under the terms of the GNU Lesser General Public License as published by
9: the Free Software Foundation; either version 2.1 of the License, or (at your
10: option) any later version.
11:
12: The GNU MP Library is distributed in the hope that it will be useful, but
13: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15: License for more details.
16:
17: You should have received a copy of the GNU Lesser General Public License
18: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #include <stdio.h>
23: #include <stdlib.h>
24:
25: #include "gmp.h"
26: #include "gmp-impl.h"
27: #include "tests.h"
28:
29: #ifndef SIZE
30: #define SIZE 4
31: #endif
32:
33:
34: void
35: debug_mp (mpz_srcptr x, int base)
36: {
37: mpz_out_str (stdout, base, x); fputc ('\n', stdout);
38: }
39:
40:
41: /* See that mpz_tstbit matches a twos complement calculated explicitly, for
42: various low zeros. */
43: void
44: check_tstbit (void)
45: {
46: #define MAX_ZEROS 3
47: #define NUM_LIMBS 3
48:
49: mp_limb_t pos[1+NUM_LIMBS+MAX_ZEROS];
50: mp_limb_t neg[1+NUM_LIMBS+MAX_ZEROS];
51: mpz_t z;
52: unsigned long i;
53: int zeros, low1;
54: int got, want;
55:
56: mpz_init (z);
57: for (zeros = 0; zeros <= MAX_ZEROS; zeros++)
58: {
59: MPN_ZERO (pos, numberof(pos));
60: mpn_random2 (pos+zeros, NUM_LIMBS);
61:
62: for (low1 = 0; low1 <= 1; low1++)
63: {
64: if (low1)
65: pos[0] |= 1;
66:
67: refmpn_neg_n (neg, pos, numberof(neg));
68: mpz_set_n (z, neg, numberof(neg));
69: mpz_neg (z, z);
70:
71: for (i = 0; i < numberof(pos)*GMP_NUMB_BITS; i++)
72: {
73: got = mpz_tstbit (z, i);
74: want = refmpn_tstbit (pos, i);
75: if (got != want)
76: {
77: printf ("wrong at bit %lu, with %d zeros\n", i, zeros);
78: printf ("z neg "); debug_mp (z, -16);
79: mpz_set_n (z, pos, numberof(pos));
80: printf ("pos "); debug_mp (z, -16);
81: mpz_set_n (z, neg, numberof(neg));
82: printf ("neg "); debug_mp (z, -16);
83: exit (1);
84: }
85: }
86: }
87: }
88: mpz_clear (z);
89: }
90:
91:
92: void
93: check_single (void)
94: {
95: mpz_t x;
96: int limb, offset, initial;
97: unsigned long bit;
98:
99: mpz_init (x);
100:
101: for (limb = 0; limb < 4; limb++)
102: {
103: for (offset = (limb==0 ? 0 : -2); offset <= 2; offset++)
104: {
105: for (initial = 0; initial >= -1; initial--)
106: {
107: mpz_set_si (x, (long) initial);
108:
109: bit = (unsigned long) limb*BITS_PER_MP_LIMB + offset;
110:
111: mpz_clrbit (x, bit);
112: MPZ_CHECK_FORMAT (x);
113: if (mpz_tstbit (x, bit) != 0)
114: {
115: printf ("check_single(): expected 0\n");
116: abort ();
117: }
118:
119: mpz_setbit (x, bit);
120: MPZ_CHECK_FORMAT (x);
121: if (mpz_tstbit (x, bit) != 1)
122: {
123: printf ("check_single(): expected 0\n");
124: abort ();
125: }
126:
127: mpz_clrbit (x, bit);
128: MPZ_CHECK_FORMAT (x);
129: if (mpz_tstbit (x, bit) != 0)
130: {
131: printf ("check_single(): expected 0\n");
132: abort ();
133: }
134: }
135: }
136: }
137:
138: mpz_clear (x);
139: }
140:
141:
142: void
143: check_random (int argc, char *argv[])
144: {
145: mpz_t x, s0, s1, s2, s3, m;
146: mp_size_t xsize;
147: int i;
148: int reps = 100000;
149: int bit0, bit1, bit2, bit3;
150: unsigned long int bitindex;
151: const char *s = "";
152:
153: if (argc == 2)
154: reps = atoi (argv[1]);
155:
156: mpz_init (x);
157: mpz_init (s0);
158: mpz_init (s1);
159: mpz_init (s2);
160: mpz_init (s3);
161: mpz_init (m);
162:
163: for (i = 0; i < reps; i++)
164: {
165: xsize = urandom () % (2 * SIZE) - SIZE;
166: mpz_random2 (x, xsize);
167: bitindex = urandom () % SIZE;
168:
169: mpz_set (s0, x);
170: bit0 = mpz_tstbit (x, bitindex);
171: mpz_setbit (x, bitindex);
172: MPZ_CHECK_FORMAT (x);
173:
174: mpz_set (s1, x);
175: bit1 = mpz_tstbit (x, bitindex);
176: mpz_clrbit (x, bitindex);
177: MPZ_CHECK_FORMAT (x);
178:
179: mpz_set (s2, x);
180: bit2 = mpz_tstbit (x, bitindex);
181: mpz_setbit (x, bitindex);
182: MPZ_CHECK_FORMAT (x);
183:
184: mpz_set (s3, x);
185: bit3 = mpz_tstbit (x, bitindex);
186:
187: #define FAIL(str) do { s = str; goto fail; } while (0)
188:
189: if (bit1 != 1) FAIL ("bit1 != 1");
190: if (bit2 != 0) FAIL ("bit2 != 0");
191: if (bit3 != 1) FAIL ("bit3 != 1");
192:
193: if (bit0 == 0)
194: {
195: if (mpz_cmp (s0, s1) == 0 || mpz_cmp (s0, s2) != 0 || mpz_cmp (s0, s3) == 0)
196: abort ();
197: }
198: else
199: {
200: if (mpz_cmp (s0, s1) != 0 || mpz_cmp (s0, s2) == 0 || mpz_cmp (s0, s3) != 0)
201: abort ();
202: }
203:
204: if (mpz_cmp (s1, s2) == 0 || mpz_cmp (s1, s3) != 0)
205: abort ();
206: if (mpz_cmp (s2, s3) == 0)
207: abort ();
208:
209: mpz_ui_pow_ui (m, 2L, bitindex);
210: MPZ_CHECK_FORMAT (m);
211: mpz_ior (x, s2, m);
212: MPZ_CHECK_FORMAT (x);
213: if (mpz_cmp (x, s3) != 0)
214: abort ();
215:
216: mpz_com (m, m);
217: MPZ_CHECK_FORMAT (m);
218: mpz_and (x, s1, m);
219: MPZ_CHECK_FORMAT (x);
220: if (mpz_cmp (x, s2) != 0)
221: abort ();
222: }
223:
224: mpz_clear (x);
225: mpz_clear (s0);
226: mpz_clear (s1);
227: mpz_clear (s2);
228: mpz_clear (s3);
229: mpz_clear (m);
230: return;
231:
232:
233: fail:
234: printf ("%s\n", s);
235: printf ("bitindex = %lu\n", bitindex);
236: printf ("x = "); mpz_out_str (stdout, -16, x); printf (" hex\n");
237: exit (1);
238: }
239:
240:
241:
242: int
243: main (int argc, char *argv[])
244: {
245: tests_start ();
246:
247: check_tstbit ();
248: check_random (argc, argv);
249: check_single ();
250:
251: tests_end ();
252: exit (0);
253: }
254:
255:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>