Introduction
Introduction Statistics Contact Development Disclaimer Help
test-generate.py - libzahl - big integer library
git clone git://git.suckless.org/libzahl
Log
Files
Refs
README
LICENSE
---
test-generate.py (25817B)
---
1 #!/usr/bin/env python3
2 # See LICENSE file for copyright and license details.
3
4 import sys, random
5
6
7 def mod(a, b):
8 r = (abs(a) % abs(b)) * (-1 if a < 0 else 1)
9 q = div(a, b)
10 if a != q * b + r:
11 print('zdivmod does not satisfly n = qd + r', file = sys.stderr)
12 sys.exit(1)
13 return r
14
15 def div(a, b): # Python's division is floored, not truncated.
16 r = abs(a) // abs(b)
17 if a < 0:
18 r = -r
19 if b < 0:
20 r = -r
21 return r
22
23 def gcd(u, v):
24 if u == 0:
25 return v
26 if v == 0:
27 return u
28 uneg = u < 0
29 vneg = v < 0
30 u = abs(u)
31 v = abs(v)
32
33 shift = 0
34 while ((u | v) & 1) == 0:
35 u >>= 1
36 v >>= 1
37 shift += 1
38
39 while (u & 1) == 0:
40 u >>= 1
41
42 while True:
43 while (v & 1) == 0:
44 v >>= 1
45 if u > v:
46 (u, v) = (v, u)
47 v -= u
48 if v == 0:
49 break
50
51 u <<= shift
52 if uneg and vneg:
53 u = -u
54 return u
55
56
57 def zabs():
58 bits = random.randint(0, LIMIT)
59 a = random.randint(-(1 << bits), 1 << bits)
60 print('zsets(a, "%i");' % a)
61 print('zabs(b, a);')
62 print('zabs(a, a);')
63 print('assert(zcmp(a, b), == 0);')
64 print('assert_s(zstr(a, buf, BUF_N), "%i");' % abs(a))
65
66 def zadd():
67 bits = random.randint(0, LIMIT)
68 a = random.randint(-(1 << bits), 1 << bits)
69 bits = random.randint(0, LIMIT)
70 b = random.randint(-(1 << bits), 1 << bits)
71 c = a + b
72 print('zsets(a, "%i");' % a)
73 print('zsets(b, "%i");' % b)
74 print('zadd(c, a, b);')
75 print('zset(d, b);')
76 print('zadd(d, a, d);')
77 print('zadd(a, a, b);')
78 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
79 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
80 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
81
82 def zadd_unsigned():
83 bits = random.randint(0, LIMIT)
84 a = random.randint(-(1 << bits), 1 << bits)
85 bits = random.randint(0, LIMIT)
86 b = random.randint(-(1 << bits), 1 << bits)
87 c = abs(a) + abs(b)
88 print('zsets(a, "%i");' % a)
89 print('zsets(b, "%i");' % b)
90 print('zadd_unsigned(c, a, b);')
91 print('zset(d, b);')
92 print('zadd_unsigned(d, a, d);')
93 print('zadd_unsigned(a, a, b);')
94 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
95 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
96 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
97 c = abs(b) * 2
98 print('zadd_unsigned(c, b, b);')
99 print('zadd_unsigned(b, b, b);')
100 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
101 print('assert(zcmp(b, c), == 0);')
102
103 def zand():
104 bits = random.randint(0, LIMIT)
105 a = random.randint(-(1 << bits), 1 << bits)
106 bits = random.randint(0, LIMIT)
107 b = random.randint(-(1 << bits), 1 << bits)
108 c = abs(a) & abs(b)
109 if a < 0 and b < 0:
110 c = -c
111 print('zsets(a, "%i");' % a)
112 print('zsets(b, "%i");' % b)
113 print('zand(c, a, b);')
114 print('zset(d, b);')
115 print('zand(d, a, d);')
116 print('zand(a, a, b);')
117 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
118 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
119 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
120 print('zsets(a, "%i");' % a)
121 print('zand(d, a, a);')
122 print('zand(a, a, a);')
123 print('assert_s(zstr(d, buf, BUF_N), "%i");' % a)
124 print('assert_s(zstr(a, buf, BUF_N), "%i");' % a)
125
126 def zbits():
127 bits = random.randint(0, LIMIT)
128 a = random.randint(-(1 << bits), 1 << bits)
129 print('zsets(a, "%i");' % a)
130 a = abs(a)
131 if a == 0:
132 b = 1
133 else:
134 b = 0
135 while a > 0:
136 b += 1
137 a >>= 1
138 print('assert_zu(zbits(a), %i);' % b)
139
140 def zbset():
141 bits = random.randint(0, LIMIT)
142 a = random.randint(-(1 << bits), 1 << bits)
143 b = random.randint(0, 2 * LIMIT)
144 cs = (abs(a) | (1 << b)) * (-1 if a < 0 else 1)
145 cc = (abs(a) & ~(1 << b)) * (-1 if a < 0 else 1)
146 cf = (abs(a) ^ (1 << b)) * (-1 if a < 0 else 1)
147 print('zsets(a, "%i");' % a)
148 print('zset(d, a);')
149 print('zbset(b, a, %i, 1);' % b)
150 print('assert_s(zstr(b, buf, BUF_N), "%i");' % cs)
151 print('zbset(b, a, %i, 0);' % b)
152 print('assert_s(zstr(b, buf, BUF_N), "%i");' % cc)
153 print('zbset(b, a, %i, -1);' % b)
154 print('assert_s(zstr(b, buf, BUF_N), "%i");' % cf)
155 print('zset(a, d);')
156 print('zbset(a, a, %i, 1);' % b)
157 print('assert_s(zstr(a, buf, BUF_N), "%i");' % cs)
158 print('zset(a, d);')
159 print('zbset(a, a, %i, 0);' % b)
160 print('assert_s(zstr(a, buf, BUF_N), "%i");' % cc)
161 print('zset(a, d);')
162 print('zbset(a, a, %i, -1);' % b)
163 print('assert_s(zstr(a, buf, BUF_N), "%i");' % cf)
164
165 def zbtest():
166 bits = random.randint(0, LIMIT)
167 a = random.randint(-(1 << bits), 1 << bits)
168 b = random.randint(0, 2 * LIMIT)
169 c = (abs(a) >> b) & 1
170 print('zsets(a, "%i");' % a)
171 print('assert(zbtest(a, %i), == %i);' % (b, c))
172
173 def zcmp():
174 bits = random.randint(0, LIMIT)
175 a = random.randint(-(1 << bits), 1 << bits)
176 bits = random.randint(0, LIMIT)
177 b = random.randint(-(1 << bits), 1 << bits)
178 c = -1 if a < b else (1 if a > b else 0)
179 print('zsets(a, "%i");' % a)
180 print('zsets(b, "%i");' % b)
181 print('assert(zcmp(a, b), == %i);' % c)
182
183 def zcmpmag():
184 bits = random.randint(0, LIMIT)
185 a = random.randint(-(1 << bits), 1 << bits)
186 bits = random.randint(0, LIMIT)
187 b = random.randint(-(1 << bits), 1 << bits)
188 print('zsets(a, "%i");' % a)
189 print('zsets(b, "%i");' % b)
190 a = abs(a)
191 b = abs(b)
192 c = -1 if a < b else (1 if a > b else 0)
193 print('assert(zcmpmag(a, b), == %i);' % c)
194
195 def zlsb():
196 bits = random.randint(0, LIMIT)
197 a = random.randint(-(1 << bits), 1 << bits)
198 print('zsets(a, "%i");' % a)
199 a = abs(a)
200 if a == 0:
201 b = "SIZE_MAX"
202 else:
203 b = 0
204 while (a & 1) == 0:
205 b += 1
206 a >>= 1
207 b = str(b)
208 print('assert_zu(zlsb(a), %s);' % b)
209
210 def zlsh():
211 bits = random.randint(0, LIMIT)
212 a = random.randint(-(1 << bits), 1 << bits)
213 bits = random.randint(0, 2 * LIMIT)
214 c = a << bits
215 print('zsets(a, "%i");' % a)
216 print('zlsh(b, a, %i);' % bits)
217 print('zlsh(a, a, %i);' % bits)
218 print('assert(zcmp(a, b), == 0);')
219 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
220
221 def zneg():
222 bits = random.randint(0, LIMIT)
223 a = random.randint(-(1 << bits), 1 << bits)
224 print('zsets(a, "%i");' % a)
225 print('zneg(b, a);')
226 print('zneg(a, a);')
227 print('assert(zcmp(a, b), == 0);')
228 print('assert_s(zstr(a, buf, BUF_N), "%i");' % -a)
229
230 def zor():
231 bits = random.randint(0, LIMIT)
232 a = random.randint(-(1 << bits), 1 << bits)
233 bits = random.randint(0, LIMIT)
234 b = random.randint(-(1 << bits), 1 << bits)
235 c = abs(a) | abs(b)
236 if a < 0 or b < 0:
237 c = -c
238 print('zsets(a, "%i");' % a)
239 print('zsets(b, "%i");' % b)
240 print('zor(c, a, b);')
241 print('zset(d, b);')
242 print('zor(d, a, d);')
243 print('zor(a, a, b);')
244 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
245 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
246 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
247 print('zsets(a, "%i");' % a)
248 print('zor(d, a, a);')
249 print('zor(a, a, a);')
250 print('assert_s(zstr(d, buf, BUF_N), "%i");' % a)
251 print('assert_s(zstr(a, buf, BUF_N), "%i");' % a)
252
253 def zrsh():
254 bits = random.randint(0, LIMIT)
255 a = random.randint(-(1 << bits), 1 << bits)
256 bits = random.randint(0, LIMIT)
257 c = (abs(a) >> bits) * (-1 if a < 0 else 1)
258 print('zsets(a, "%i");' % a)
259 print('zrsh(b, a, %i);' % bits)
260 print('zrsh(a, a, %i);' % bits)
261 print('assert(zcmp(a, b), == 0);')
262 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
263
264 def zsplit():
265 bits = random.randint(0, LIMIT)
266 a = random.randint(-(1 << bits), 1 << bits)
267 bits = random.randint(0, 2 * LIMIT)
268 sign = -1 if a < 0 else 1
269 c = (abs(a) >> bits) * sign
270 d = (abs(a) - (abs(c) << bits)) * sign
271 print('zsets(a, "%i");' % a)
272 print('zset(b, a);')
273 print('zsplit(b, d, b, %i);' % bits)
274 print('assert_s(zstr(b, buf, BUF_N), "%i");' % c)
275 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
276 print('zsplit(c, d, a, %i);' % bits)
277 print('assert(zcmp(b, c), == 0);')
278 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
279 print('zsplit(c, a, a, %i);' % bits)
280 print('assert(zcmp(a, d), == 0);')
281 print('assert(zcmp(b, c), == 0);')
282
283 def zstr():
284 bits = random.randint(0, LIMIT)
285 a = random.randint(-(1 << bits), 1 << bits)
286 print('zsets(a, "%i");' % a)
287 print('assert_s(zstr(a, buf, BUF_N), "%i");' % a)
288
289 def zstr_length():
290 bits = random.randint(0, LIMIT)
291 a = random.randint(-(1 << bits), 1 << bits)
292 print('zsets(a, "%i");' % a)
293 print('assert_zu(zstr_length(a, 10), %i);' % len(str(a)))
294
295 def zsub():
296 bits = random.randint(0, LIMIT)
297 a = random.randint(-(1 << bits), 1 << bits)
298 bits = random.randint(0, LIMIT)
299 b = random.randint(-(1 << bits), 1 << bits)
300 c = a - b
301 print('zsets(a, "%i");' % a)
302 print('zsets(b, "%i");' % b)
303 print('zsub(c, a, b);')
304 print('zset(d, b);')
305 print('zsub(d, a, d);')
306 print('zsub(a, a, b);')
307 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
308 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
309 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
310
311 def zsub_unsigned():
312 bits = random.randint(0, LIMIT)
313 a = random.randint(-(1 << bits), 1 << bits)
314 bits = random.randint(0, LIMIT)
315 b = random.randint(-(1 << bits), 1 << bits)
316 c = abs(a) - abs(b)
317 print('zsets(a, "%i");' % a)
318 print('zsets(b, "%i");' % b)
319 print('zsub_unsigned(c, a, b);')
320 print('zset(d, b);')
321 print('zsub_unsigned(d, a, d);')
322 print('zsub_unsigned(a, a, b);')
323 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
324 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
325 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
326 print('zsub_unsigned(a, b, b);')
327 print('assert(zzero(a), == 1);')
328 print('zsub_unsigned(b, b, b);')
329 print('assert(zzero(b), == 1);')
330
331 def ztrunc():
332 bits = random.randint(0, LIMIT)
333 a = random.randint(-(1 << bits), 1 << bits)
334 bits = random.randint(0, 2 * LIMIT)
335 c = (abs(a) & ((1 << bits) - 1)) * (-1 if a < 0 else 1)
336 print('zsets(a, "%i");' % a)
337 print('ztrunc(b, a, %i);' % bits)
338 print('ztrunc(a, a, %i);' % bits)
339 print('assert(zcmp(a, b), == 0);')
340 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
341
342 def zxor():
343 bits = random.randint(0, LIMIT)
344 a = random.randint(-(1 << bits), 1 << bits)
345 bits = random.randint(0, LIMIT)
346 b = random.randint(-(1 << bits), 1 << bits)
347 c = abs(a) ^ abs(b)
348 if (a < 0) != (b < 0):
349 c = -c
350 print('zsets(a, "%i");' % a)
351 print('zsets(b, "%i");' % b)
352 print('zxor(c, a, b);')
353 print('zset(d, b);')
354 print('zxor(d, a, d);')
355 print('zxor(a, a, b);')
356 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
357 print('assert_s(zstr(d, buf, BUF_N), "%i");' % c)
358 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
359 print('zsets(a, "%i");' % a)
360 print('zxor(d, a, a);')
361 print('zxor(a, a, a);')
362 print('assert(zzero(d), == 1);')
363 print('assert(zzero(a), == 1);')
364
365 def zeven():
366 bits = random.randint(0, LIMIT)
367 a = random.randint(-(1 << bits), 1 << bits)
368 b = 1 if (abs(a) & 1) == 0 else 0
369 print('zsets(a, "%i");' % a)
370 print('assert(zeven(a), == %i);' % b)
371
372 def zodd():
373 bits = random.randint(0, LIMIT)
374 a = random.randint(-(1 << bits), 1 << bits)
375 b = 1 if (abs(a) & 1) != 0 else 0
376 print('zsets(a, "%i");' % a)
377 print('assert(zodd(a), == %i);' % b)
378
379 def zeven_nonzero():
380 bits = random.randint(0, LIMIT)
381 a = 0
382 while a == 0:
383 a = random.randint(-(1 << bits), 1 << bits)
384 b = 1 if (abs(a) & 1) == 0 else 0
385 print('zsets(a, "%i");' % a)
386 print('assert(zeven_nonzero(a), == %i);' % b)
387
388 def zodd_nonzero():
389 bits = random.randint(0, LIMIT)
390 a = 0
391 while a == 0:
392 a = random.randint(-(1 << bits), 1 << bits)
393 b = 1 if (abs(a) & 1) != 0 else 0
394 print('zsets(a, "%i");' % a)
395 print('assert(zodd_nonzero(a), == %i);' % b)
396
397 def zzero():
398 bits = random.randint(0, LIMIT)
399 a = random.randint(-(1 << bits), 1 << bits)
400 b = 1 if a == 0 else 0
401 print('zsets(a, "%i");' % a)
402 print('assert(zzero(a), == %i);' % b)
403
404 def zsignum():
405 bits = random.randint(0, LIMIT)
406 a = random.randint(-(1 << bits), 1 << bits)
407 b = -1 if a < 0 else (1 if a > 0 else 0)
408 print('zsets(a, "%i");' % a)
409 print('assert(zsignum(a), == %i);' % b)
410
411 def zdiv():
412 bits = random.randint(0, LIMIT)
413 a = random.randint(-(1 << bits), 1 << bits)
414 bits = random.randint(0, LIMIT)
415 b = 0
416 while b == 0:
417 b = random.randint(-(1 << bits), 1 << bits)
418 c = div(a, b)
419 print('zsets(a, "%i");' % a)
420 print('zsets(b, "%i");' % b)
421 print('zsets(d, "%i");' % c)
422 print('zdiv(c, a, b);')
423 print('zdiv(a, a, b);')
424 print('assert(zcmp(c, d), == 0);')
425 print('assert(zcmp(a, d), == 0);')
426 print('zsets(a, "%i");' % a)
427 print('zdiv(b, a, b);')
428 print('assert(zcmp(b, d), == 0);')
429
430 def zmod():
431 bits = random.randint(0, LIMIT)
432 a = random.randint(-(1 << bits), 1 << bits)
433 bits = random.randint(0, LIMIT)
434 b = 0
435 while b == 0:
436 b = random.randint(-(1 << bits), 1 << bits)
437 c = mod(a, b)
438 print('zsets(a, "%i");' % a)
439 print('zsets(b, "%i");' % b)
440 print('zsets(d, "%i");' % c)
441 print('zmod(c, a, b);')
442 print('zmod(a, a, b);')
443 print('assert(zcmp(c, d), == 0);')
444 print('assert(zcmp(a, d), == 0);')
445 print('zsets(a, "%i");' % a)
446 print('zmod(b, a, b);')
447 print('assert(zcmp(b, d), == 0);')
448
449 def zdivmod():
450 bits = random.randint(0, LIMIT)
451 ap = random.randint(0, 1 << bits)
452 bits = random.randint(0, LIMIT)
453 bp = 0
454 while bp == 0:
455 bp = random.randint(0, 1 << bits)
456 for (a_sign, b_sign) in ((1, 1), (1, -1), (-1, 1), (-1, -1)):
457 a = ap * a_sign
458 b = bp * b_sign
459 (c, d) = (div(a, b), mod(a, b))
460 print('zsets(a, "%i");' % a)
461 print('zsets(b, "%i");' % b)
462 print('zdivmod(c, d, a, b);')
463 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
464 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
465 print('zdivmod(a, b, a, b);')
466 print('assert(zcmp(a, c), == 0);')
467 print('assert(zcmp(b, d), == 0);')
468 print('zsets(a, "%i");' % a)
469 print('zsets(b, "%i");' % b)
470 print('zdivmod(b, a, a, b);')
471 print('assert(zcmp(b, c), == 0);')
472 print('assert(zcmp(a, d), == 0);')
473 print('zsets(b, "%i");' % b)
474 print('zdivmod(b, a, b, b);')
475 print('assert(zcmpu(b, 1), == 0);')
476 print('assert(zcmpu(a, 0), == 0);')
477 print('zsets(b, "%i");' % b)
478 print('zdivmod(a, b, b, b);')
479 print('assert(zcmpu(a, 1), == 0);')
480 print('assert(zcmpu(b, 0), == 0);')
481 print('zsets(a, "%i");' % a)
482 print('zsets(b, "%i");' % b)
483 print('zdivmod(a, d, a, b);')
484 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
485 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
486 print('zsets(a, "%i");' % a)
487 print('zdivmod(c, b, a, b);')
488 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
489 print('assert_s(zstr(b, buf, BUF_N), "%i");' % d)
490 a = bp * a_sign
491 b = bp * b_sign
492 (c, d) = (div(a, b), mod(a, b))
493 print('zsets(a, "%i");' % a)
494 print('zsets(b, "%i");' % b)
495 print('zdivmod(c, d, a, b);')
496 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
497 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
498 print('zdivmod(a, b, a, b);')
499 print('assert(zcmp(a, c), == 0);')
500 print('assert(zcmp(b, d), == 0);')
501 print('zsets(a, "%i");' % a)
502 print('zsets(b, "%i");' % b)
503 print('zdivmod(b, a, a, b);')
504 print('assert(zcmp(b, c), == 0);')
505 print('assert(zcmp(a, d), == 0);')
506 print('zsets(b, "%i");' % b)
507 print('zdivmod(b, a, b, b);')
508 print('assert(zcmpu(b, 1), == 0);')
509 print('assert(zcmpu(a, 0), == 0);')
510 print('zsets(b, "%i");' % b)
511 print('zdivmod(a, b, b, b);')
512 print('assert(zcmpu(a, 1), == 0);')
513 print('assert(zcmpu(b, 0), == 0);')
514 print('zsets(a, "%i");' % a)
515 print('zsets(b, "%i");' % b)
516 print('zdivmod(a, d, a, b);')
517 print('assert_s(zstr(a, buf, BUF_N), "%i");' % c)
518 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
519 print('zsets(a, "%i");' % a)
520 print('zdivmod(c, b, a, b);')
521 print('assert_s(zstr(c, buf, BUF_N), "%i");' % c)
522 print('assert_s(zstr(b, buf, BUF_N), "%i");' % d)
523
524 def zmul():
525 bits = random.randint(0, LIMIT)
526 a = random.randint(-(1 << bits), 1 << bits)
527 bits = random.randint(0, LIMIT)
528 b = random.randint(-(1 << bits), 1 << bits)
529 c = a * b
530 print('zsets(a, "%i");' % a)
531 print('zsets(b, "%i");' % b)
532 print('zsets(d, "%i");' % c)
533 print('zmul(c, a, b);')
534 print('assert(zcmp(c, d), == 0);')
535 print('zmul(c, b, a);')
536 print('assert(zcmp(c, d), == 0);')
537 print('zmul(a, a, b);')
538 print('assert(zcmp(a, d), == 0);')
539 print('zsets(a, "%i");' % a)
540 print('zmul(b, a, b);')
541 print('assert(zcmp(b, d), == 0);')
542 c = a * a
543 print('zsets(d, "%i");' % c)
544 print('zmul(c, a, a);')
545 print('assert(zcmp(c, d), == 0);')
546 print('zmul(a, a, a);')
547 print('assert(zcmp(a, d), == 0);')
548
549 def zsqr():
550 bits = random.randint(0, LIMIT)
551 a = random.randint(-(1 << bits), 1 << bits)
552 c = a * a
553 print('zsets(a, "%i");' % a)
554 print('zsets(d, "%i");' % c)
555 print('zsqr(c, a);')
556 print('assert(zcmp(c, d), == 0);')
557 print('zsqr(a, a);')
558 print('assert(zcmp(a, d), == 0);')
559
560 def zmodmul():
561 bits = random.randint(0, LIMIT)
562 a = random.randint(-(1 << bits), 1 << bits)
563 bits = random.randint(0, LIMIT)
564 b = random.randint(-(1 << bits), 1 << bits)
565 bits = random.randint(0, LIMIT)
566 c = 0
567 while c == 0:
568 c = random.randint(-(1 << bits), 1 << bits)
569 d = mod(a * b, c)
570 print('zsets(a, "%i");' % a)
571 print('zsets(b, "%i");' % b)
572 print('zsets(c, "%i");' % c)
573 print('zmodmul(d, a, b, c);')
574 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
575 print('zmodmul(a, a, b, c);')
576 print('assert_s(zstr(a, buf, BUF_N), "%i");' % d)
577 print('zsets(a, "%i");' % a)
578 print('zmodmul(b, a, b, c);')
579 print('assert_s(zstr(b, buf, BUF_N), "%i");' % d)
580 print('zsets(b, "%i");' % b)
581 print('zmodmul(c, a, b, c);')
582 print('assert_s(zstr(c, buf, BUF_N), "%i");' % d)
583 print('zsets(c, "%i");' % c)
584 print('zmodmul(d, b, a, c);')
585 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
586 print('zmodmul(a, b, a, c);')
587 print('assert_s(zstr(a, buf, BUF_N), "%i");' % d)
588 print('zsets(a, "%i");' % a)
589 print('zmodmul(b, b, a, c);')
590 print('assert_s(zstr(b, buf, BUF_N), "%i");' % d)
591 print('zsets(b, "%i");' % b)
592 print('zmodmul(c, b, a, c);')
593 print('assert_s(zstr(c, buf, BUF_N), "%i");' % d)
594 print('zsets(c, "%i");' % c)
595 d = mod(a * a, c)
596 print('zmodmul(d, a, a, c);')
597 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
598 print('zmodmul(a, a, a, c);')
599 print('assert_s(zstr(a, buf, BUF_N), "%i");' % d)
600 print('zsets(a, "%i");' % a)
601 print('zmodmul(c, a, a, c);')
602 print('assert_s(zstr(c, buf, BUF_N), "%i");' % d)
603 if a != 0:
604 d = mod(a * b, a)
605 print('zsets(d, "%i");' % d)
606 print('zmodmul(c, a, b, a);')
607 print('assert_s(zstr(c, buf, BUF_N), "%i");' % d)
608 print('zmodmul(a, a, b, a);')
609 print('assert_s(zstr(a, buf, BUF_N), "%i");' % d)
610 print('zsets(a, "%i");' % a)
611 print('zmodmul(b, a, b, a);')
612 print('assert_s(zstr(b, buf, BUF_N), "%i");' % d)
613 print('zsets(b, "%i");' % b)
614 print('zmodmul(c, b, a, a);')
615 print('assert_s(zstr(c, buf, BUF_N), "%i");' % d)
616 print('zmodmul(a, b, a, a);')
617 print('assert_s(zstr(a, buf, BUF_N), "%i");' % d)
618 print('zsets(a, "%i");' % a)
619 print('zmodmul(b, b, a, a);')
620 print('assert_s(zstr(b, buf, BUF_N), "%i");' % d)
621 print('zmodmul(b, a, a, a);')
622 print('assert(zzero(b), == 1);')
623 print('zmodmul(a, a, a, a);')
624 print('assert(zzero(a), == 1);')
625
626 def zmodsqr():
627 bits = random.randint(0, LIMIT)
628 a = random.randint(-(1 << bits), 1 << bits)
629 bits = random.randint(0, LIMIT)
630 b = 0
631 while b == 0:
632 b = random.randint(-(1 << bits), 1 << bits)
633 c = mod(a ** 2, b)
634 print('zsets(a, "%i");' % a)
635 print('zsets(b, "%i");' % b)
636 print('zsets(d, "%i");' % c)
637 print('zmodsqr(c, a, b);')
638 print('assert(zcmp(c, d), == 0);')
639 print('zset(c, a);')
640 print('zmodsqr(a, a, b);')
641 print('assert(zcmp(a, d), == 0);')
642 print('zset(a, c);')
643 print('zset(c, b);')
644 print('zmodsqr(b, a, b);')
645 print('assert(zcmp(b, d), == 0);')
646 if a != 0:
647 c = mod(a ** 2, a)
648 print('zmodsqr(b, a, a);')
649 print('assert(zzero(b), == 1);')
650 print('zmodsqr(a, a, a);')
651 print('assert(zzero(a), == 1);')
652
653 def zcmpi():
654 bits = random.randint(0, LIMIT)
655 a = random.randint(-(1 << bits), 1 << bits)
656 b = random.randint(-(1 << 63), (1 << 63) - 1)
657 c = -1 if a < b else (1 if a > b else 0)
658 print('zsets(a, "%i");' % a)
659 if b >= 0:
660 print('assert(zcmpi(a, %iLL), == %i);' % (b, c))
661 else:
662 print('assert(zcmpi(a, %iLL - 1LL), == %i);' % (b + 1, c))
663
664 def zcmpu():
665 bits = random.randint(0, LIMIT)
666 a = random.randint(-(1 << bits), 1 << bits)
667 b = random.randint(0, (1 << 64) - 1)
668 c = -1 if a < b else (1 if a > b else 0)
669 print('zsets(a, "%i");' % a)
670 print('assert(zcmpu(a, %iULL), == %i);' % (b, c))
671
672 def zgcd():
673 bits = random.randint(0, LIMIT)
674 a = random.randint(-(1 << bits), 1 << bits)
675 bits = random.randint(0, LIMIT)
676 b = random.randint(-(1 << bits), 1 << bits)
677 c = gcd(a, b)
678 print('zsets(a, "%i");' % a)
679 print('zsets(b, "%i");' % b)
680 print('zsets(d, "%i");' % c)
681 print('zgcd(c, a, b);')
682 print('assert(zcmp(c, d), == 0);')
683
684 def zpow():
685 bits = random.randint(0, LIMIT)
686 a = random.randint(-(1 << bits), 1 << bits)
687 b = random.randint(1, 16)
688 c = a ** b
689 print('zsets(a, "%i");' % a)
690 print('zsetu(b, %i);' % b)
691 print('zsets(d, "%i");' % c)
692 print('zpow(c, a, b);')
693 print('zpow(a, a, b);')
694 print('assert(zcmp(c, d), == 0);')
695 print('assert(zcmp(a, d), == 0);')
696 print('zsets(a, "%i");' % a)
697 print('zpow(b, a, b);')
698 print('assert(zcmp(b, d), == 0);')
699
700 def zpowu():
701 bits = random.randint(0, LIMIT)
702 a = random.randint(-(1 << bits), 1 << bits)
703 b = random.randint(1, 16)
704 c = a ** b
705 print('zsets(a, "%i");' % a)
706 print('zsets(d, "%i");' % c)
707 print('zpowu(c, a, %i);' % b)
708 print('zpowu(a, a, %i);' % b)
709 print('assert(zcmp(c, d), == 0);')
710 print('assert(zcmp(a, d), == 0);')
711
712 def zmodpowu():
713 bits = random.randint(0, LIMIT)
714 a = random.randint(-(1 << bits), 1 << bits)
715 b = random.randint(1, 16)
716 bits = random.randint(0, LIMIT)
717 c = 0
718 while c == 0:
719 c = random.randint(-(1 << bits), 1 << bits)
720 d = mod(a ** b, c)
721 print('zsets(a, "%i");' % a)
722 print('zsets(c, "%i");' % c)
723 print('zsets(d, "%i");' % d)
724 print('zmodpowu(b, a, %i, c);' % b)
725 print('zmodpowu(a, a, %i, c);' % b)
726 print('assert(zcmp(b, d), == 0);')
727 print('assert(zcmp(a, d), == 0);')
728 print('zsets(a, "%i");' % a)
729 print('zmodpowu(c, a, %i, c);' % b)
730 print('assert(zcmp(c, d), == 0);')
731
732 def zmodpow():
733 bits = random.randint(0, LIMIT)
734 a = random.randint(-(1 << bits), 1 << bits)
735 b = random.randint(1, 16)
736 bits = random.randint(0, LIMIT)
737 c = 0
738 while c == 0:
739 c = random.randint(-(1 << bits), 1 << bits)
740 d = mod(a ** b, c)
741 print('zsets(a, "%i");' % a)
742 print('zsets(b, "%i");' % b)
743 print('zsets(c, "%i");' % c)
744 print('zsets(d, "%i");' % d)
745 print('zmodpow(d, a, b, c);')
746 print('zmodpow(a, a, b, c);')
747 print('assert_s(zstr(d, buf, BUF_N), "%i");' % d)
748 print('assert(zcmp(a, d), == 0);')
749 print('zsets(a, "%i");' % a)
750 print('zmodpow(b, a, b, c);')
751 print('assert(zcmp(b, d), == 0);')
752 print('zsets(b, "%i");' % b)
753 print('zmodpow(c, a, b, c);')
754 print('assert(zcmp(c, d), == 0);')
755
756 def znot():
757 bits = random.randint(0, LIMIT)
758 a = random.randint(-(1 << bits), 1 << bits)
759 sign = -(-1 if a < 0 else 1)
760 b = abs(a)
761 bits = 0
762 x = b
763 while x > 0:
764 bits += 1
765 x >>= 1
766 b = ~b
767 b &= (1 << bits) - 1
768 b *= sign
769 print('zsets(a, "%i");' % a)
770 print('zsets(c, "%i");' % b)
771 print('znot(b, a);')
772 print('znot(a, a);')
773 print('assert(zcmp(b, c), == 0);')
774 print('assert(zcmp(a, c), == 0);')
775
776 def zsave_zload():
777 bits = random.randint(0, LIMIT)
778 a = random.randint(-(1 << bits), 1 << bits)
779 print('zsets(a, "%i");' % a)
780 print('n = zsave(a, 0);')
781 print('assert_zu(zsave(a, buf), n);')
782 print('assert_zu(zload(b, buf), n);')
783 print('assert(zcmp(a, b), == 0);')
784
785
786
787 functions = [zzero, zsignum, zeven_nonzero, zodd_nonzero, zeven, zcmp, z…
788 zodd, zabs, zneg, zlsh, zrsh, ztrunc, zsplit, zand, zor, zx…
789 zbtest, zbset, zadd_unsigned, zsub_unsigned, zadd, zsub, zm…
790 zdiv, zmod, zmodmul, zmodsqr, zsave_zload, zgcd, zpow, zpow…
791 zstr_length, zstr] # untested: zptest, zrand
792
793 limits = [200]
794
795 for LIMIT in limits:
796 for function in functions:
797 print('/* %s */' % function.__qualname__)
798 for i in range(100):
799 function()
800 print()
801 print()
802
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.