#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; | |
} |