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