diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-01-22 16:26:59 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-01-22 16:26:59 (GMT) |
commit | 3cf1eb2c2370405ae05a7740dfdfdb206883b522 (patch) | |
tree | 22c4598980ea3b3377c1d8bfb95f1d33ef9f30fb /libtommath/bn_mp_jacobi.c | |
parent | f8876cc390ecf388114f426db15e641a5adb20fc (diff) | |
download | tcl-3cf1eb2c2370405ae05a7740dfdfdb206883b522.zip tcl-3cf1eb2c2370405ae05a7740dfdfdb206883b522.tar.gz tcl-3cf1eb2c2370405ae05a7740dfdfdb206883b522.tar.bz2 |
Update to libtommath v1.1.0-rc4
Diffstat (limited to 'libtommath/bn_mp_jacobi.c')
-rw-r--r-- | libtommath/bn_mp_jacobi.c | 87 |
1 files changed, 3 insertions, 84 deletions
diff --git a/libtommath/bn_mp_jacobi.c b/libtommath/bn_mp_jacobi.c index fe37f22..1eb3dd4 100644 --- a/libtommath/bn_mp_jacobi.c +++ b/libtommath/bn_mp_jacobi.c @@ -9,21 +9,14 @@ * 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. + * SPDX-License-Identifier: Unlicense */ /* computes the jacobi c = (a | n) (or Legendre if n is prime) - * HAC pp. 73 Algorithm 2.149 - * HAC is wrong here, as the special case of (0 | 1) is not - * handled correctly. + * Kept for legacy reasons, please use mp_kronecker() instead */ int mp_jacobi(const mp_int *a, const mp_int *n, int *c) { - mp_int a1, p1; - int k, s, r, res; - mp_digit residue; - /* if a < 0 return MP_VAL */ if (mp_isneg(a) == MP_YES) { return MP_VAL; @@ -34,81 +27,7 @@ int mp_jacobi(const mp_int *a, const mp_int *n, int *c) return MP_VAL; } - /* step 1. handle case of a == 0 */ - if (mp_iszero(a) == MP_YES) { - /* special case of a == 0 and n == 1 */ - if (mp_cmp_d(n, 1uL) == MP_EQ) { - *c = 1; - } else { - *c = 0; - } - return MP_OKAY; - } - - /* step 2. if a == 1, return 1 */ - if (mp_cmp_d(a, 1uL) == MP_EQ) { - *c = 1; - return MP_OKAY; - } - - /* default */ - s = 0; - - /* step 3. write a = a1 * 2**k */ - if ((res = mp_init_copy(&a1, a)) != MP_OKAY) { - return res; - } - - if ((res = mp_init(&p1)) != MP_OKAY) { - goto LBL_A1; - } - - /* divide out larger power of two */ - k = mp_cnt_lsb(&a1); - if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { - goto LBL_P1; - } - - /* step 4. if e is even set s=1 */ - if (((unsigned)k & 1u) == 0u) { - s = 1; - } else { - /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ - residue = n->dp[0] & 7u; - - if ((residue == 1u) || (residue == 7u)) { - s = 1; - } else if ((residue == 3u) || (residue == 5u)) { - s = -1; - } - } - - /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ - if (((n->dp[0] & 3u) == 3u) && ((a1.dp[0] & 3u) == 3u)) { - s = -s; - } - - /* if a1 == 1 we're done */ - if (mp_cmp_d(&a1, 1uL) == MP_EQ) { - *c = s; - } else { - /* n1 = n mod a1 */ - if ((res = mp_mod(n, &a1, &p1)) != MP_OKAY) { - goto LBL_P1; - } - if ((res = mp_jacobi(&p1, &a1, &r)) != MP_OKAY) { - goto LBL_P1; - } - *c = s * r; - } - - /* done */ - res = MP_OKAY; -LBL_P1: - mp_clear(&p1); -LBL_A1: - mp_clear(&a1); - return res; + return mp_kronecker(a, n, c); } #endif |