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