dive.c revision 1.1.1.1.2.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.1.1.2.1 yamt This file is part of the GNU MP Library test suite.
6 1.1 mrg
7 1.1.1.1.2.1 yamt The GNU MP Library test suite is free software; you can redistribute it
8 1.1.1.1.2.1 yamt and/or modify it under the terms of the GNU General Public License as
9 1.1.1.1.2.1 yamt published by the Free Software Foundation; either version 3 of the License,
10 1.1.1.1.2.1 yamt or (at your option) any later version.
11 1.1.1.1.2.1 yamt
12 1.1.1.1.2.1 yamt The GNU MP Library test suite is distributed in the hope that it will be
13 1.1.1.1.2.1 yamt useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1.1.1.2.1 yamt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 1.1.1.1.2.1 yamt Public License for more details.
16 1.1 mrg
17 1.1.1.1.2.1 yamt You should have received a copy of the GNU General Public License along with
18 1.1.1.1.2.1 yamt the GNU MP Library test suite. 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