|
|
1.1 ! root 1: #include "mp.h" ! 2: #undef unfast ! 3: mult(a,b,c) mint *a,*b,*c; ! 4: { mint x,y,z; ! 5: int sign; ! 6: sign = 1; ! 7: x.val=a->val; ! 8: y.val=b->val; ! 9: z.len=0; ! 10: if(a->len<0) ! 11: { x.len= -a->len; ! 12: sign= -sign; ! 13: } ! 14: else x.len=a->len; ! 15: if(b->len<0) ! 16: { y.len= -b->len; ! 17: sign= -sign; ! 18: } ! 19: else y.len=b->len; ! 20: if(x.len == 0 || y.len == 0) ! 21: z.len = 0; ! 22: else if(x.len<y.len) m_mult(&y,&x,&z); ! 23: else m_mult(&x,&y,&z); ! 24: xfree(c); ! 25: if(sign<0) c->len= -z.len; ! 26: else c->len=z.len; ! 27: c->val=z.val; ! 28: } ! 29: #define S2 x=a->val[j]; ! 30: #define S3 x=x*b->val[i-j]; ! 31: #ifdef unfast ! 32: #define S4 tradd(&carry,&sum,x); ! 33: #else ! 34: #define S4 sum.xx += x; if(sum.yy.high & 0100000) {sum.yy.high &= 077777; carry++;} ! 35: #endif ! 36: #define S5 c->val[i]=sum.yy.low&077777; ! 37: #define S6 sum.xx=sum.xx>>15; ! 38: #define S7 sum.yy.high=carry; ! 39: m_mult(a,b,c) ! 40: register mint *a,*b,*c; ! 41: { register long x; ! 42: union {long xx; struct half yy;} sum; ! 43: int carry; ! 44: int i,j; ! 45: c->val=xalloc(a->len+b->len,"m_mult"); ! 46: sum.xx=0; ! 47: for(i=0;i<b->len;i++) ! 48: { carry=0; ! 49: for(j=0;j<i+1;j++) ! 50: { S2 ! 51: S3 ! 52: S4 ! 53: } ! 54: S5 ! 55: S6 ! 56: S7 ! 57: } ! 58: for(;i<a->len;i++) ! 59: { carry=0; ! 60: for(j=i-b->len+1;j<i+1;j++) ! 61: { S2 ! 62: S3 ! 63: S4 ! 64: } ! 65: S5 ! 66: S6 ! 67: S7 ! 68: } ! 69: for(;i<a->len+b->len;i++) ! 70: { carry=0; ! 71: for(j=i-b->len+1;j<a->len;j++) ! 72: { S2 ! 73: S3 ! 74: S4 ! 75: } ! 76: S5 ! 77: S6 ! 78: S7 ! 79: } ! 80: if(i == 0 || c->val[i-1]!=0) ! 81: c->len=a->len+b->len; ! 82: else c->len=a->len+b->len-1; ! 83: return; ! 84: } ! 85: tradd(a,b,c) ! 86: long c; ! 87: int *a; ! 88: register union {long xx; struct half yy;} *b; ! 89: { ! 90: b->xx += c; ! 91: if(b->yy.high&0100000) ! 92: { b->yy.high= b->yy.high&077777; ! 93: *a += 1; ! 94: } ! 95: return; ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.