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