dive.c revision 1.1 1 1.1 mrg /* Test mpz_mul, mpz_divexact.
2 1.1 mrg
3 1.1 mrg Copyright 1996, 2001, 2002 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of the GNU MP Library.
6 1.1 mrg
7 1.1 mrg The GNU MP Library is free software; you can redistribute it and/or modify
8 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
10 1.1 mrg option) any later version.
11 1.1 mrg
12 1.1 mrg The GNU MP Library is distributed in the hope that it will be useful, but
13 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 1.1 mrg License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU Lesser General Public License
18 1.1 mrg along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
19 1.1 mrg
20 1.1 mrg #include <stdio.h>
21 1.1 mrg #include <stdlib.h>
22 1.1 mrg
23 1.1 mrg #include "gmp.h"
24 1.1 mrg #include "gmp-impl.h"
25 1.1 mrg #include "tests.h"
26 1.1 mrg
27 1.1 mrg int
28 1.1 mrg main (int argc, char **argv)
29 1.1 mrg {
30 1.1 mrg mpz_t op1, op2;
31 1.1 mrg mpz_t prod, quot;
32 1.1 mrg mp_size_t size;
33 1.1 mrg int i;
34 1.1 mrg int reps = 5000;
35 1.1 mrg gmp_randstate_ptr rands;
36 1.1 mrg mpz_t bs;
37 1.1 mrg unsigned long bsi, size_range;
38 1.1 mrg
39 1.1 mrg tests_start ();
40 1.1 mrg TESTS_REPS (reps, argv, argc);
41 1.1 mrg
42 1.1 mrg rands = RANDS;
43 1.1 mrg
44 1.1 mrg mp_trace_base = -16;
45 1.1 mrg
46 1.1 mrg mpz_init (bs);
47 1.1 mrg
48 1.1 mrg mpz_init (op1);
49 1.1 mrg mpz_init (op2);
50 1.1 mrg mpz_init (prod);
51 1.1 mrg mpz_init (quot);
52 1.1 mrg
53 1.1 mrg for (i = 0; i < reps; i++)
54 1.1 mrg {
55 1.1 mrg mpz_urandomb (bs, rands, 32);
56 1.1 mrg size_range = mpz_get_ui (bs) % 17 + 2; /* 0..2047 bit operands */
57 1.1 mrg
58 1.1 mrg mpz_urandomb (bs, rands, size_range);
59 1.1 mrg size = mpz_get_ui (bs);
60 1.1 mrg mpz_rrandomb (op1, rands, size);
61 1.1 mrg
62 1.1 mrg do
63 1.1 mrg {
64 1.1 mrg mpz_urandomb (bs, rands, size_range);
65 1.1 mrg size = mpz_get_ui (bs);
66 1.1 mrg mpz_rrandomb (op2, rands, size);
67 1.1 mrg }
68 1.1 mrg while (mpz_sgn (op2) == 0);
69 1.1 mrg
70 1.1 mrg mpz_urandomb (bs, rands, 2);
71 1.1 mrg bsi = mpz_get_ui (bs);
72 1.1 mrg if ((bsi & 1) != 0)
73 1.1 mrg mpz_neg (op1, op1);
74 1.1 mrg if ((bsi & 2) != 0)
75 1.1 mrg mpz_neg (op2, op2);
76 1.1 mrg
77 1.1 mrg mpz_mul (prod, op1, op2);
78 1.1 mrg
79 1.1 mrg mpz_divexact (quot, prod, op2);
80 1.1 mrg MPZ_CHECK_FORMAT (quot);
81 1.1 mrg
82 1.1 mrg if (mpz_cmp (quot, op1) != 0)
83 1.1 mrg {
84 1.1 mrg printf ("Wrong results:\n");
85 1.1 mrg mpz_trace (" got ", quot);
86 1.1 mrg mpz_trace (" want ", op1);
87 1.1 mrg mpz_trace (" dividend", prod);
88 1.1 mrg mpz_trace (" divisor ", op2);
89 1.1 mrg abort ();
90 1.1 mrg }
91 1.1 mrg }
92 1.1 mrg
93 1.1 mrg mpz_clear (bs);
94 1.1 mrg mpz_clear (op1);
95 1.1 mrg mpz_clear (op2);
96 1.1 mrg mpz_clear (prod);
97 1.1 mrg mpz_clear (quot);
98 1.1 mrg
99 1.1 mrg tests_end ();
100 1.1 mrg exit (0);
101 1.1 mrg }
102