mpsub.c (801B)
1 #include "os.h" 2 #include <mp.h> 3 #include "dat.h" 4 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; 11 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); 28 29 mpvecsub(b1->p, n, b2->p, m, diff->p); 30 diff->sign = sign; 31 diff->top = n; 32 mpnorm(diff); 33 } 34 35 /* diff = b1 - b2 */ 36 void 37 mpsub(mpint *b1, mpint *b2, mpint *diff) 38 { 39 int sign; 40 41 if(b1->sign != b2->sign){ 42 sign = b1->sign; 43 mpmagadd(b1, b2, diff); 44 diff->sign = sign; 45 return; 46 } 47 48 sign = b1->sign; 49 mpmagsub(b1, b2, diff); 50 if(diff->top != 0) 51 diff->sign *= sign; 52 }