|
|
1.1 ! root 1: #include <mp.h> ! 2: m_add(a,b,c) struct mint *a,*b,*c; ! 3: { int carry,i; ! 4: int x; ! 5: 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) struct mint *a,*b,*c; ! 38: { struct 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) struct mint *a,*b,*c; ! 70: { int x,i; ! 71: int borrow; ! 72: short one; ! 73: struct 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) if(c->val[i]>0) ! 102: { if(borrow==0) c->len=i+1; ! 103: else c->len= -i-1; ! 104: return; ! 105: } ! 106: shfree(c->val); ! 107: return; ! 108: } ! 109: msub(a,b,c) struct mint *a,*b,*c; ! 110: { struct mint x,y,z; ! 111: int sign; ! 112: x.len=a->len; ! 113: y.len=b->len; ! 114: x.val=a->val; ! 115: y.val=b->val; ! 116: z.len=0; ! 117: sign=1; ! 118: if(x.len>=0) ! 119: if(y.len>=0) ! 120: if(x.len>=y.len) m_sub(&x,&y,&z); ! 121: else ! 122: { sign= -1; ! 123: msub(&y,&x,&z); ! 124: } ! 125: else ! 126: { y.len= -y.len; ! 127: madd(&x,&y,&z); ! 128: } ! 129: else if(y.len<=0) ! 130: { sign= -1; ! 131: x.len= -x.len; ! 132: y.len= -y.len; ! 133: msub(&y,&x,&z); ! 134: } ! 135: else ! 136: { x.len= -x.len; ! 137: madd(&x,&y,&z); ! 138: sign= -1; ! 139: } ! 140: if(a==c && x.len!=0) xfree(a); ! 141: else if(b==c && y.len!=0) xfree(b); ! 142: else xfree(c); ! 143: c->val=z.val; ! 144: c->len=sign*z.len; ! 145: return; ! 146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.