Home | History | Annotate | Line # | Download | only in mpz
t-lcm.c revision 1.1.1.2
      1      1.1  mrg /* Test mpz_lcm and mpz_lcm_ui.
      2      1.1  mrg 
      3      1.1  mrg Copyright 2001 Free Software Foundation, Inc.
      4      1.1  mrg 
      5  1.1.1.2  mrg This file is part of the GNU MP Library test suite.
      6      1.1  mrg 
      7  1.1.1.2  mrg The GNU MP Library test suite is free software; you can redistribute it
      8  1.1.1.2  mrg and/or modify it under the terms of the GNU General Public License as
      9  1.1.1.2  mrg published by the Free Software Foundation; either version 3 of the License,
     10  1.1.1.2  mrg or (at your option) any later version.
     11  1.1.1.2  mrg 
     12  1.1.1.2  mrg The GNU MP Library test suite is distributed in the hope that it will be
     13  1.1.1.2  mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1.1.2  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     15  1.1.1.2  mrg Public License for more details.
     16      1.1  mrg 
     17  1.1.1.2  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 http://www.gnu.org/licenses/.  */
     19      1.1  mrg 
     20      1.1  mrg 
     21      1.1  mrg #include <stdio.h>
     22      1.1  mrg #include <stdlib.h>
     23      1.1  mrg #include <string.h>
     24      1.1  mrg 
     25      1.1  mrg #include "gmp.h"
     26      1.1  mrg #include "gmp-impl.h"
     27      1.1  mrg #include "tests.h"
     28      1.1  mrg 
     29      1.1  mrg 
     30      1.1  mrg void
     31      1.1  mrg check_all (mpz_ptr want, mpz_srcptr x_orig, mpz_srcptr y_orig)
     32      1.1  mrg {
     33      1.1  mrg   mpz_t  got, x, y;
     34      1.1  mrg   int    negx, negy, swap, inplace;
     35      1.1  mrg 
     36      1.1  mrg   mpz_init (got);
     37      1.1  mrg   mpz_init_set (x, x_orig);
     38      1.1  mrg   mpz_init_set (y, y_orig);
     39      1.1  mrg 
     40      1.1  mrg   for (swap = 0; swap < 2; swap++)
     41      1.1  mrg     {
     42      1.1  mrg       mpz_swap (x, y);
     43      1.1  mrg 
     44      1.1  mrg       for (negx = 0; negx < 2; negx++)
     45      1.1  mrg 	{
     46      1.1  mrg 	  mpz_neg (x, x);
     47      1.1  mrg 
     48      1.1  mrg 	  for (negy = 0; negy < 2; negy++)
     49      1.1  mrg 	    {
     50      1.1  mrg 	      mpz_neg (y, y);
     51      1.1  mrg 
     52      1.1  mrg 	      for (inplace = 0; inplace <= 1; inplace++)
     53      1.1  mrg 		{
     54      1.1  mrg 		  if (inplace)
     55      1.1  mrg 		    { mpz_set (got, x); mpz_lcm (got, got, y); }
     56      1.1  mrg 		  else
     57      1.1  mrg 		    mpz_lcm (got, x, y);
     58      1.1  mrg 		  MPZ_CHECK_FORMAT (got);
     59      1.1  mrg 
     60      1.1  mrg 		  if (mpz_cmp (got, want) != 0)
     61      1.1  mrg 		    {
     62      1.1  mrg 		      printf ("mpz_lcm wrong, inplace=%d\n", inplace);
     63      1.1  mrg 		    fail:
     64      1.1  mrg 		      mpz_trace ("x", x);
     65      1.1  mrg 		      mpz_trace ("y", y);
     66      1.1  mrg 		      mpz_trace ("got", got);
     67      1.1  mrg 		      mpz_trace ("want", want);
     68      1.1  mrg 		      abort ();
     69      1.1  mrg 		    }
     70      1.1  mrg 
     71      1.1  mrg 		  if (mpz_fits_ulong_p (y))
     72      1.1  mrg 		    {
     73      1.1  mrg 		      unsigned long  yu = mpz_get_ui (y);
     74      1.1  mrg 		      if (inplace)
     75      1.1  mrg 			{ mpz_set (got, x); mpz_lcm_ui (got, got, yu); }
     76      1.1  mrg 		      else
     77      1.1  mrg 			mpz_lcm_ui (got, x, yu);
     78      1.1  mrg 
     79      1.1  mrg 		      if (mpz_cmp (got, want) != 0)
     80      1.1  mrg 			{
     81      1.1  mrg 			  printf ("mpz_lcm_ui wrong, inplace=%d\n", inplace);
     82      1.1  mrg 			  printf    ("yu=%lu\n", yu);
     83      1.1  mrg 			  goto fail;
     84      1.1  mrg 			}
     85      1.1  mrg 		    }
     86      1.1  mrg 		}
     87      1.1  mrg 	    }
     88      1.1  mrg 	}
     89      1.1  mrg     }
     90      1.1  mrg 
     91      1.1  mrg   mpz_clear (got);
     92      1.1  mrg   mpz_clear (x);
     93      1.1  mrg   mpz_clear (y);
     94      1.1  mrg }
     95      1.1  mrg 
     96      1.1  mrg 
     97      1.1  mrg void
     98      1.1  mrg check_primes (void)
     99      1.1  mrg {
    100      1.1  mrg   static unsigned long  prime[] = {
    101      1.1  mrg     2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
    102      1.1  mrg     101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,
    103      1.1  mrg     191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,
    104      1.1  mrg     281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,
    105      1.1  mrg     389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,
    106      1.1  mrg   };
    107      1.1  mrg   mpz_t  want, x, y;
    108      1.1  mrg   int    i;
    109      1.1  mrg 
    110      1.1  mrg   mpz_init (want);
    111      1.1  mrg   mpz_init (x);
    112      1.1  mrg   mpz_init (y);
    113      1.1  mrg 
    114  1.1.1.2  mrg   /* Check zeros. */
    115  1.1.1.2  mrg   mpz_set_ui (want, 0);
    116  1.1.1.2  mrg   mpz_set_ui (x, 1);
    117  1.1.1.2  mrg   check_all (want, want, want);
    118  1.1.1.2  mrg   check_all (want, want, x);
    119  1.1.1.2  mrg   check_all (want, x, want);
    120  1.1.1.2  mrg 
    121      1.1  mrg   /* New prime each time. */
    122      1.1  mrg   mpz_set_ui (want, 1L);
    123      1.1  mrg   for (i = 0; i < numberof (prime); i++)
    124      1.1  mrg     {
    125      1.1  mrg       mpz_set (x, want);
    126      1.1  mrg       mpz_set_ui (y, prime[i]);
    127      1.1  mrg       mpz_mul_ui (want, want, prime[i]);
    128      1.1  mrg       check_all (want, x, y);
    129      1.1  mrg     }
    130      1.1  mrg 
    131      1.1  mrg   /* Old prime each time. */
    132      1.1  mrg   mpz_set (x, want);
    133      1.1  mrg   for (i = 0; i < numberof (prime); i++)
    134      1.1  mrg     {
    135      1.1  mrg       mpz_set_ui (y, prime[i]);
    136      1.1  mrg       check_all (want, x, y);
    137      1.1  mrg     }
    138      1.1  mrg 
    139      1.1  mrg   /* One old, one new each time. */
    140      1.1  mrg   mpz_set_ui (want, prime[0]);
    141      1.1  mrg   for (i = 1; i < numberof (prime); i++)
    142      1.1  mrg     {
    143      1.1  mrg       mpz_set (x, want);
    144      1.1  mrg       mpz_set_ui (y, prime[i] * prime[i-1]);
    145      1.1  mrg       mpz_mul_ui (want, want, prime[i]);
    146      1.1  mrg       check_all (want, x, y);
    147      1.1  mrg     }
    148      1.1  mrg 
    149      1.1  mrg   /* Triplets with A,B in x and B,C in y. */
    150      1.1  mrg   mpz_set_ui (want, 1L);
    151      1.1  mrg   mpz_set_ui (x, 1L);
    152      1.1  mrg   mpz_set_ui (y, 1L);
    153      1.1  mrg   for (i = 0; i+2 < numberof (prime); i += 3)
    154      1.1  mrg     {
    155      1.1  mrg       mpz_mul_ui (want, want, prime[i]);
    156      1.1  mrg       mpz_mul_ui (want, want, prime[i+1]);
    157      1.1  mrg       mpz_mul_ui (want, want, prime[i+2]);
    158      1.1  mrg 
    159      1.1  mrg       mpz_mul_ui (x, x, prime[i]);
    160      1.1  mrg       mpz_mul_ui (x, x, prime[i+1]);
    161      1.1  mrg 
    162      1.1  mrg       mpz_mul_ui (y, y, prime[i+1]);
    163      1.1  mrg       mpz_mul_ui (y, y, prime[i+2]);
    164      1.1  mrg 
    165      1.1  mrg       check_all (want, x, y);
    166      1.1  mrg     }
    167      1.1  mrg 
    168      1.1  mrg 
    169      1.1  mrg   mpz_clear (want);
    170      1.1  mrg   mpz_clear (x);
    171      1.1  mrg   mpz_clear (y);
    172      1.1  mrg }
    173      1.1  mrg 
    174      1.1  mrg 
    175      1.1  mrg 
    176      1.1  mrg int
    177      1.1  mrg main (int argc, char *argv[])
    178      1.1  mrg {
    179      1.1  mrg   tests_start ();
    180      1.1  mrg 
    181      1.1  mrg   check_primes ();
    182      1.1  mrg 
    183      1.1  mrg   tests_end ();
    184      1.1  mrg   exit (0);
    185      1.1  mrg }
    186