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