Blob


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