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