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