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 /* diff = abs(b1) - abs(b2), i.e., subtract the magnitudes */
6 b3f61791 2004-03-21 devnull void
7 b3f61791 2004-03-21 devnull mpmagsub(mpint *b1, mpint *b2, mpint *diff)
8 b3f61791 2004-03-21 devnull {
9 b3f61791 2004-03-21 devnull int n, m, sign;
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(mpmagcmp(b1, b2) < 0){
14 b3f61791 2004-03-21 devnull sign = -1;
15 b3f61791 2004-03-21 devnull t = b1;
16 b3f61791 2004-03-21 devnull b1 = b2;
17 b3f61791 2004-03-21 devnull b2 = t;
18 b3f61791 2004-03-21 devnull } else
19 b3f61791 2004-03-21 devnull sign = 1;
20 b3f61791 2004-03-21 devnull n = b1->top;
21 b3f61791 2004-03-21 devnull m = b2->top;
22 b3f61791 2004-03-21 devnull if(m == 0){
23 b3f61791 2004-03-21 devnull mpassign(b1, diff);
24 b3f61791 2004-03-21 devnull diff->sign = sign;
25 b3f61791 2004-03-21 devnull return;
26 b3f61791 2004-03-21 devnull }
27 b3f61791 2004-03-21 devnull mpbits(diff, n*Dbits);
28 b3f61791 2004-03-21 devnull
29 b3f61791 2004-03-21 devnull mpvecsub(b1->p, n, b2->p, m, diff->p);
30 b3f61791 2004-03-21 devnull diff->sign = sign;
31 b3f61791 2004-03-21 devnull diff->top = n;
32 b3f61791 2004-03-21 devnull mpnorm(diff);
33 b3f61791 2004-03-21 devnull }
34 b3f61791 2004-03-21 devnull
35 cbeb0b26 2006-04-01 devnull /* diff = b1 - b2 */
36 b3f61791 2004-03-21 devnull void
37 b3f61791 2004-03-21 devnull mpsub(mpint *b1, mpint *b2, mpint *diff)
38 b3f61791 2004-03-21 devnull {
39 b3f61791 2004-03-21 devnull int sign;
40 b3f61791 2004-03-21 devnull
41 b3f61791 2004-03-21 devnull if(b1->sign != b2->sign){
42 b3f61791 2004-03-21 devnull sign = b1->sign;
43 b3f61791 2004-03-21 devnull mpmagadd(b1, b2, diff);
44 b3f61791 2004-03-21 devnull diff->sign = sign;
45 b3f61791 2004-03-21 devnull return;
46 b3f61791 2004-03-21 devnull }
47 b3f61791 2004-03-21 devnull
48 b3f61791 2004-03-21 devnull sign = b1->sign;
49 b3f61791 2004-03-21 devnull mpmagsub(b1, b2, diff);
50 b3f61791 2004-03-21 devnull if(diff->top != 0)
51 b3f61791 2004-03-21 devnull diff->sign *= sign;
52 b3f61791 2004-03-21 devnull }