Annotation of researchv8dc/lib/libmp/gcd.c, revision 1.1.1.1

1.1       root        1: #include "mp.h"
                      2: extern mint *one, *zero;
                      3: gcd(a,b,c) mint *a,*b,*c;
                      4: {      mint *x,*y,*z,*w;
                      5:        x = itom(0), y = itom(0), z = itom(0), w = itom(0);
                      6:        move(a,x);
                      7:        move(b,y);
                      8:        while(y->len!=0){
                      9:                mdiv(x,y,w,z);
                     10:                move(y,x);
                     11:                move(z,y);
                     12:        }
                     13:        move(x,c);
                     14:        mfree(x);
                     15:        mfree(y);
                     16:        mfree(z);
                     17:        mfree(w);
                     18: }
                     19: invert(a, b, c) mint *a, *b, *c;
                     20: {      mint x, y, z, w, Anew, Aold;
                     21:        int i = 0;
                     22:        x.len = y.len = z.len = w.len = Aold.len = 0;
                     23:        Anew.len = 1;
                     24:        Anew.val = xalloc(1, "invert");
                     25:        *Anew.val = 1;
                     26:        move(b, &x);
                     27:        move(a, &y);
                     28:        while(y.len != 0)
                     29:        {       mdiv(&x, &y, &w, &z);
                     30:                move(&Anew, &x);
                     31:                mult(&w, &Anew, &Anew);
                     32:                madd(&Anew, &Aold, &Anew);
                     33:                move(&x, &Aold);
                     34:                move(&y, &x);
                     35:                move(&z, &y);
                     36:                i++;
                     37:        }
                     38:        move(&Aold, c);
                     39:        if( (i&01) == 0) msub(b, c, c);
                     40:        xfree(&x);
                     41:        xfree(&y);
                     42:        xfree(&z);
                     43:        xfree(&w);
                     44:        xfree(&Aold);
                     45:        xfree(&Anew);
                     46: }
                     47: 
                     48: lineq(a, b, x, y, u)   /* ax + by = u */
                     49: mint *a, *b, *x, *u, *y;
                     50: {      mint *at, *bt, *xo, *yo, *q, *r, *z;
                     51:        int i;
                     52:        at = itom(0), bt = itom(0), xo = itom(0);
                     53:        yo = itom(0), q = itom(0), r = itom(0), z = itom(0);
                     54:        move(a, at);
                     55:        move(b, bt);
                     56:        move(zero, x);
                     57:        move(one, xo);
                     58:        move(zero, yo);
                     59:        move(one, y);
                     60:        if(bt->len == 0) {
                     61:                move(one, x);
                     62:                move(zero, y);
                     63:                move(a, u);
                     64:                goto out;
                     65:        }
                     66:        for(i = 0; ; i++) {
                     67:                mdiv(at, bt, q, r);
                     68:                if(r->len == 0)
                     69:                        break;
                     70:                move(xo, z);
                     71:                move(x, xo);
                     72:                mult(q, xo, x);
                     73:                madd(z, x, x);
                     74:                move(yo, z);
                     75:                move(y, yo);
                     76:                mult(q, yo, y);
                     77:                madd(z, y, y);
                     78:                move(bt, at);
                     79:                move(r, bt);
                     80:        }
                     81:        move(bt, u);
                     82:        if(i & 1)
                     83:                y->len = -y->len;
                     84:        else
                     85:                x->len = -x->len;
                     86: out:
                     87:        mfree(z), mfree(r), mfree(q), mfree(yo);
                     88:        mfree(xo), mfree(bt), mfree(at);
                     89: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.