mpsub.c 792 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "os.h"
  2. #include <mp.h>
  3. #include "dat.h"
  4. // diff = abs(b1) - abs(b2), i.e., subtract the magnitudes
  5. void
  6. mpmagsub(mpint *b1, mpint *b2, mpint *diff)
  7. {
  8. int n, m, sign;
  9. mpint *t;
  10. // get the sizes right
  11. if(mpmagcmp(b1, b2) < 0){
  12. sign = -1;
  13. t = b1;
  14. b1 = b2;
  15. b2 = t;
  16. } else
  17. sign = 1;
  18. n = b1->top;
  19. m = b2->top;
  20. if(m == 0){
  21. mpassign(b1, diff);
  22. diff->sign = sign;
  23. return;
  24. }
  25. mpbits(diff, n*Dbits);
  26. mpvecsub(b1->p, n, b2->p, m, diff->p);
  27. diff->sign = sign;
  28. diff->top = n;
  29. mpnorm(diff);
  30. }
  31. // diff = b1 - b2
  32. void
  33. mpsub(mpint *b1, mpint *b2, mpint *diff)
  34. {
  35. int sign;
  36. if(b1->sign != b2->sign){
  37. sign = b1->sign;
  38. mpmagadd(b1, b2, diff);
  39. diff->sign = sign;
  40. return;
  41. }
  42. sign = b1->sign;
  43. mpmagsub(b1, b2, diff);
  44. if(diff->top != 0)
  45. diff->sign *= sign;
  46. }