Merge pull request #144 from czurnieden/develop
reg. #143 corrected translation of mpz_fdiv_q_2exp
This commit is contained in:
commit
62adf47fb8
@ -58,9 +58,6 @@ LBL_MPMULSI_ERR:
|
|||||||
mp_clear(&t);
|
mp_clear(&t);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Strong Lucas-Selfridge test.
|
Strong Lucas-Selfridge test.
|
||||||
returns MP_YES if it is a strong L-S prime, MP_NO if it is composite
|
returns MP_YES if it is a strong L-S prime, MP_NO if it is composite
|
||||||
@ -85,10 +82,9 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
/* CZ TODO: Some of them need the full 32 bit, hence the (temporary) exclusion of MP_8BIT */
|
/* CZ TODO: Some of them need the full 32 bit, hence the (temporary) exclusion of MP_8BIT */
|
||||||
int32_t D, Ds, J, sign, P, Q, r, s, u, Nbits;
|
int32_t D, Ds, J, sign, P, Q, r, s, u, Nbits;
|
||||||
int e;
|
int e;
|
||||||
int isset;
|
int isset, oddness;
|
||||||
|
|
||||||
*result = MP_NO;
|
*result = MP_NO;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Find the first element D in the sequence {5, -7, 9, -11, 13, ...}
|
Find the first element D in the sequence {5, -7, 9, -11, 13, ...}
|
||||||
such that Jacobi(D,N) = -1 (Selfridge's algorithm). Theory
|
such that Jacobi(D,N) = -1 (Selfridge's algorithm). Theory
|
||||||
@ -138,6 +134,8 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
P = 1; /* Selfridge's choice */
|
P = 1; /* Selfridge's choice */
|
||||||
Q = (1 - Ds) / 4; /* Required so D = P*P - 4*Q */
|
Q = (1 - Ds) / 4; /* Required so D = P*P - 4*Q */
|
||||||
|
|
||||||
@ -232,6 +230,7 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Nbits = mp_count_bits(&Dz);
|
Nbits = mp_count_bits(&Dz);
|
||||||
|
|
||||||
for (u = 1; u < Nbits; u++) { /* zero bit off, already accounted for */
|
for (u = 1; u < Nbits; u++) { /* zero bit off, already accounted for */
|
||||||
/* Formulas for doubling of indices (carried out mod N). Note that
|
/* Formulas for doubling of indices (carried out mod N). Note that
|
||||||
* the indices denoted as "2m" are actually powers of 2, specifically
|
* the indices denoted as "2m" are actually powers of 2, specifically
|
||||||
@ -267,7 +266,6 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) {
|
if ((e = mp_mul_2(&Qmz, &Q2mz)) != MP_OKAY) {
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((isset = mp_get_bit(&Dz, u)) == MP_VAL) {
|
if ((isset = mp_get_bit(&Dz, u)) == MP_VAL) {
|
||||||
e = isset;
|
e = isset;
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
@ -280,7 +278,6 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
*
|
*
|
||||||
* Be careful with division by 2 (mod N)!
|
* Be careful with division by 2 (mod N)!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((e = mp_mul(&U2mz, &Vz, &T1z)) != MP_OKAY) {
|
if ((e = mp_mul(&U2mz, &Vz, &T1z)) != MP_OKAY) {
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
@ -309,10 +306,11 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
* Thomas R. Nicely used GMP's mpz_fdiv_q_2exp().
|
* Thomas R. Nicely used GMP's mpz_fdiv_q_2exp().
|
||||||
* But mp_div_2() does not do so, it is truncating instead.
|
* But mp_div_2() does not do so, it is truncating instead.
|
||||||
*/
|
*/
|
||||||
|
oddness = mp_isodd(&Uz);
|
||||||
if ((e = mp_div_2(&Uz, &Uz)) != MP_OKAY) {
|
if ((e = mp_div_2(&Uz, &Uz)) != MP_OKAY) {
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
if ((Uz.sign == MP_NEG) && (mp_isodd(&Uz) != MP_NO)) {
|
if ((Uz.sign == MP_NEG) && (oddness != MP_NO)) {
|
||||||
if ((e = mp_sub_d(&Uz, 1uL, &Uz)) != MP_OKAY) {
|
if ((e = mp_sub_d(&Uz, 1uL, &Uz)) != MP_OKAY) {
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
@ -325,10 +323,11 @@ int mp_prime_strong_lucas_selfridge(const mp_int *a, int *result)
|
|||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
oddness = mp_isodd(&Vz);
|
||||||
if ((e = mp_div_2(&Vz, &Vz)) != MP_OKAY) {
|
if ((e = mp_div_2(&Vz, &Vz)) != MP_OKAY) {
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
if ((Vz.sign == MP_NEG) && (mp_isodd(&Vz) != MP_NO)) {
|
if ((Vz.sign == MP_NEG) && (oddness != MP_NO)) {
|
||||||
if ((e = mp_sub_d(&Vz, 1uL, &Vz)) != MP_OKAY) {
|
if ((e = mp_sub_d(&Vz, 1uL, &Vz)) != MP_OKAY) {
|
||||||
goto LBL_LS_ERR;
|
goto LBL_LS_ERR;
|
||||||
}
|
}
|
||||||
|
10
demo/demo.c
10
demo/demo.c
@ -715,6 +715,16 @@ int main(void)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Check regarding problem #143 */
|
||||||
|
#ifndef MP_8BIT
|
||||||
|
mp_read_radix(&a, "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF",
|
||||||
|
16);
|
||||||
|
mp_prime_strong_lucas_selfridge(&a, &cnt);
|
||||||
|
if (cnt != MP_YES) {
|
||||||
|
printf("\n\nissue #143 - mp_prime_strong_lucas_selfridge FAILED!\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user