Blob


1 #include "os.h"
2 #include <mp.h>
3 #include "dat.h"
5 /* sum = abs(b1) + abs(b2), i.e., add the magnitudes */
6 void
7 mpmagadd(mpint *b1, mpint *b2, mpint *sum)
8 {
9 int m, n;
10 mpint *t;
12 /* get the sizes right */
13 if(b2->top > b1->top){
14 t = b1;
15 b1 = b2;
16 b2 = t;
17 }
18 n = b1->top;
19 m = b2->top;
20 if(n == 0){
21 mpassign(mpzero, sum);
22 return;
23 }
24 if(m == 0){
25 mpassign(b1, sum);
26 return;
27 }
28 mpbits(sum, (n+1)*Dbits);
29 sum->top = n+1;
31 mpvecadd(b1->p, n, b2->p, m, sum->p);
32 sum->sign = 1;
34 mpnorm(sum);
35 }
37 /* sum = b1 + b2 */
38 void
39 mpadd(mpint *b1, mpint *b2, mpint *sum)
40 {
41 int sign;
43 if(b1->sign != b2->sign){
44 if(b1->sign < 0)
45 mpmagsub(b2, b1, sum);
46 else
47 mpmagsub(b1, b2, sum);
48 } else {
49 sign = b1->sign;
50 mpmagadd(b1, b2, sum);
51 if(sum->top != 0)
52 sum->sign = sign;
53 }
54 }