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