|
|
1.1 ! root 1: #include "mp.h" ! 2: m_add(a,b,c) mint *a,*b,*c; ! 3: { register int carry,i; ! 4: register int x; ! 5: register short *cval; ! 6: cval=xalloc(a->len+1,"m_add"); ! 7: carry=0; ! 8: for(i=0;i<b->len;i++) ! 9: { x=carry+a->val[i]+b->val[i]; ! 10: if(x&0100000) ! 11: { carry=1; ! 12: cval[i]=x&077777; ! 13: } ! 14: else ! 15: { carry=0; ! 16: cval[i]=x; ! 17: } ! 18: } ! 19: for(;i<a->len;i++) ! 20: { x=carry+a->val[i]; ! 21: if(x&0100000) cval[i]=x&077777; ! 22: else ! 23: { carry=0; ! 24: cval[i]=x; ! 25: } ! 26: ! 27: } ! 28: if(carry==1) ! 29: { cval[i]=1; ! 30: c->len=i+1; ! 31: } ! 32: else c->len=a->len; ! 33: c->val=cval; ! 34: if(c->len==0) shfree(cval); ! 35: return; ! 36: } ! 37: madd(a,b,c) mint *a,*b,*c; ! 38: { mint x,y,z; ! 39: int sign; ! 40: x.len=a->len; ! 41: x.val=a->val; ! 42: y.len=b->len; ! 43: y.val=b->val; ! 44: z.len=0; ! 45: sign=1; ! 46: if(x.len>=0) ! 47: if(y.len>=0) ! 48: if(x.len>=y.len) m_add(&x,&y,&z); ! 49: else m_add(&y,&x,&z); ! 50: else ! 51: { y.len= -y.len; ! 52: msub(&x,&y,&z); ! 53: } ! 54: else if(y.len<=0) ! 55: { x.len = -x.len; ! 56: y.len= -y.len; ! 57: sign= -1; ! 58: madd(&x,&y,&z); ! 59: } ! 60: else ! 61: { x.len= -x.len; ! 62: msub(&y,&x,&z); ! 63: } ! 64: xfree(c); ! 65: c->val=z.val; ! 66: c->len=sign*z.len; ! 67: return; ! 68: } ! 69: m_sub(a,b,c) mint *a,*b,*c; ! 70: { register int x,i; ! 71: register int borrow; ! 72: short one; ! 73: mint mone; ! 74: one=1; mone.len= 1; mone.val= &one; ! 75: c->val=xalloc(a->len,"m_sub"); ! 76: borrow=0; ! 77: for(i=0;i<b->len;i++) ! 78: { x=borrow+a->val[i]-b->val[i]; ! 79: if(x&0100000) ! 80: { borrow= -1; ! 81: c->val[i]=x&077777; ! 82: } ! 83: else ! 84: { borrow=0; ! 85: c->val[i]=x; ! 86: } ! 87: } ! 88: for(;i<a->len;i++) ! 89: { x=borrow+a->val[i]; ! 90: if(x&0100000) c->val[i]=x&077777; ! 91: else ! 92: { borrow=0; ! 93: c->val[i]=x; ! 94: } ! 95: } ! 96: if(borrow<0) ! 97: { for(i=0;i<a->len;i++) c->val[i] ^= 077777; ! 98: c->len=a->len; ! 99: madd(c,&mone,c); ! 100: } ! 101: for(i=a->len-1;i>=0;--i) ! 102: if(c->val[i]>0) { ! 103: if(borrow==0) c->len=i+1; ! 104: else c->len= -i-1; ! 105: return; ! 106: } ! 107: shfree(c->val); ! 108: return; ! 109: } ! 110: msub(a,b,c) mint *a,*b,*c; ! 111: { mint x,y,z; ! 112: int sign; ! 113: x.len=a->len; ! 114: y.len=b->len; ! 115: x.val=a->val; ! 116: y.val=b->val; ! 117: z.len=0; ! 118: sign=1; ! 119: if(x.len>=0) ! 120: if(y.len>=0) ! 121: if(x.len>=y.len) m_sub(&x,&y,&z); ! 122: else ! 123: { sign= -1; ! 124: msub(&y,&x,&z); ! 125: } ! 126: else ! 127: { y.len= -y.len; ! 128: madd(&x,&y,&z); ! 129: } ! 130: else if(y.len<=0) ! 131: { sign= -1; ! 132: x.len= -x.len; ! 133: y.len= -y.len; ! 134: msub(&x, &y, &z); ! 135: } ! 136: else ! 137: { x.len= -x.len; ! 138: madd(&x,&y,&z); ! 139: sign= -1; ! 140: } ! 141: if(a==c && x.len!=0) xfree(a); ! 142: else if(b==c && y.len!=0) xfree(b); ! 143: else xfree(c); ! 144: c->val=z.val; ! 145: c->len=sign*z.len; ! 146: return; ! 147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.