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