Home | History | Annotate | Line # | Download | only in mpz
      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