1/* Test mpz_mul, mpz_divexact. 2 3Copyright 1996, 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 23#include "gmp.h" 24#include "gmp-impl.h" 25#include "tests.h" 26 27int 28main (int argc, char **argv) 29{ 30 mpz_t op1, op2; 31 mpz_t prod, quot; 32 mp_size_t size; 33 int i; 34 int reps = 5000; 35 gmp_randstate_ptr rands; 36 mpz_t bs; 37 unsigned long bsi, size_range; 38 39 tests_start (); 40 TESTS_REPS (reps, argv, argc); 41 42 rands = RANDS; 43 44 mp_trace_base = -16; 45 46 mpz_init (bs); 47 48 mpz_init (op1); 49 mpz_init (op2); 50 mpz_init (prod); 51 mpz_init (quot); 52 53 for (i = 0; i < reps; i++) 54 { 55 mpz_urandomb (bs, rands, 32); 56 size_range = mpz_get_ui (bs) % 17 + 2; /* 0..2047 bit operands */ 57 58 mpz_urandomb (bs, rands, size_range); 59 size = mpz_get_ui (bs); 60 mpz_rrandomb (op1, rands, size); 61 62 do 63 { 64 mpz_urandomb (bs, rands, size_range); 65 size = mpz_get_ui (bs); 66 mpz_rrandomb (op2, rands, size); 67 } 68 while (mpz_sgn (op2) == 0); 69 70 mpz_urandomb (bs, rands, 2); 71 bsi = mpz_get_ui (bs); 72 if ((bsi & 1) != 0) 73 mpz_neg (op1, op1); 74 if ((bsi & 2) != 0) 75 mpz_neg (op2, op2); 76 77 mpz_mul (prod, op1, op2); 78 79 mpz_divexact (quot, prod, op2); 80 MPZ_CHECK_FORMAT (quot); 81 82 if (mpz_cmp (quot, op1) != 0) 83 { 84 printf ("Wrong results:\n"); 85 mpz_trace (" got ", quot); 86 mpz_trace (" want ", op1); 87 mpz_trace (" dividend", prod); 88 mpz_trace (" divisor ", op2); 89 abort (); 90 } 91 } 92 93 mpz_clear (bs); 94 mpz_clear (op1); 95 mpz_clear (op2); 96 mpz_clear (prod); 97 mpz_clear (quot); 98 99 tests_end (); 100 exit (0); 101} 102