Line data Source code
1 : #include <tommath.h>
2 : #ifdef BN_MP_MUL_D_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis
4 : *
5 : * LibTomMath is a library that provides multiple-precision
6 : * integer arithmetic as well as number theoretic functionality.
7 : *
8 : * The library was designed directly after the MPI library by
9 : * Michael Fromberger but has been written from scratch with
10 : * additional optimizations in place.
11 : *
12 : * The library is free for all purposes without any express
13 : * guarantee it works.
14 : *
15 : * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
16 : */
17 :
18 : /* multiply by a digit */
19 : int
20 188355 : mp_mul_d (mp_int * a, mp_digit b, mp_int * c)
21 : {
22 : mp_digit u, *tmpa, *tmpc;
23 : mp_word r;
24 : int ix, res, olduse;
25 :
26 : /* make sure c is big enough to hold a*b */
27 188355 : if (c->alloc < a->used + 1) {
28 1154 : if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) {
29 0 : return res;
30 : }
31 : }
32 :
33 : /* get the original destinations used count */
34 188355 : olduse = c->used;
35 :
36 : /* set the sign */
37 188355 : c->sign = a->sign;
38 :
39 : /* alias for a->dp [source] */
40 188355 : tmpa = a->dp;
41 :
42 : /* alias for c->dp [dest] */
43 188355 : tmpc = c->dp;
44 :
45 : /* zero carry */
46 188355 : u = 0;
47 :
48 : /* compute columns */
49 5207530 : for (ix = 0; ix < a->used; ix++) {
50 : /* compute product and carry sum for this term */
51 5019175 : r = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b);
52 :
53 : /* mask off higher bits to get a single digit */
54 5019175 : *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK));
55 :
56 : /* send carry into next iteration */
57 5019175 : u = (mp_digit) (r >> ((mp_word) DIGIT_BIT));
58 : }
59 :
60 : /* store final carry [if any] and increment ix offset */
61 188355 : *tmpc++ = u;
62 188355 : ++ix;
63 :
64 : /* now zero digits above the top */
65 376710 : while (ix++ < olduse) {
66 0 : *tmpc++ = 0;
67 : }
68 :
69 : /* set used count */
70 188355 : c->used = a->used + 1;
71 188355 : mp_clamp(c);
72 :
73 188355 : return MP_OKAY;
74 : }
75 : #endif
76 :
77 : /* $Source: /cvs/libtom/libtommath/bn_mp_mul_d.c,v $ */
78 : /* $Revision: 1.4 $ */
79 : /* $Date: 2006/12/28 01:25:13 $ */
|