17dd7cddfSDavid du Colombier #include "os.h"
27dd7cddfSDavid du Colombier #include <mp.h>
37dd7cddfSDavid du Colombier #include "dat.h"
47dd7cddfSDavid du Colombier
57dd7cddfSDavid du Colombier // diff = abs(b1) - abs(b2), i.e., subtract the magnitudes
67dd7cddfSDavid du Colombier void
mpmagsub(mpint * b1,mpint * b2,mpint * diff)77dd7cddfSDavid du Colombier mpmagsub(mpint *b1, mpint *b2, mpint *diff)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier int n, m, sign;
107dd7cddfSDavid du Colombier mpint *t;
117dd7cddfSDavid du Colombier
127dd7cddfSDavid du Colombier // get the sizes right
137dd7cddfSDavid du Colombier if(mpmagcmp(b1, b2) < 0){
147dd7cddfSDavid du Colombier sign = -1;
157dd7cddfSDavid du Colombier t = b1;
167dd7cddfSDavid du Colombier b1 = b2;
177dd7cddfSDavid du Colombier b2 = t;
187dd7cddfSDavid du Colombier } else
197dd7cddfSDavid du Colombier sign = 1;
207dd7cddfSDavid du Colombier n = b1->top;
217dd7cddfSDavid du Colombier m = b2->top;
227dd7cddfSDavid du Colombier if(m == 0){
237dd7cddfSDavid du Colombier mpassign(b1, diff);
247dd7cddfSDavid du Colombier diff->sign = sign;
257dd7cddfSDavid du Colombier return;
267dd7cddfSDavid du Colombier }
277dd7cddfSDavid du Colombier mpbits(diff, n*Dbits);
287dd7cddfSDavid du Colombier
297dd7cddfSDavid du Colombier mpvecsub(b1->p, n, b2->p, m, diff->p);
307dd7cddfSDavid du Colombier diff->sign = sign;
3159cc4ca5SDavid du Colombier diff->top = n;
327dd7cddfSDavid du Colombier mpnorm(diff);
337dd7cddfSDavid du Colombier }
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier // diff = b1 - b2
367dd7cddfSDavid du Colombier void
mpsub(mpint * b1,mpint * b2,mpint * diff)377dd7cddfSDavid du Colombier mpsub(mpint *b1, mpint *b2, mpint *diff)
387dd7cddfSDavid du Colombier {
397dd7cddfSDavid du Colombier int sign;
407dd7cddfSDavid du Colombier
417dd7cddfSDavid du Colombier if(b1->sign != b2->sign){
427dd7cddfSDavid du Colombier sign = b1->sign;
437dd7cddfSDavid du Colombier mpmagadd(b1, b2, diff);
447dd7cddfSDavid du Colombier diff->sign = sign;
457dd7cddfSDavid du Colombier return;
467dd7cddfSDavid du Colombier }
477dd7cddfSDavid du Colombier
487dd7cddfSDavid du Colombier sign = b1->sign;
497dd7cddfSDavid du Colombier mpmagsub(b1, b2, diff);
50*80ee5cbfSDavid du Colombier if(diff->top != 0)
517dd7cddfSDavid du Colombier diff->sign *= sign;
527dd7cddfSDavid du Colombier }
53