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