Line data Source code
1 : #include <tommath.h>
2 : #ifdef BN_MP_CNT_LSB_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 : static const int lnz[16] = {
19 : 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
20 : };
21 :
22 : /* Counts the number of lsbs which are zero before the first zero bit */
23 0 : int mp_cnt_lsb(mp_int *a)
24 : {
25 : int x;
26 : mp_digit q, qq;
27 :
28 : /* easy out */
29 0 : if (mp_iszero(a) == 1) {
30 0 : return 0;
31 : }
32 :
33 : /* scan lower digits until non-zero */
34 0 : for (x = 0; x < a->used && a->dp[x] == 0; x++);
35 0 : q = a->dp[x];
36 0 : x *= DIGIT_BIT;
37 :
38 : /* now scan this digit until a 1 is found */
39 0 : if ((q & 1) == 0) {
40 : do {
41 0 : qq = q & 15;
42 0 : x += lnz[qq];
43 0 : q >>= 4;
44 0 : } while (qq == 0);
45 : }
46 0 : return x;
47 : }
48 :
49 : #endif
50 :
51 : /* $Source: /cvs/libtom/libtommath/bn_mp_cnt_lsb.c,v $ */
52 : /* $Revision: 1.4 $ */
53 : /* $Date: 2006/12/28 01:25:13 $ */
|