Annotation of OpenXM_contrib/gmp/tests/mpz/bit.c, Revision 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>