1 //==============================================================================================
2 //
3 // This file is part of LiDIA --- a library for computational number theory
4 //
5 // Copyright (c) 1994--2001 the LiDIA Group. All rights reserved.
6 //
7 // See http://www.informatik.tu-darmstadt.de/TI/LiDIA/
8 //
9 //----------------------------------------------------------------------------------------------
10 //
11 // $Id$
12 //
13 // Author : Stefan Neis (SN)
14 // Changes : See CVS log
15 //
16 //==============================================================================================
17
18
19 #include "LiDIA/alg_number.h"
20 #include <cassert>
21 #include <cstdlib>
22 #include <fstream>
23
24
25
26 #ifdef LIDIA_NAMESPACE
27 using namespace LiDIA;
28 #endif
29
30
31
32 std::ifstream in("alg_appl_input");
33
34
35
identitytest(const alg_number & a,const alg_number & b,const alg_number & c)36 void identitytest(const alg_number& a, const alg_number& b, const alg_number& c)
37 {
38 assert(-(-a) == a);
39 assert((a + b) == (b + a));
40 assert((a + (-b)) == (a - b));
41 assert((a + (-b)) == (b - a+2*a - 2*b));
42 assert((a * b) == (b * a));
43 assert((a * (-b)) == -(a * b));
44 assert((a / (-b)) == -(a / b));
45 assert((a - b) == -(b - a));
46 assert((a + (b + c)) == ((a + b) + c));
47 assert((a + (b + c)) == ((a + c) + b));
48 assert((a * (b * c)) == ((a * b) * c));
49 assert((a * (b * c)) == ((c * a) * b));
50 assert((a * (b + c)) == ((a * b) + (a * c)));
51 assert(((a - b) + b) == a);
52 assert(((a + b) - b) == a);
53 assert(((a * b) / b) == a);
54 assert(((a * b) / a) == b);
55 assert(((a / b) / a) == (1/b));
56
57 alg_number d;
58
59 negate(d, a); assert(-(d) == a);
60 add(d, b, a); assert((a + b) == d);
61 subtract(d, a , b); assert((a + (-b)) == d);
62 negate(d, b); assert((a + d) == (b - a+2*a - 2*b));
63 d.assign(a); d.multiply_by_2(); assert((a + a) == d);
64 multiply(d, a, b); assert(d == (b * a));
65 d.assign(b); d.negate(); multiply(d, a, d); assert(d == -(a * b));
66 divide(d, a, b); assert((a / (-b)) == -d);
67 add(d, b, c); multiply(d, a, d); assert(d == ((a * b) + (a * c)));
68 d = b; d.invert(); assert(((a / b) / a) == d);
69 }
70
71
72
utiltest(const alg_number & a)73 void utiltest(const alg_number& a)
74 {
75 alg_number b, c;
76
77 square(b, a);
78 multiply(c, a, a);
79 assert(b == c);
80
81 alg_number x = bigint(1), y = bigint(1);
82
83 for (int i = 0; i < 10; ++i) {
84 power(b, a, i);
85 assert(b == x);
86 x *= a;
87 y = a * y;
88 assert(y == x);
89 }
90 x.assign_one();
91 assert(x.is_one());
92 x.assign(4);
93 x.negate();
94 x.negate();
95 assert(x == bigint(4));
96 }
97
98
99
accumtest(const alg_number & a,const alg_number & b,const alg_number & c)100 void accumtest(const alg_number& a, const alg_number& b, const alg_number& c)
101 {
102 alg_number x = a;
103 x *= b;
104 assert(x == (b * a));
105 x += c;
106 assert(x == (c+(b * a)));
107 x -= a;
108 assert(x == (-a + c + (b * a)));
109 x /= b;
110 assert(x == (((b *a) -a + c) / b));
111
112 x.assign(a);
113 assert(x == a);
114 multiply(x, x, b);
115 assert(x == (b * a));
116 add(x, x, c);
117 assert(x == (c+(b * a)));
118 subtract(x, x, a);
119 assert(x == (-a + c + (b * a)));
120 divide(x, x, b);
121 assert(x == (((b *a) -a + c) / b));
122 }
123
124
125
longidentitytest(const alg_number & a,long b,long c)126 void longidentitytest(const alg_number& a, long b, long c)
127 {
128 assert((a + b) == (b + a));
129 assert((a + (-b)) == (a - b));
130 assert((a * b) == (b * a));
131 assert((a * (-b)) == -(a * b));
132 assert((a / (-b)) == -(a / b));
133 assert((a - b) == -(b - a));
134 assert((a + (b + c)) == ((a + b) + c));
135 assert((a + (b + c)) == ((c + a) + b));
136 assert((a * (b * c)) == ((b * a) * c));
137 assert((a * (b + c)) == ((a * b) + (a * c)));
138 assert(((a - b) + b) == a);
139 assert(((a + b) - b) == a);
140 assert(((a * b) / b) == a);
141 assert((b * (a / b)) == a);
142
143 alg_number d;
144
145 negate(d, a); assert(-(d) == a);
146 add(d, b, a); assert((a + b) == d);
147 subtract(d, a , b); assert((a + (-b)) == d);
148 negate(d, bigint(b)); assert((a + d) == (b - a+2*a - 2*b));
149 d.assign(a); d.multiply_by_2(); assert((a + a) == d);
150 multiply(d, a, b); assert(d == (b * a));
151 d.assign(b); d.negate(); multiply(d, a, d); assert(d == -(a * b));
152 divide(d, a, b); assert((a / (-b)) == -d);
153 add(d, alg_number(bigint(b)), c); multiply(d, a, d);
154 assert(d == ((a * b) + (a * c)));
155 add(d, b, alg_number(bigint(c))); multiply(d, a, d);
156 assert(d == ((a * b) + (a * c)));
157 d = bigint(b); d.invert(); assert(((a / b) / a) == d);
158 }
159
160
161
longaccumtest(const alg_number & a,long b,long c)162 void longaccumtest(const alg_number& a, long b, long c)
163 {
164 alg_number x = a;
165 x *= b;
166 assert(x == (a * b));
167 x += c;
168 assert(x == ((a * b) + c));
169 x -= a;
170 assert(x == (((a * b) + c) - a));
171 x /= b;
172 assert(x == ((((a * b) + c) - a) / b));
173
174 x.assign(a);
175 assert(x == a);
176 multiply(x, x, b);
177 assert(x == (a * b));
178 add(x, x, c);
179 assert(x == ((a * b) + c));
180 subtract(x, x, a);
181 assert(x == (((a * b) + c) - a));
182 divide(x, x, b);
183 assert(x == ((((a * b) + c) - a) / b));
184 }
185
186
187
anothertest()188 void anothertest()
189 {
190 alg_number pow64;
191 power(pow64, alg_number(bigint(2)), 64);
192 std::cout << "power(pow64, 2, 64) = " << pow64 << "\n";
193
194 bigint s64 = 1;
195 s64 <<= 64;
196 std::cout << "s64 = 1 << 64 = " << s64 << "\n";
197
198 assert(s64 == pow64);
199 assert(!(s64 != pow64));
200
201 bigint s32 = s64 >> 32;
202 std::cout << "s32 = (s64 >> 32) = " << s32 << "\n";
203 assert(!(pow64 == s32));
204 assert(pow64 != s32);
205
206 // identitytest(s64, s32, pow64);
207 accumtest(pow64, s32, pow64);
208 utiltest(s32);
209 longidentitytest(s64, 1000, 50);
210 longaccumtest(s32, 100000, 11);
211 }
212
213
214
iotest()215 void iotest()
216 {
217 alg_number result;
218
219 std::cout << "\nenter an alg_number: ";
220 in >> result;
221 std::cout << "number = " << result << "\n";
222 }
223
224
225
all_test(const bigint & ii)226 void all_test(const bigint & ii)
227 {
228 alg_number a, b;
229 static long x = 1, y = 27;
230 alg_number aa, bb;
231
232 aa.randomize(ii);
233 bb.randomize(ii);
234 divide(a, alg_number(aa), bb);
235 aa.randomize(ii);
236 bb.randomize(ii);
237 divide(b, alg_number(aa), bb);
238
239 srand(static_cast<unsigned int>(x)); srand(static_cast<unsigned int>(y));
240 x = rand() & 0x7fff; y = rand() & 0x7fff;
241
242 std::cout << "\n\n Test with \na = " << a << "\nb = " << b;
243 std::cout << "\nx = " << x << "\ny = " << y << std::flush;
244
245 utiltest(a);
246 identitytest(a, b, b);
247 identitytest(a, a, b);
248
249 accumtest(a, a, b);
250 accumtest(b, a, b);
251
252 utiltest(a);
253 utiltest(b);
254
255 longidentitytest(a, x, y);
256 longidentitytest(b, x, x);
257
258 longaccumtest(b, x, y);
259 longaccumtest(a, x, x);
260 }
261
262
263
main_LiDIA(int argc,char ** argv)264 int main_LiDIA(int argc, char** argv)
265 {
266 number_field F;
267 order O;
268
269 in >> O;
270 std::cout << "Read order !" << std::endl;
271 std::cout << O;
272 for (long zaehl = 1; zaehl <= 2; zaehl++) {
273 alg_number one = bigint(1);
274 std::cout << "one = " << one << "\n";
275 assert(one == bigint(1));
276 std::cout << "one + 1 = " << (one + 1) << "\n";
277
278 alg_number two = bigint(2);
279 std::cout << "two = " << two << "\n";
280 assert(two == bigint(2));
281
282 std::cout << std::endl;
283
284 alg_number n(bigint(0));
285 assert(n.is_zero());
286 anothertest();
287 iotest();
288
289 bigint i = 129099121;
290
291 for (int j = 0; j < 10; j++)
292 all_test(i);
293 std::cout << "\nEnd of test\n";
294 if (zaehl != 2) {
295 in >> F;
296 O.assign(order(F));
297 std::cout << "Starting second iteration!!\n";
298 std::cout << "===========================\n";
299 }
300 else std::cout << std::endl;
301 }
302 return 0;
303 }
304
305
main(int argc,char ** argv)306 int main(int argc, char** argv) {
307
308 #if defined(LIDIA_EXCEPTIONS)
309 try {
310 #endif
311
312 main_LiDIA(argc, argv);
313
314 #if defined(LIDIA_EXCEPTIONS)
315 }
316 catch(basic_error const& ex) {
317 ex.traditional_error_handler();
318 return 1;
319 }
320 catch(std::exception const& ex) {
321 std::cerr << "unexpected exception: " << ex.what() << "\n";
322 return 1;
323 }
324 #endif
325
326 }
327