|
|
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.