Blob
1 #include "os.h"2 #include <mp.h>3 #include "dat.h"5 // diff = abs(b1) - abs(b2), i.e., subtract the magnitudes6 void7 mpmagsub(mpint *b1, mpint *b2, mpint *diff)8 {9 int n, m, sign;10 mpint *t;12 // get the sizes right13 if(mpmagcmp(b1, b2) < 0){14 sign = -1;15 t = b1;16 b1 = b2;17 b2 = t;18 } else19 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 - b236 void37 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 }