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