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: }