Home | History | Annotate | Line # | Download | only in mpz
t-mfac_uiui.c revision 1.1.1.2
      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.h"
     23      1.1  mrg #include "gmp-impl.h"
     24      1.1  mrg #include "tests.h"
     25      1.1  mrg 
     26      1.1  mrg 
     27      1.1  mrg /* Usage: t-mfac_uiui [x|num]
     28      1.1  mrg 
     29      1.1  mrg    With no arguments testing goes up to the initial value of "limit" below.
     30      1.1  mrg    With a number argument tests are carried that far, or with a literal "x"
     31      1.1  mrg    tests are continued without limit (this being meant only for development
     32      1.1  mrg    purposes).  */
     33      1.1  mrg 
     34      1.1  mrg #define MULTIFAC_WHEEL (2*3*11)
     35      1.1  mrg #define MULTIFAC_WHEEL2 (5*13)
     36      1.1  mrg 
     37      1.1  mrg int
     38      1.1  mrg main (int argc, char *argv[])
     39      1.1  mrg {
     40      1.1  mrg   mpz_t ref[MULTIFAC_WHEEL], ref2[MULTIFAC_WHEEL2], res;
     41      1.1  mrg   unsigned long n, j, m, m2;
     42      1.1  mrg   unsigned long limit = 2222, step = 1;
     43      1.1  mrg 
     44      1.1  mrg   tests_start ();
     45      1.1  mrg 
     46      1.1  mrg   if (argc > 1 && argv[1][0] == 'x')
     47      1.1  mrg     limit = ULONG_MAX;
     48      1.1  mrg   else if (argc > 1)
     49      1.1  mrg     limit = atoi (argv[1]);
     50      1.1  mrg 
     51      1.1  mrg   /* for small limb testing */
     52      1.1  mrg   limit = MIN (limit, MP_LIMB_T_MAX);
     53      1.1  mrg 
     54      1.1  mrg   for (m = 0; m < MULTIFAC_WHEEL; m++)
     55      1.1  mrg     mpz_init_set_ui(ref [m],1);
     56      1.1  mrg   for (m2 = 0; m2 < MULTIFAC_WHEEL2; m2++)
     57      1.1  mrg     mpz_init_set_ui(ref2 [m2],1);
     58      1.1  mrg 
     59      1.1  mrg   mpz_init (res);
     60      1.1  mrg 
     61      1.1  mrg   m = 0;
     62      1.1  mrg   m2 = 0;
     63      1.1  mrg   for (n = 0; n <= limit;)
     64      1.1  mrg     {
     65      1.1  mrg       mpz_mfac_uiui (res, n, MULTIFAC_WHEEL);
     66      1.1  mrg       MPZ_CHECK_FORMAT (res);
     67      1.1  mrg       if (mpz_cmp (ref[m], res) != 0)
     68      1.1  mrg         {
     69      1.1  mrg           printf ("mpz_mfac_uiui(%lu,%d) wrong\n", n, MULTIFAC_WHEEL);
     70      1.1  mrg           printf ("  got  "); mpz_out_str (stdout, 10, res); printf("\n");
     71      1.1  mrg           printf ("  want "); mpz_out_str (stdout, 10, ref[m]); printf("\n");
     72      1.1  mrg           abort ();
     73      1.1  mrg         }
     74      1.1  mrg       mpz_mfac_uiui (res, n, MULTIFAC_WHEEL2);
     75      1.1  mrg       MPZ_CHECK_FORMAT (res);
     76      1.1  mrg       if (mpz_cmp (ref2[m2], res) != 0)
     77      1.1  mrg         {
     78      1.1  mrg           printf ("mpz_mfac_uiui(%lu,%d) wrong\n", n, MULTIFAC_WHEEL2);
     79      1.1  mrg           printf ("  got  "); mpz_out_str (stdout, 10, res); printf("\n");
     80      1.1  mrg           printf ("  want "); mpz_out_str (stdout, 10, ref2[m2]); printf("\n");
     81      1.1  mrg           abort ();
     82      1.1  mrg         }
     83      1.1  mrg       if (n + step <= limit)
     84      1.1  mrg 	for (j = 0; j < step; j++) {
     85      1.1  mrg 	  n++; m++; m2++;
     86      1.1  mrg 	  if (m >= MULTIFAC_WHEEL) m -= MULTIFAC_WHEEL;
     87      1.1  mrg 	  if (m2 >= MULTIFAC_WHEEL2) m2 -= MULTIFAC_WHEEL2;
     88      1.1  mrg 	  mpz_mul_ui (ref[m], ref[m], n); /* Compute a reference, with current library */
     89      1.1  mrg 	  mpz_mul_ui (ref2[m2], ref2[m2], n); /* Compute a reference, with current library */
     90      1.1  mrg 	}
     91      1.1  mrg       else n += step;
     92      1.1  mrg     }
     93      1.1  mrg   mpz_fac_ui (ref[0], n);
     94      1.1  mrg   mpz_mfac_uiui (res, n, 1);
     95      1.1  mrg   MPZ_CHECK_FORMAT (res);
     96      1.1  mrg   if (mpz_cmp (ref[0], res) != 0)
     97      1.1  mrg     {
     98      1.1  mrg       printf ("mpz_mfac_uiui(%lu,1) wrong\n", n);
     99      1.1  mrg       printf ("  got  "); mpz_out_str (stdout, 10, res); printf("\n");
    100      1.1  mrg       printf ("  want "); mpz_out_str (stdout, 10, ref[0]); printf("\n");
    101      1.1  mrg       abort ();
    102      1.1  mrg     }
    103      1.1  mrg 
    104      1.1  mrg   mpz_2fac_ui (ref[0], n);
    105      1.1  mrg   mpz_mfac_uiui (res, n, 2);
    106      1.1  mrg   MPZ_CHECK_FORMAT (res);
    107      1.1  mrg   if (mpz_cmp (ref[0], res) != 0)
    108      1.1  mrg     {
    109      1.1  mrg       printf ("mpz_mfac_uiui(%lu,1) wrong\n", n);
    110      1.1  mrg       printf ("  got  "); mpz_out_str (stdout, 10, res); printf("\n");
    111      1.1  mrg       printf ("  want "); mpz_out_str (stdout, 10, ref[0]); printf("\n");
    112      1.1  mrg       abort ();
    113      1.1  mrg     }
    114      1.1  mrg 
    115      1.1  mrg   n++;
    116      1.1  mrg   mpz_2fac_ui (ref[0], n);
    117      1.1  mrg   mpz_mfac_uiui (res, n, 2);
    118      1.1  mrg   MPZ_CHECK_FORMAT (res);
    119      1.1  mrg   if (mpz_cmp (ref[0], res) != 0)
    120      1.1  mrg     {
    121      1.1  mrg       printf ("mpz_mfac_uiui(%lu,2) wrong\n", n);
    122      1.1  mrg       printf ("  got  "); mpz_out_str (stdout, 10, res); printf("\n");
    123      1.1  mrg       printf ("  want "); mpz_out_str (stdout, 10, ref[0]); printf("\n");
    124      1.1  mrg       abort ();
    125      1.1  mrg     }
    126      1.1  mrg 
    127      1.1  mrg   for (m = 0; m < MULTIFAC_WHEEL; m++)
    128      1.1  mrg     mpz_clear (ref[m]);
    129      1.1  mrg   for (m2 = 0; m2 < MULTIFAC_WHEEL2; m2++)
    130      1.1  mrg     mpz_clear (ref2[m2]);
    131      1.1  mrg   mpz_clear (res);
    132      1.1  mrg 
    133      1.1  mrg   tests_end ();
    134      1.1  mrg 
    135      1.1  mrg   exit (0);
    136      1.1  mrg }
    137