| #include "os.h" |
| #include <mp.h> |
| #include "dat.h" |
| |
| /* diff = abs(b1) - abs(b2), i.e., subtract the magnitudes */ |
| void |
| mpmagsub(mpint *b1, mpint *b2, mpint *diff) |
| { |
| int n, m, sign; |
| mpint *t; |
| |
| /* get the sizes right */ |
| if(mpmagcmp(b1, b2) < 0){ |
| sign = -1; |
| t = b1; |
| b1 = b2; |
| b2 = t; |
| } else |
| sign = 1; |
| n = b1->top; |
| m = b2->top; |
| if(m == 0){ |
| mpassign(b1, diff); |
| diff->sign = sign; |
| return; |
| } |
| mpbits(diff, n*Dbits); |
| |
| mpvecsub(b1->p, n, b2->p, m, diff->p); |
| diff->sign = sign; |
| diff->top = n; |
| mpnorm(diff); |
| } |
| |
| /* diff = b1 - b2 */ |
| void |
| mpsub(mpint *b1, mpint *b2, mpint *diff) |
| { |
| int sign; |
| |
| if(b1->sign != b2->sign){ |
| sign = b1->sign; |
| mpmagadd(b1, b2, diff); |
| diff->sign = sign; |
| return; |
| } |
| |
| sign = b1->sign; |
| mpmagsub(b1, b2, diff); |
| if(diff->top != 0) |
| diff->sign *= sign; |
| } |