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