test-generate.py - libzahl - big integer library
 (HTM) git clone git://git.suckless.org/libzahl
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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