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