bn_mp_div_3.c revision 1.1.1.1
1/* $NetBSD: bn_mp_div_3.c,v 1.1.1.1 2011/04/13 18:14:54 elric Exp $ */ 2 3#include <tommath.h> 4#ifdef BN_MP_DIV_3_C 5/* LibTomMath, multiple-precision integer library -- Tom St Denis 6 * 7 * LibTomMath is a library that provides multiple-precision 8 * integer arithmetic as well as number theoretic functionality. 9 * 10 * The library was designed directly after the MPI library by 11 * Michael Fromberger but has been written from scratch with 12 * additional optimizations in place. 13 * 14 * The library is free for all purposes without any express 15 * guarantee it works. 16 * 17 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org 18 */ 19 20/* divide by three (based on routine from MPI and the GMP manual) */ 21int 22mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) 23{ 24 mp_int q; 25 mp_word w, t; 26 mp_digit b; 27 int res, ix; 28 29 /* b = 2**DIGIT_BIT / 3 */ 30 b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); 31 32 if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { 33 return res; 34 } 35 36 q.used = a->used; 37 q.sign = a->sign; 38 w = 0; 39 for (ix = a->used - 1; ix >= 0; ix--) { 40 w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); 41 42 if (w >= 3) { 43 /* multiply w by [1/3] */ 44 t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); 45 46 /* now subtract 3 * [w/3] from w, to get the remainder */ 47 w -= t+t+t; 48 49 /* fixup the remainder as required since 50 * the optimization is not exact. 51 */ 52 while (w >= 3) { 53 t += 1; 54 w -= 3; 55 } 56 } else { 57 t = 0; 58 } 59 q.dp[ix] = (mp_digit)t; 60 } 61 62 /* [optional] store the remainder */ 63 if (d != NULL) { 64 *d = (mp_digit)w; 65 } 66 67 /* [optional] store the quotient */ 68 if (c != NULL) { 69 mp_clamp(&q); 70 mp_exch(&q, c); 71 } 72 mp_clear(&q); 73 74 return res; 75} 76 77#endif 78 79/* Source: /cvs/libtom/libtommath/bn_mp_div_3.c,v */ 80/* Revision: 1.4 */ 81/* Date: 2006/12/28 01:25:13 */ 82