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, zcmpi, zcmpu, zcmpmag, 788 zodd, zabs, zneg, zlsh, zrsh, ztrunc, zsplit, zand, zor, zxor, zbits, zlsb, znot, 789 zbtest, zbset, zadd_unsigned, zsub_unsigned, zadd, zsub, zmul, zsqr, zdivmod, 790 zdiv, zmod, zmodmul, zmodsqr, zsave_zload, zgcd, zpow, zpowu, zmodpow, zmodpowu, 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