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