t-lcm.c revision 1.1 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