diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /libmp/port/mpsub.c | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'libmp/port/mpsub.c')
| -rw-r--r-- | libmp/port/mpsub.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libmp/port/mpsub.c b/libmp/port/mpsub.c new file mode 100644 index 00000000..3fe6ca09 --- /dev/null +++ b/libmp/port/mpsub.c @@ -0,0 +1,52 @@ +#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; +} |
