2 #ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C
3 /* LibTomMath, multiple-precision integer library -- Tom St Denis
5 * LibTomMath is a library that provides multiple-precision
6 * integer arithmetic as well as number theoretic functionality.
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.
12 * The library is free for all purposes without any express
15 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
19 * shifts with subtractions when the result is greater than b.
21 * The method is slightly modified to shift B unconditionally upto just under
22 * the leading bit of b. This saves alot of multiple precision shifting.
24 int mp_montgomery_calc_normalization (mp_int
* a
, mp_int
* b
)
28 /* how many bits of last digit does b use */
29 bits
= mp_count_bits (b
) % DIGIT_BIT
;
32 if ((res
= mp_2expt (a
, (b
->used
- 1) * DIGIT_BIT
+ bits
- 1)) != MP_OKAY
) {
41 /* now compute C = A * B mod b */
42 for (x
= bits
- 1; x
< (int)DIGIT_BIT
; x
++) {
43 if ((res
= mp_mul_2 (a
, a
)) != MP_OKAY
) {
46 if (mp_cmp_mag (a
, b
) != MP_LT
) {
47 if ((res
= s_mp_sub (a
, b
, a
)) != MP_OKAY
) {
57 /* $Source: /cvs/libtom/libtommath/bn_mp_montgomery_calc_normalization.c,v $ */
58 /* $Revision: 1.4 $ */
59 /* $Date: 2006/12/28 01:25:13 $ */