17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <mp.h>
47dd7cddfSDavid du Colombier #include "dat.h"
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier int loops = 1;
77dd7cddfSDavid du Colombier
87dd7cddfSDavid du Colombier long randomreg;
97dd7cddfSDavid du Colombier
107dd7cddfSDavid du Colombier void
srand(long seed)117dd7cddfSDavid du Colombier srand(long seed)
127dd7cddfSDavid du Colombier {
137dd7cddfSDavid du Colombier randomreg = seed;
147dd7cddfSDavid du Colombier }
157dd7cddfSDavid du Colombier
167dd7cddfSDavid du Colombier long
lrand(void)177dd7cddfSDavid du Colombier lrand(void)
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier randomreg = randomreg*104381 + 81761;
207dd7cddfSDavid du Colombier return randomreg;
217dd7cddfSDavid du Colombier }
227dd7cddfSDavid du Colombier
237dd7cddfSDavid du Colombier void
prng(uchar * p,int n)247dd7cddfSDavid du Colombier prng(uchar *p, int n)
257dd7cddfSDavid du Colombier {
267dd7cddfSDavid du Colombier while(n-- > 0)
277dd7cddfSDavid du Colombier *p++ = lrand();
287dd7cddfSDavid du Colombier }
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier void
testconv(char * str)317dd7cddfSDavid du Colombier testconv(char *str)
327dd7cddfSDavid du Colombier {
337dd7cddfSDavid du Colombier mpint *b;
347dd7cddfSDavid du Colombier char *p;
357dd7cddfSDavid du Colombier
367dd7cddfSDavid du Colombier b = strtomp(str, nil, 16, nil);
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier p = mptoa(b, 10, nil, 0);
397dd7cddfSDavid du Colombier print("%s = ", p);
407dd7cddfSDavid du Colombier strtomp(p, nil, 10, b);
417dd7cddfSDavid du Colombier free(p);
427dd7cddfSDavid du Colombier print("%B\n", b);
437dd7cddfSDavid du Colombier
447dd7cddfSDavid du Colombier p = mptoa(b, 16, nil, 0);
457dd7cddfSDavid du Colombier print("%s = ", p);
467dd7cddfSDavid du Colombier strtomp(p, nil, 16, b);
477dd7cddfSDavid du Colombier free(p);
487dd7cddfSDavid du Colombier print("%B\n", b);
497dd7cddfSDavid du Colombier
507dd7cddfSDavid du Colombier p = mptoa(b, 32, nil, 0);
517dd7cddfSDavid du Colombier print("%s = ", p);
527dd7cddfSDavid du Colombier strtomp(p, nil, 32, b);
537dd7cddfSDavid du Colombier free(p);
547dd7cddfSDavid du Colombier print("%B\n", b);
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier p = mptoa(b, 64, nil, 0);
577dd7cddfSDavid du Colombier print("%s = ", p);
587dd7cddfSDavid du Colombier strtomp(p, nil, 64, b);
597dd7cddfSDavid du Colombier free(p);
607dd7cddfSDavid du Colombier print("%B\n", b);
617dd7cddfSDavid du Colombier
627dd7cddfSDavid du Colombier mpfree(b);
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier void
testshift(char * str)667dd7cddfSDavid du Colombier testshift(char *str)
677dd7cddfSDavid du Colombier {
687dd7cddfSDavid du Colombier mpint *b1, *b2;
697dd7cddfSDavid du Colombier int i;
707dd7cddfSDavid du Colombier
717dd7cddfSDavid du Colombier b1 = strtomp(str, nil, 16, nil);
727dd7cddfSDavid du Colombier b2 = mpnew(0);
737dd7cddfSDavid du Colombier for(i = 0; i < 64; i++){
747dd7cddfSDavid du Colombier mpleft(b1, i, b2);
757dd7cddfSDavid du Colombier print("%2.2d %B\n", i, b2);
767dd7cddfSDavid du Colombier }
777dd7cddfSDavid du Colombier for(i = 0; i < 64; i++){
787dd7cddfSDavid du Colombier mpright(b2, i, b1);
797dd7cddfSDavid du Colombier print("%2.2d %B\n", i, b1);
807dd7cddfSDavid du Colombier }
817dd7cddfSDavid du Colombier mpfree(b1);
827dd7cddfSDavid du Colombier mpfree(b2);
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier
857dd7cddfSDavid du Colombier void
testaddsub(char * str)867dd7cddfSDavid du Colombier testaddsub(char *str)
877dd7cddfSDavid du Colombier {
887dd7cddfSDavid du Colombier mpint *b1, *b2;
897dd7cddfSDavid du Colombier int i;
907dd7cddfSDavid du Colombier
917dd7cddfSDavid du Colombier b1 = strtomp(str, nil, 16, nil);
927dd7cddfSDavid du Colombier b2 = mpnew(0);
937dd7cddfSDavid du Colombier for(i = 0; i < 16; i++){
947dd7cddfSDavid du Colombier mpadd(b1, b2, b2);
957dd7cddfSDavid du Colombier print("%2.2d %B\n", i, b2);
967dd7cddfSDavid du Colombier }
977dd7cddfSDavid du Colombier for(i = 0; i < 16; i++){
987dd7cddfSDavid du Colombier mpsub(b2, b1, b2);
997dd7cddfSDavid du Colombier print("%2.2d %B\n", i, b2);
1007dd7cddfSDavid du Colombier }
1017dd7cddfSDavid du Colombier mpfree(b1);
1027dd7cddfSDavid du Colombier mpfree(b2);
1037dd7cddfSDavid du Colombier }
1047dd7cddfSDavid du Colombier
1057dd7cddfSDavid du Colombier void
testvecdigmuladd(char * str,mpdigit d)1067dd7cddfSDavid du Colombier testvecdigmuladd(char *str, mpdigit d)
1077dd7cddfSDavid du Colombier {
1087dd7cddfSDavid du Colombier mpint *b, *b2;
1097dd7cddfSDavid du Colombier int i;
1107dd7cddfSDavid du Colombier vlong now;
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombier b = strtomp(str, nil, 16, nil);
1137dd7cddfSDavid du Colombier b2 = mpnew(0);
1147dd7cddfSDavid du Colombier
1157dd7cddfSDavid du Colombier mpbits(b2, (b->top+1)*Dbits);
1167dd7cddfSDavid du Colombier now = nsec();
1177dd7cddfSDavid du Colombier for(i = 0; i < loops; i++){
1187dd7cddfSDavid du Colombier memset(b2->p, 0, b2->top*Dbytes);
1197dd7cddfSDavid du Colombier mpvecdigmuladd(b->p, b->top, d, b2->p);
1207dd7cddfSDavid du Colombier }
1217dd7cddfSDavid du Colombier if(loops > 1)
1227dd7cddfSDavid du Colombier print("%lld ns for a %d*%d vecdigmul\n", (nsec()-now)/loops, b->top*Dbits, Dbits);
1237dd7cddfSDavid du Colombier mpnorm(b2);
1247dd7cddfSDavid du Colombier print("0 + %B * %ux = %B\n", b, d, b2);
1257dd7cddfSDavid du Colombier
1267dd7cddfSDavid du Colombier mpfree(b);
1277dd7cddfSDavid du Colombier mpfree(b2);
1287dd7cddfSDavid du Colombier }
1297dd7cddfSDavid du Colombier
1307dd7cddfSDavid du Colombier void
testvecdigmulsub(char * str,mpdigit d)1317dd7cddfSDavid du Colombier testvecdigmulsub(char *str, mpdigit d)
1327dd7cddfSDavid du Colombier {
1337dd7cddfSDavid du Colombier mpint *b, *b2;
1347dd7cddfSDavid du Colombier int i;
1357dd7cddfSDavid du Colombier vlong now;
1367dd7cddfSDavid du Colombier
1377dd7cddfSDavid du Colombier b = strtomp(str, nil, 16, nil);
1387dd7cddfSDavid du Colombier b2 = mpnew(0);
1397dd7cddfSDavid du Colombier
1407dd7cddfSDavid du Colombier mpbits(b2, (b->top+1)*Dbits);
1417dd7cddfSDavid du Colombier now = nsec();
1427dd7cddfSDavid du Colombier for(i = 0; i < loops; i++){
1437dd7cddfSDavid du Colombier memset(b2->p, 0, b2->top*Dbytes);
1447dd7cddfSDavid du Colombier mpvecdigmulsub(b->p, b->top, d, b2->p);
1457dd7cddfSDavid du Colombier }
1467dd7cddfSDavid du Colombier if(loops > 1)
1477dd7cddfSDavid du Colombier print("%lld ns for a %d*%d vecdigmul\n", (nsec()-now)/loops, b->top*Dbits, Dbits);
1487dd7cddfSDavid du Colombier mpnorm(b2);
1497dd7cddfSDavid du Colombier print("0 - %B * %ux = %B\n", b, d, b2);
1507dd7cddfSDavid du Colombier
1517dd7cddfSDavid du Colombier mpfree(b);
1527dd7cddfSDavid du Colombier mpfree(b2);
1537dd7cddfSDavid du Colombier }
1547dd7cddfSDavid du Colombier
1557dd7cddfSDavid du Colombier void
testmul(char * str)1567dd7cddfSDavid du Colombier testmul(char *str)
1577dd7cddfSDavid du Colombier {
1587dd7cddfSDavid du Colombier mpint *b, *b1, *b2;
1597dd7cddfSDavid du Colombier vlong now;
1607dd7cddfSDavid du Colombier int i;
1617dd7cddfSDavid du Colombier
1627dd7cddfSDavid du Colombier b = strtomp(str, nil, 16, nil);
1637dd7cddfSDavid du Colombier b1 = mpcopy(b);
1647dd7cddfSDavid du Colombier b2 = mpnew(0);
1657dd7cddfSDavid du Colombier
1667dd7cddfSDavid du Colombier now = nsec();
1677dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
1687dd7cddfSDavid du Colombier mpmul(b, b1, b2);
1697dd7cddfSDavid du Colombier if(loops > 1)
1707dd7cddfSDavid du Colombier print("%lld µs for a %d*%d mult\n", (nsec()-now)/(loops*1000),
1717dd7cddfSDavid du Colombier b->top*Dbits, b1->top*Dbits);
1727dd7cddfSDavid du Colombier print("%B * %B = %B\n", b, b1, b2);
1737dd7cddfSDavid du Colombier
1747dd7cddfSDavid du Colombier mpfree(b);
1757dd7cddfSDavid du Colombier mpfree(b1);
1767dd7cddfSDavid du Colombier mpfree(b2);
1777dd7cddfSDavid du Colombier }
1787dd7cddfSDavid du Colombier
1797dd7cddfSDavid du Colombier void
testmul2(mpint * b,mpint * b1)1807dd7cddfSDavid du Colombier testmul2(mpint *b, mpint *b1)
1817dd7cddfSDavid du Colombier {
1827dd7cddfSDavid du Colombier mpint *b2;
1837dd7cddfSDavid du Colombier vlong now;
1847dd7cddfSDavid du Colombier int i;
1857dd7cddfSDavid du Colombier
1867dd7cddfSDavid du Colombier b2 = mpnew(0);
1877dd7cddfSDavid du Colombier
1887dd7cddfSDavid du Colombier now = nsec();
1897dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
1907dd7cddfSDavid du Colombier mpmul(b, b1, b2);
1917dd7cddfSDavid du Colombier if(loops > 1)
1927dd7cddfSDavid du Colombier print("%lld µs for a %d*%d mult\n", (nsec()-now)/(loops*1000), b->top*Dbits, b1->top*Dbits);
1937dd7cddfSDavid du Colombier print("%B * ", b);
1947dd7cddfSDavid du Colombier print("%B = ", b1);
1957dd7cddfSDavid du Colombier print("%B\n", b2);
1967dd7cddfSDavid du Colombier
1977dd7cddfSDavid du Colombier mpfree(b2);
1987dd7cddfSDavid du Colombier }
1997dd7cddfSDavid du Colombier
2007dd7cddfSDavid du Colombier void
testdigdiv(char * str,mpdigit d)2017dd7cddfSDavid du Colombier testdigdiv(char *str, mpdigit d)
2027dd7cddfSDavid du Colombier {
2037dd7cddfSDavid du Colombier mpint *b;
2047dd7cddfSDavid du Colombier mpdigit q;
2057dd7cddfSDavid du Colombier int i;
2067dd7cddfSDavid du Colombier vlong now;
2077dd7cddfSDavid du Colombier
2087dd7cddfSDavid du Colombier b = strtomp(str, nil, 16, nil);
2097dd7cddfSDavid du Colombier now = nsec();
2107dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
2117dd7cddfSDavid du Colombier mpdigdiv(b->p, d, &q);
2127dd7cddfSDavid du Colombier if(loops > 1)
2137dd7cddfSDavid du Colombier print("%lld ns for a %d / %d div\n", (nsec()-now)/loops, 2*Dbits, Dbits);
2147dd7cddfSDavid du Colombier print("%B / %ux = %ux\n", b, d, q);
2157dd7cddfSDavid du Colombier mpfree(b);
2167dd7cddfSDavid du Colombier }
2177dd7cddfSDavid du Colombier
2187dd7cddfSDavid du Colombier void
testdiv(mpint * x,mpint * y)2197dd7cddfSDavid du Colombier testdiv(mpint *x, mpint *y)
2207dd7cddfSDavid du Colombier {
2217dd7cddfSDavid du Colombier mpint *b2, *b3;
2227dd7cddfSDavid du Colombier vlong now;
2237dd7cddfSDavid du Colombier int i;
2247dd7cddfSDavid du Colombier
2257dd7cddfSDavid du Colombier b2 = mpnew(0);
2267dd7cddfSDavid du Colombier b3 = mpnew(0);
2277dd7cddfSDavid du Colombier now = nsec();
2287dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
2297dd7cddfSDavid du Colombier mpdiv(x, y, b2, b3);
2307dd7cddfSDavid du Colombier if(loops > 1)
2317dd7cddfSDavid du Colombier print("%lld µs for a %d/%d div\n", (nsec()-now)/(1000*loops),
2327dd7cddfSDavid du Colombier x->top*Dbits, y->top*Dbits);
2337dd7cddfSDavid du Colombier print("%B / %B = %B %B\n", x, y, b2, b3);
2347dd7cddfSDavid du Colombier mpfree(b2);
2357dd7cddfSDavid du Colombier mpfree(b3);
2367dd7cddfSDavid du Colombier }
2377dd7cddfSDavid du Colombier
2387dd7cddfSDavid du Colombier void
testmod(mpint * x,mpint * y)2397dd7cddfSDavid du Colombier testmod(mpint *x, mpint *y)
2407dd7cddfSDavid du Colombier {
2417dd7cddfSDavid du Colombier mpint *r;
2427dd7cddfSDavid du Colombier vlong now;
2437dd7cddfSDavid du Colombier int i;
2447dd7cddfSDavid du Colombier
2457dd7cddfSDavid du Colombier r = mpnew(0);
2467dd7cddfSDavid du Colombier now = nsec();
2477dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
2487dd7cddfSDavid du Colombier mpmod(x, y, r);
2497dd7cddfSDavid du Colombier if(loops > 1)
2507dd7cddfSDavid du Colombier print("%lld µs for a %d/%d mod\n", (nsec()-now)/(1000*loops),
2517dd7cddfSDavid du Colombier x->top*Dbits, y->top*Dbits);
2527dd7cddfSDavid du Colombier print("%B mod %B = %B\n", x, y, r);
2537dd7cddfSDavid du Colombier mpfree(r);
2547dd7cddfSDavid du Colombier }
2557dd7cddfSDavid du Colombier
2567dd7cddfSDavid du Colombier void
testinvert(mpint * x,mpint * y)2577dd7cddfSDavid du Colombier testinvert(mpint *x, mpint *y)
2587dd7cddfSDavid du Colombier {
259*59cc4ca5SDavid du Colombier mpint *r, *d1, *d2;
2607dd7cddfSDavid du Colombier vlong now;
2617dd7cddfSDavid du Colombier int i;
2627dd7cddfSDavid du Colombier
2637dd7cddfSDavid du Colombier r = mpnew(0);
264*59cc4ca5SDavid du Colombier d1 = mpnew(0);
265*59cc4ca5SDavid du Colombier d2 = mpnew(0);
2667dd7cddfSDavid du Colombier now = nsec();
267*59cc4ca5SDavid du Colombier mpextendedgcd(x, y, r, d1, d2);
268*59cc4ca5SDavid du Colombier mpdiv(x, r, x, d1);
269*59cc4ca5SDavid du Colombier mpdiv(y, r, y, d1);
2707dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
2717dd7cddfSDavid du Colombier mpinvert(x, y, r);
2727dd7cddfSDavid du Colombier if(loops > 1)
2737dd7cddfSDavid du Colombier print("%lld µs for a %d in %d invert\n", (nsec()-now)/(1000*loops),
2747dd7cddfSDavid du Colombier x->top*Dbits, y->top*Dbits);
2757dd7cddfSDavid du Colombier print("%B**-1 mod %B = %B\n", x, y, r);
276*59cc4ca5SDavid du Colombier mpmul(r, x, d1);
277*59cc4ca5SDavid du Colombier mpmod(d1, y, d2);
278*59cc4ca5SDavid du Colombier print("%B*%B mod %B = %B\n", x, r, y, d2);
2797dd7cddfSDavid du Colombier mpfree(r);
280*59cc4ca5SDavid du Colombier mpfree(d1);
281*59cc4ca5SDavid du Colombier mpfree(d2);
2827dd7cddfSDavid du Colombier }
2837dd7cddfSDavid du Colombier
2847dd7cddfSDavid du Colombier void
testsub1(char * a,char * b)2857dd7cddfSDavid du Colombier testsub1(char *a, char *b)
2867dd7cddfSDavid du Colombier {
2877dd7cddfSDavid du Colombier mpint *b1, *b2, *b3;
2887dd7cddfSDavid du Colombier
2897dd7cddfSDavid du Colombier b1 = strtomp(a, nil, 16, nil);
2907dd7cddfSDavid du Colombier b2 = strtomp(b, nil, 16, nil);
2917dd7cddfSDavid du Colombier b3 = mpnew(0);
2927dd7cddfSDavid du Colombier mpsub(b1, b2, b3);
2937dd7cddfSDavid du Colombier print("%B - %B = %B\n", b1, b2, b3);
2947dd7cddfSDavid du Colombier }
2957dd7cddfSDavid du Colombier
2967dd7cddfSDavid du Colombier void
testmul1(char * a,char * b)2977dd7cddfSDavid du Colombier testmul1(char *a, char *b)
2987dd7cddfSDavid du Colombier {
2997dd7cddfSDavid du Colombier mpint *b1, *b2, *b3;
3007dd7cddfSDavid du Colombier
3017dd7cddfSDavid du Colombier b1 = strtomp(a, nil, 16, nil);
3027dd7cddfSDavid du Colombier b2 = strtomp(b, nil, 16, nil);
3037dd7cddfSDavid du Colombier b3 = mpnew(0);
3047dd7cddfSDavid du Colombier mpmul(b1, b2, b3);
3057dd7cddfSDavid du Colombier print("%B * %B = %B\n", b1, b2, b3);
3067dd7cddfSDavid du Colombier }
3077dd7cddfSDavid du Colombier
3087dd7cddfSDavid du Colombier void
testexp(char * base,char * exp,char * mod)3097dd7cddfSDavid du Colombier testexp(char *base, char *exp, char *mod)
3107dd7cddfSDavid du Colombier {
3117dd7cddfSDavid du Colombier mpint *b, *e, *m, *res;
3127dd7cddfSDavid du Colombier int i;
3137dd7cddfSDavid du Colombier uvlong now;
3147dd7cddfSDavid du Colombier
3157dd7cddfSDavid du Colombier b = strtomp(base, nil, 16, nil);
3167dd7cddfSDavid du Colombier e = strtomp(exp, nil, 16, nil);
3177dd7cddfSDavid du Colombier res = mpnew(0);
3187dd7cddfSDavid du Colombier if(mod != nil)
3197dd7cddfSDavid du Colombier m = strtomp(mod, nil, 16, nil);
3207dd7cddfSDavid du Colombier else
3217dd7cddfSDavid du Colombier m = nil;
3227dd7cddfSDavid du Colombier now = nsec();
3237dd7cddfSDavid du Colombier for(i = 0; i < loops; i++)
3247dd7cddfSDavid du Colombier mpexp(b, e, m, res);
3257dd7cddfSDavid du Colombier if(loops > 1)
3267dd7cddfSDavid du Colombier print("%ulldµs for a %d to the %d bit exp\n", (nsec()-now)/(loops*1000),
3277dd7cddfSDavid du Colombier b->top*Dbits, e->top*Dbits);
3287dd7cddfSDavid du Colombier if(m != nil)
329*59cc4ca5SDavid du Colombier print("%B ^ %B mod %B == %B\n", b, e, m, res);
3307dd7cddfSDavid du Colombier else
331*59cc4ca5SDavid du Colombier print("%B ^ %B == %B\n", b, e, res);
3327dd7cddfSDavid du Colombier mpfree(b);
3337dd7cddfSDavid du Colombier mpfree(e);
3347dd7cddfSDavid du Colombier mpfree(res);
3357dd7cddfSDavid du Colombier if(m != nil)
3367dd7cddfSDavid du Colombier mpfree(m);
3377dd7cddfSDavid du Colombier }
3387dd7cddfSDavid du Colombier
3397dd7cddfSDavid du Colombier void
testgcd(void)3407dd7cddfSDavid du Colombier testgcd(void)
3417dd7cddfSDavid du Colombier {
3427dd7cddfSDavid du Colombier mpint *a, *b, *d, *x, *y, *t1, *t2;
3437dd7cddfSDavid du Colombier int i;
3447dd7cddfSDavid du Colombier uvlong now, then;
3457dd7cddfSDavid du Colombier uvlong etime;
3467dd7cddfSDavid du Colombier
3477dd7cddfSDavid du Colombier d = mpnew(0);
3487dd7cddfSDavid du Colombier x = mpnew(0);
3497dd7cddfSDavid du Colombier y = mpnew(0);
3507dd7cddfSDavid du Colombier t1 = mpnew(0);
3517dd7cddfSDavid du Colombier t2 = mpnew(0);
3527dd7cddfSDavid du Colombier
3537dd7cddfSDavid du Colombier etime = 0;
3547dd7cddfSDavid du Colombier
3557dd7cddfSDavid du Colombier a = strtomp("4EECAB3E04C4E6BC1F49D438731450396BF272B4D7B08F91C38E88ADCD281699889AFF872E2204C80CCAA8E460797103DE539D5DF8335A9B20C0B44886384F134C517287202FCA914D8A5096446B40CD861C641EF9C2730CB057D7B133F4C2B16BBD3D75FDDBD9151AAF0F9144AAA473AC93CF945DBFE0859FB685D5CBD0A8B3", nil, 16, nil);
3567dd7cddfSDavid du Colombier b = strtomp("C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBDB12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A863A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D93D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D", nil, 16, nil);
3577dd7cddfSDavid du Colombier mpextendedgcd(a, b, d, x, y);
3587dd7cddfSDavid du Colombier print("gcd %B*%B+%B*%B = %B?\n", a, x, b, y, d);
3597dd7cddfSDavid du Colombier mpfree(a);
3607dd7cddfSDavid du Colombier mpfree(b);
3617dd7cddfSDavid du Colombier
3627dd7cddfSDavid du Colombier for(i = 0; i < loops; i++){
3637dd7cddfSDavid du Colombier a = mprand(2048, prng, nil);
3647dd7cddfSDavid du Colombier b = mprand(2048, prng, nil);
3657dd7cddfSDavid du Colombier then = nsec();
3667dd7cddfSDavid du Colombier mpextendedgcd(a, b, d, x, y);
3677dd7cddfSDavid du Colombier now = nsec();
3687dd7cddfSDavid du Colombier etime += now-then;
3697dd7cddfSDavid du Colombier mpmul(a, x, t1);
3707dd7cddfSDavid du Colombier mpmul(b, y, t2);
3717dd7cddfSDavid du Colombier mpadd(t1, t2, t2);
3727dd7cddfSDavid du Colombier if(mpcmp(d, t2) != 0)
3737dd7cddfSDavid du Colombier print("%d gcd %B*%B+%B*%B != %B\n", i, a, x, b, y, d);
3747dd7cddfSDavid du Colombier // else
3757dd7cddfSDavid du Colombier // print("%d euclid %B*%B+%B*%B == %B\n", i, a, x, b, y, d);
3767dd7cddfSDavid du Colombier mpfree(a);
3777dd7cddfSDavid du Colombier mpfree(b);
3787dd7cddfSDavid du Colombier }
3797dd7cddfSDavid du Colombier
3807dd7cddfSDavid du Colombier mpfree(x);
3817dd7cddfSDavid du Colombier mpfree(y);
3827dd7cddfSDavid du Colombier mpfree(d);
3837dd7cddfSDavid du Colombier mpfree(t1);
3847dd7cddfSDavid du Colombier mpfree(t2);
3857dd7cddfSDavid du Colombier
3867dd7cddfSDavid du Colombier if(loops > 1)
3877dd7cddfSDavid du Colombier print("binary %llud\n", etime);
3887dd7cddfSDavid du Colombier }
3897dd7cddfSDavid du Colombier
390*59cc4ca5SDavid du Colombier extern int _unnormalizedwarning = 1;
391*59cc4ca5SDavid du Colombier
3927dd7cddfSDavid du Colombier void
main(int argc,char ** argv)3937dd7cddfSDavid du Colombier main(int argc, char **argv)
3947dd7cddfSDavid du Colombier {
3957dd7cddfSDavid du Colombier mpint *x, *y;
3967dd7cddfSDavid du Colombier
3977dd7cddfSDavid du Colombier ARGBEGIN{
3987dd7cddfSDavid du Colombier case 'n':
3997dd7cddfSDavid du Colombier loops = atoi(ARGF());
4007dd7cddfSDavid du Colombier break;
4017dd7cddfSDavid du Colombier }ARGEND;
4027dd7cddfSDavid du Colombier
4037dd7cddfSDavid du Colombier fmtinstall('B', mpconv);
4047dd7cddfSDavid du Colombier fmtinstall('Q', mpconv);
4057dd7cddfSDavid du Colombier srand(0);
4067dd7cddfSDavid du Colombier mpsetminbits(2*Dbits);
4077dd7cddfSDavid du Colombier testshift("1111111111111111");
4087dd7cddfSDavid du Colombier testaddsub("fffffffffffffffff");
4097dd7cddfSDavid du Colombier testdigdiv("1234567812345678", 0x76543218);
4107dd7cddfSDavid du Colombier testdigdiv("1ffff", 0xffff);
4117dd7cddfSDavid du Colombier testdigdiv("ffff", 0xffff);
4127dd7cddfSDavid du Colombier testdigdiv("fff", 0xffff);
4137dd7cddfSDavid du Colombier testdigdiv("effffffff", 0xffff);
4147dd7cddfSDavid du Colombier testdigdiv("ffffffff", 0x1);
4157dd7cddfSDavid du Colombier testdigdiv("ffffffff", 0);
4167dd7cddfSDavid du Colombier testdigdiv("200000000", 2);
4177dd7cddfSDavid du Colombier testdigdiv("ffffff00fffffff1", 0xfffffff1);
4187dd7cddfSDavid du Colombier testvecdigmuladd("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 2);
4197dd7cddfSDavid du Colombier testconv("0");
4207dd7cddfSDavid du Colombier testconv("-abc0123456789abcedf");
4217dd7cddfSDavid du Colombier testconv("abc0123456789abcedf");
4227dd7cddfSDavid du Colombier testvecdigmulsub("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 2);
4237dd7cddfSDavid du Colombier testsub1("1FFFFFFFE00000000", "FFFFFFFE00000001");
4247dd7cddfSDavid du Colombier testmul1("ffffffff", "f");
4257dd7cddfSDavid du Colombier testmul("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
4267dd7cddfSDavid du Colombier testmul1("100000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000004FFFFFFFFFFFFFFFE0000000200000000000000000000000000000003FFFFFFFFFFFFFFFE0000000200000000000000000000000000000002FFFFFFFFFFFFFFFE0000000200000000000000000000000000000001FFFFFFFFFFFFFFFE0000000200000000000000000000000000000000FFFFFFFFFFFFFFFE0000000200000000FFFFFFFE00000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
4277dd7cddfSDavid du Colombier testmul1("1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001", "1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001");
4287dd7cddfSDavid du Colombier testmul1("1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001", "1000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001000000000000000000000001");
4297dd7cddfSDavid du Colombier testmul1("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
4307dd7cddfSDavid du Colombier x = mprand(256, prng, nil);
4317dd7cddfSDavid du Colombier y = mprand(128, prng, nil);
4327dd7cddfSDavid du Colombier testdiv(x, y);
4337dd7cddfSDavid du Colombier x = mprand(2048, prng, nil);
4347dd7cddfSDavid du Colombier y = mprand(1024, prng, nil);
4357dd7cddfSDavid du Colombier testdiv(x, y);
4367dd7cddfSDavid du Colombier // x = mprand(4*1024, prng, nil);
4377dd7cddfSDavid du Colombier // y = mprand(4*1024, prng, nil);
4387dd7cddfSDavid du Colombier // testmul2(x, y);
4397dd7cddfSDavid du Colombier testsub1("677132C9", "-A26559B6");
4407dd7cddfSDavid du Colombier testgcd();
4417dd7cddfSDavid du Colombier x = mprand(512, prng, nil);
4427dd7cddfSDavid du Colombier x->sign = -1;
4437dd7cddfSDavid du Colombier y = mprand(256, prng, nil);
4447dd7cddfSDavid du Colombier testdiv(x, y);
4457dd7cddfSDavid du Colombier testmod(x, y);
4467dd7cddfSDavid du Colombier x->sign = 1;
4477dd7cddfSDavid du Colombier testinvert(y, x);
4487dd7cddfSDavid du Colombier testexp("111111111", "222", "1000000000000000000000");
4497dd7cddfSDavid du Colombier testexp("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
4507dd7cddfSDavid du Colombier #ifdef asdf
4517dd7cddfSDavid du Colombier #endif adsf
4527dd7cddfSDavid du Colombier print("done\n");
4537dd7cddfSDavid du Colombier exits(0);
4547dd7cddfSDavid du Colombier }
455