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