mpadd.c 783 B

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