1 // Bignum addition and subtraction
6 static unsigned int *addf(unsigned int *, unsigned int *);
7 static unsigned int *subf(unsigned int *, unsigned int *);
8 static int ucmp(unsigned int *, unsigned int *);
11 madd(unsigned int *a
, unsigned int *b
)
13 if (MSIGN(a
) == MSIGN(b
))
14 return addf(a
, b
); // same sign, add together
16 return subf(a
, b
); // opposite sign, find difference
20 msub(unsigned int *a
, unsigned int *b
)
22 if (MSIGN(a
) == MSIGN(b
))
23 return subf(a
, b
); // same sign, find difference
25 return addf(a
, b
); // opposite sign, add together
29 addf(unsigned int *a
, unsigned int *b
)
36 if (MLENGTH(a
) < MLENGTH(b
)) {
42 x
= mnew(MLENGTH(a
) + 1);
46 for (i
= 0; i
< MLENGTH(b
); i
++) {
47 x
[i
] = a
[i
] + b
[i
] + c
;
60 for (i
= MLENGTH(b
); i
< MLENGTH(a
); i
++) {
70 for (i
= MLENGTH(a
); i
> 0; i
--)
81 subf(unsigned int *a
, unsigned int *b
)
92 sign
= MSIGN(a
); /* |a| > |b| */
96 sign
= -MSIGN(a
); /* |a| < |b| */
103 x
= mnew(MLENGTH(a
));
107 for (i
= 0; i
< MLENGTH(b
); i
++) {
108 x
[i
] = a
[i
] - b
[i
] - c
;
121 for (i
= MLENGTH(b
); i
< MLENGTH(a
); i
++) {
129 for (i
= MLENGTH(a
) - 1; i
> 0; i
--)
142 ucmp(unsigned int *a
, unsigned int *b
)
146 if (MLENGTH(a
) < MLENGTH(b
))
149 if (MLENGTH(a
) > MLENGTH(b
))
152 for (i
= MLENGTH(a
) - 1; i
> 0; i
--)