summaryrefslogtreecommitdiffstats
path: root/libtommath/bn_mp_mul.c
blob: 05e16a66c3ce87377c9f34a673e3d924b1916712 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <tommath.h>
#ifdef BN_MP_MUL_C
/* LibTomMath, multiple-precision integer library -- Tom St Denis
 *
 * LibTomMath is a library that provides multiple-precision
 * integer arithmetic as well as number theoretic functionality.
 *
 * The library was designed directly after the MPI library by
 * Michael Fromberger but has been written from scratch with
 * additional optimizations in place.
 *
 * The library is free for all purposes without any express
 * guarantee it works.
 *
 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 */

/* high level multiplication (handles sign) */
int mp_mul(mp_int * a, mp_int * b, mp_int * c)
{
	int res, neg;
	neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG;

	/* use Toom-Cook? */
#ifdef BN_MP_TOOM_MUL_C
	if (MIN(a->used, b->used) >= TOOM_MUL_CUTOFF) {
		res = mp_toom_mul(a, b, c);
	} else
#endif
#ifdef BN_MP_KARATSUBA_MUL_C
		/* use Karatsuba? */
	if (MIN(a->used, b->used) >= KARATSUBA_MUL_CUTOFF) {
		res = mp_karatsuba_mul(a, b, c);
	} else
#endif
	{
		/* can we use the fast multiplier?
		 *
		 * The fast multiplier can be used if the output will 
		 * have less than MP_WARRAY digits and the number of 
		 * digits won't affect carry propagation
		 */
		int digs = a->used + b->used + 1;

#ifdef BN_FAST_S_MP_MUL_DIGS_C
		if ((digs < MP_WARRAY) &&
		    MIN(a->used, b->used) <=
		    (1 << ((CHAR_BIT * sizeof(mp_word)) - (2 * DIGIT_BIT)))) {
			res = fast_s_mp_mul_digs(a, b, c, digs);
		} else
#endif
#ifdef BN_S_MP_MUL_DIGS_C
			res = s_mp_mul(a, b, c);	/* uses s_mp_mul_digs */
#else
			res = MP_VAL;
#endif

	}
	c->sign = (c->used > 0) ? neg : MP_ZPOS;
	return res;
}
#endif

/* $Source: /cvs/libtom/libtommath/bn_mp_mul.c,v $ */
/* $Revision: 1.4 $ */
/* $Date: 2006/12/28 01:25:13 $ */