from td@dagobah.UUCP
[unix-history] / usr / src / lib / libmp / madd.c
CommitLineData
7bd4c8d6
SL
1/* @(#)madd.c 4.1 %G% */
2
3#include <mp.h>
4m_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}
39madd(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}
71m_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}
111msub(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}