t-mfac_uiui.c revision 1.1.1.3 1 1.1 mrg /* Exercise mpz_mfac_uiui.
2 1.1 mrg
3 1.1.1.2 mrg Copyright 2000-2002, 2012 Free Software Foundation, Inc.
4 1.1 mrg
5 1.1 mrg This file is part of the GNU MP Library test suite.
6 1.1 mrg
7 1.1 mrg The GNU MP Library test suite is free software; you can redistribute it
8 1.1 mrg and/or modify it under the terms of the GNU General Public License as
9 1.1 mrg published by the Free Software Foundation; either version 3 of the License,
10 1.1 mrg or (at your option) any later version.
11 1.1 mrg
12 1.1 mrg The GNU MP Library test suite is distributed in the hope that it will be
13 1.1 mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 1.1 mrg Public License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License along with
18 1.1.1.2 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 #include "gmp-impl.h"
23 1.1 mrg #include "tests.h"
24 1.1 mrg
25 1.1 mrg
26 1.1 mrg /* Usage: t-mfac_uiui [x|num]
27 1.1 mrg
28 1.1 mrg With no arguments testing goes up to the initial value of "limit" below.
29 1.1 mrg With a number argument tests are carried that far, or with a literal "x"
30 1.1 mrg tests are continued without limit (this being meant only for development
31 1.1 mrg purposes). */
32 1.1 mrg
33 1.1 mrg #define MULTIFAC_WHEEL (2*3*11)
34 1.1 mrg #define MULTIFAC_WHEEL2 (5*13)
35 1.1 mrg
36 1.1 mrg int
37 1.1 mrg main (int argc, char *argv[])
38 1.1 mrg {
39 1.1 mrg mpz_t ref[MULTIFAC_WHEEL], ref2[MULTIFAC_WHEEL2], res;
40 1.1 mrg unsigned long n, j, m, m2;
41 1.1 mrg unsigned long limit = 2222, step = 1;
42 1.1 mrg
43 1.1 mrg tests_start ();
44 1.1 mrg
45 1.1 mrg if (argc > 1 && argv[1][0] == 'x')
46 1.1 mrg limit = ULONG_MAX;
47 1.1.1.3 mrg else
48 1.1.1.3 mrg TESTS_REPS (limit, argv, argc);
49 1.1 mrg
50 1.1 mrg /* for small limb testing */
51 1.1 mrg limit = MIN (limit, MP_LIMB_T_MAX);
52 1.1 mrg
53 1.1 mrg for (m = 0; m < MULTIFAC_WHEEL; m++)
54 1.1 mrg mpz_init_set_ui(ref [m],1);
55 1.1 mrg for (m2 = 0; m2 < MULTIFAC_WHEEL2; m2++)
56 1.1 mrg mpz_init_set_ui(ref2 [m2],1);
57 1.1 mrg
58 1.1 mrg mpz_init (res);
59 1.1 mrg
60 1.1 mrg m = 0;
61 1.1 mrg m2 = 0;
62 1.1 mrg for (n = 0; n <= limit;)
63 1.1 mrg {
64 1.1 mrg mpz_mfac_uiui (res, n, MULTIFAC_WHEEL);
65 1.1 mrg MPZ_CHECK_FORMAT (res);
66 1.1 mrg if (mpz_cmp (ref[m], res) != 0)
67 1.1 mrg {
68 1.1 mrg printf ("mpz_mfac_uiui(%lu,%d) wrong\n", n, MULTIFAC_WHEEL);
69 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, res); printf("\n");
70 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, ref[m]); printf("\n");
71 1.1 mrg abort ();
72 1.1 mrg }
73 1.1 mrg mpz_mfac_uiui (res, n, MULTIFAC_WHEEL2);
74 1.1 mrg MPZ_CHECK_FORMAT (res);
75 1.1 mrg if (mpz_cmp (ref2[m2], res) != 0)
76 1.1 mrg {
77 1.1 mrg printf ("mpz_mfac_uiui(%lu,%d) wrong\n", n, MULTIFAC_WHEEL2);
78 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, res); printf("\n");
79 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, ref2[m2]); printf("\n");
80 1.1 mrg abort ();
81 1.1 mrg }
82 1.1 mrg if (n + step <= limit)
83 1.1 mrg for (j = 0; j < step; j++) {
84 1.1 mrg n++; m++; m2++;
85 1.1 mrg if (m >= MULTIFAC_WHEEL) m -= MULTIFAC_WHEEL;
86 1.1 mrg if (m2 >= MULTIFAC_WHEEL2) m2 -= MULTIFAC_WHEEL2;
87 1.1 mrg mpz_mul_ui (ref[m], ref[m], n); /* Compute a reference, with current library */
88 1.1 mrg mpz_mul_ui (ref2[m2], ref2[m2], n); /* Compute a reference, with current library */
89 1.1 mrg }
90 1.1 mrg else n += step;
91 1.1 mrg }
92 1.1 mrg mpz_fac_ui (ref[0], n);
93 1.1 mrg mpz_mfac_uiui (res, n, 1);
94 1.1 mrg MPZ_CHECK_FORMAT (res);
95 1.1 mrg if (mpz_cmp (ref[0], res) != 0)
96 1.1 mrg {
97 1.1 mrg printf ("mpz_mfac_uiui(%lu,1) wrong\n", n);
98 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, res); printf("\n");
99 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, ref[0]); printf("\n");
100 1.1 mrg abort ();
101 1.1 mrg }
102 1.1 mrg
103 1.1 mrg mpz_2fac_ui (ref[0], n);
104 1.1 mrg mpz_mfac_uiui (res, n, 2);
105 1.1 mrg MPZ_CHECK_FORMAT (res);
106 1.1 mrg if (mpz_cmp (ref[0], res) != 0)
107 1.1 mrg {
108 1.1 mrg printf ("mpz_mfac_uiui(%lu,1) wrong\n", n);
109 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, res); printf("\n");
110 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, ref[0]); printf("\n");
111 1.1 mrg abort ();
112 1.1 mrg }
113 1.1 mrg
114 1.1 mrg n++;
115 1.1 mrg mpz_2fac_ui (ref[0], n);
116 1.1 mrg mpz_mfac_uiui (res, n, 2);
117 1.1 mrg MPZ_CHECK_FORMAT (res);
118 1.1 mrg if (mpz_cmp (ref[0], res) != 0)
119 1.1 mrg {
120 1.1 mrg printf ("mpz_mfac_uiui(%lu,2) wrong\n", n);
121 1.1 mrg printf (" got "); mpz_out_str (stdout, 10, res); printf("\n");
122 1.1 mrg printf (" want "); mpz_out_str (stdout, 10, ref[0]); printf("\n");
123 1.1 mrg abort ();
124 1.1 mrg }
125 1.1 mrg
126 1.1 mrg for (m = 0; m < MULTIFAC_WHEEL; m++)
127 1.1 mrg mpz_clear (ref[m]);
128 1.1 mrg for (m2 = 0; m2 < MULTIFAC_WHEEL2; m2++)
129 1.1 mrg mpz_clear (ref2[m2]);
130 1.1 mrg mpz_clear (res);
131 1.1 mrg
132 1.1 mrg tests_end ();
133 1.1 mrg
134 1.1 mrg exit (0);
135 1.1 mrg }
136