|
|
1.1 root 1: #include "mprec.h"
2: #include <assert.h>
3:
4:
5: /*
6: * Smult sets the mint pointed to by "c" to the product of that pointed
7: * to by "a" and the char "n". Note that "n" is assumed to be between
8: * 0 and NEFL. Also note that "a" == "c" is permissable.
9: */
10:
11: void
12: smult(a, n, c)
13: mint *a, *c;
14: char n;
15: {
16: register char *rp, *ap;
17: register int carry;
18: char *limit;
19: char *res;
20:
21: assert(0 <= n && n <= NEFL);
22:
23: /* handle zero specially */
24: if (n == 0) {
25: mcopy(mzero, c);
26: return;
27: }
28:
29: /* allocate space for result */
30: rp = (char *)mpalc(a->len + 1);
31: res = rp;
32:
33: /* perform multiplication assuming a is positive */
34: ap = a->val;
35: limit = ap + a->len;
36: carry = 0;
37: while (ap < limit) {
38: carry += *ap++ * n;
39: *rp++ = carry % BASE;
40: carry >>= L2BASE;
41: }
42: --ap;
43:
44: /* if a was negative, correct carry */
45: if (!ispos(a))
46: carry += BASE - n;
47:
48: /* set carry in place and replace old c value */
49: *rp = carry;
50: assert(0 <= carry && carry <= NEFL);
51: assert((carry==NEFL && *ap==NEFL) || (carry!=NEFL && *ap!=NEFL));
52: mpfree(c->val);
53: c->val = res;
54: c->len = a->len + 1;
55: norm(c);
56: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.