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, 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