mpvecsub.c 523 B

12345678910111213141516171819202122232425262728293031323334
  1. #include "os.h"
  2. #include <mp.h>
  3. #include "dat.h"
  4. // prereq: a >= b, alen >= blen, diff has at least alen digits
  5. void
  6. mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
  7. {
  8. int i, borrow;
  9. mpdigit x, y;
  10. borrow = 0;
  11. for(i = 0; i < blen; i++){
  12. x = *a++;
  13. y = *b++;
  14. y += borrow;
  15. if(y < borrow)
  16. borrow = 1;
  17. else
  18. borrow = 0;
  19. if(x < y)
  20. borrow++;
  21. *diff++ = x - y;
  22. }
  23. for(; i < alen; i++){
  24. x = *a++;
  25. y = x - borrow;
  26. if(y > x)
  27. borrow = 1;
  28. else
  29. borrow = 0;
  30. *diff++ = y;
  31. }
  32. }