Home | History | Annotate | Line # | Download | only in mpz
t-lcm.c revision 1.1.1.1
      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  mrg This file is part of the GNU MP Library.
      6  1.1  mrg 
      7  1.1  mrg The GNU MP Library is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU Lesser General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3 of the License, or (at your
     10  1.1  mrg option) any later version.
     11  1.1  mrg 
     12  1.1  mrg The GNU MP Library is distributed in the hope that it will be useful, but
     13  1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     14  1.1  mrg or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
     15  1.1  mrg License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU Lesser General Public License
     18  1.1  mrg along with the GNU MP Library.  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  mrg   /* New prime each time. */
    115  1.1  mrg   mpz_set_ui (want, 1L);
    116  1.1  mrg   for (i = 0; i < numberof (prime); i++)
    117  1.1  mrg     {
    118  1.1  mrg       mpz_set (x, want);
    119  1.1  mrg       mpz_set_ui (y, prime[i]);
    120  1.1  mrg       mpz_mul_ui (want, want, prime[i]);
    121  1.1  mrg       check_all (want, x, y);
    122  1.1  mrg     }
    123  1.1  mrg 
    124  1.1  mrg   /* Old prime each time. */
    125  1.1  mrg   mpz_set (x, want);
    126  1.1  mrg   for (i = 0; i < numberof (prime); i++)
    127  1.1  mrg     {
    128  1.1  mrg       mpz_set_ui (y, prime[i]);
    129  1.1  mrg       check_all (want, x, y);
    130  1.1  mrg     }
    131  1.1  mrg 
    132  1.1  mrg   /* One old, one new each time. */
    133  1.1  mrg   mpz_set_ui (want, prime[0]);
    134  1.1  mrg   for (i = 1; i < numberof (prime); i++)
    135  1.1  mrg     {
    136  1.1  mrg       mpz_set (x, want);
    137  1.1  mrg       mpz_set_ui (y, prime[i] * prime[i-1]);
    138  1.1  mrg       mpz_mul_ui (want, want, prime[i]);
    139  1.1  mrg       check_all (want, x, y);
    140  1.1  mrg     }
    141  1.1  mrg 
    142  1.1  mrg   /* Triplets with A,B in x and B,C in y. */
    143  1.1  mrg   mpz_set_ui (want, 1L);
    144  1.1  mrg   mpz_set_ui (x, 1L);
    145  1.1  mrg   mpz_set_ui (y, 1L);
    146  1.1  mrg   for (i = 0; i+2 < numberof (prime); i += 3)
    147  1.1  mrg     {
    148  1.1  mrg       mpz_mul_ui (want, want, prime[i]);
    149  1.1  mrg       mpz_mul_ui (want, want, prime[i+1]);
    150  1.1  mrg       mpz_mul_ui (want, want, prime[i+2]);
    151  1.1  mrg 
    152  1.1  mrg       mpz_mul_ui (x, x, prime[i]);
    153  1.1  mrg       mpz_mul_ui (x, x, prime[i+1]);
    154  1.1  mrg 
    155  1.1  mrg       mpz_mul_ui (y, y, prime[i+1]);
    156  1.1  mrg       mpz_mul_ui (y, y, prime[i+2]);
    157  1.1  mrg 
    158  1.1  mrg       check_all (want, x, y);
    159  1.1  mrg     }
    160  1.1  mrg 
    161  1.1  mrg 
    162  1.1  mrg   mpz_clear (want);
    163  1.1  mrg   mpz_clear (x);
    164  1.1  mrg   mpz_clear (y);
    165  1.1  mrg }
    166  1.1  mrg 
    167  1.1  mrg 
    168  1.1  mrg 
    169  1.1  mrg int
    170  1.1  mrg main (int argc, char *argv[])
    171  1.1  mrg {
    172  1.1  mrg   tests_start ();
    173  1.1  mrg 
    174  1.1  mrg   check_primes ();
    175  1.1  mrg 
    176  1.1  mrg   tests_end ();
    177  1.1  mrg   exit (0);
    178  1.1  mrg }
    179