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