Blame


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