From f6edd3286d4bb8ed6484ad2cd7d87a55ccc41f3b Mon Sep 17 00:00:00 2001 From: Marco Bodrato Date: Sat, 28 Nov 2020 23:36:54 +0100 Subject: primesieve.c: Differentiate n_to_bit into floor and ceil. --- primesieve.c | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) (limited to 'primesieve.c') diff --git a/primesieve.c b/primesieve.c index 279e8d367..6922025c8 100644 --- a/primesieve.c +++ b/primesieve.c @@ -46,13 +46,17 @@ bit_to_n (mp_limb_t bit) { return (bit*3+4)|1; } static mp_limb_t id_to_n (mp_limb_t id) { return id*3+1+(id&1); } -/* n_to_bit (n) = ((n-1)&(-CNST_LIMB(2)))/3U-1 */ +/* n_fto_bit (n) = ((n-1)&(-CNST_LIMB(2)))/3U-1 */ static mp_limb_t -n_to_bit (mp_limb_t n) { return ((n-5)|1)/3U; } +n_fto_bit (mp_limb_t n) { return ((n-5)|1)/3U; } + +/* n_cto_bit (n) = ((n-2)&(-CNST_LIMB(2)))/3U */ +static mp_limb_t +n_cto_bit (mp_limb_t n) { return (n|1)/3U-1; } #if 0 static mp_size_t -primesieve_size (mp_limb_t n) { return n_to_bit(n) / GMP_LIMB_BITS + 1; } +primesieve_size (mp_limb_t n) { return n_fto_bit(n) / GMP_LIMB_BITS + 1; } #endif #if GMP_LIMB_BITS > 61 @@ -65,7 +69,7 @@ primesieve_size (mp_limb_t n) { return n_to_bit(n) / GMP_LIMB_BITS + 1; } #define SIEVE_2MSK1 CNST_LIMB(0x9402180c40230184) #define SIEVE_2MSK2 CNST_LIMB(0x0285021088402120) #define SIEVE_2MSKT CNST_LIMB(0xa41210084421) -#define SEED_LIMIT 288 +#define SEED_LIMIT (17*17-1) #else #define SEED_LIMIT 202 #endif @@ -77,7 +81,7 @@ primesieve_size (mp_limb_t n) { return n_to_bit(n) / GMP_LIMB_BITS + 1; } #define SIEVE_MASK1 CNST_LIMB(0x12148960) #define SIEVE_MASK2 CNST_LIMB(0x44a120cc) #define SIEVE_MASKT CNST_LIMB(0x1a) -#define SEED_LIMIT 120 +#define SEED_LIMIT (11*11-1) #else #define SEED_LIMIT 114 #endif @@ -91,7 +95,7 @@ primesieve_size (mp_limb_t n) { return n_to_bit(n) / GMP_LIMB_BITS + 1; } #define SEED_LIMIT 34 #else #define SIEVE_SEED CNST_LIMB(0x0) -#define SEED_LIMIT 24 +#define SEED_LIMIT (5*5-1) #endif /* 7 */ #endif /* 15 */ #endif /* 30 */ @@ -193,10 +197,10 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset) m22 = SIEVE_2MSK2; m23 = SIEVE_2MSKT; } else { /* correctly handle offset == 0... */ - m21 = offset % 110; - SET_OFF1 (m11, m12, SIEVE_MASK1, SIEVE_MASKT, m21, 110); - offset %= 182; - SET_OFF2 (m21, m22, m23, SIEVE_2MSK1, SIEVE_2MSK2, SIEVE_2MSKT, offset, 182); + m21 = offset % (11 * 5 * 2); + SET_OFF1 (m11, m12, SIEVE_MASK1, SIEVE_MASKT, m21, 11 * 5 * 2); + offset %= 13 * 7 * 2; + SET_OFF2 (m21, m22, m23, SIEVE_2MSK1, SIEVE_2MSK2, SIEVE_2MSKT, offset, 13 * 7 * 2); } /* THINK: Consider handling odd values of 'limbs' outside the loop, to have a single exit condition. */ @@ -204,13 +208,13 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset) bit_array[0] = m11 | m21; if (--limbs == 0) break; - ROTATE1 (m11, m12, 110); + ROTATE1 (m11, m12, 11 * 5 * 2); bit_array[1] = m11 | m22; bit_array += 2; - ROTATE1 (m11, m12, 110); - ROTATE2 (m21, m22, m23, 182); + ROTATE1 (m11, m12, 11 * 5 * 2); + ROTATE2 (m21, m22, m23, 13 * 7 * 2); } while (--limbs != 0); - return 4; + return n_cto_bit (13 + 1); #else #ifdef SIEVE_MASK2 mp_limb_t mask, mask2, tail; @@ -220,8 +224,8 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset) mask2 = SIEVE_MASK2; tail = SIEVE_MASKT; } else { /* correctly handle offset == 0... */ - offset %= 70; - SET_OFF2 (mask, mask2, tail, SIEVE_MASK1, SIEVE_MASK2, SIEVE_MASKT, offset, 70); + offset %= 7 * 5 * 2; + SET_OFF2 (mask, mask2, tail, SIEVE_MASK1, SIEVE_MASK2, SIEVE_MASKT, offset, 7 * 5 * 2); } /* THINK: Consider handling odd values of 'limbs' outside the loop, to have a single exit condition. */ @@ -231,9 +235,9 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset) break; bit_array[1] = mask2; bit_array += 2; - ROTATE2 (mask, mask2, tail, 70); + ROTATE2 (mask, mask2, tail, 7 * 5 * 2); } while (--limbs != 0); - return 2; + return n_cto_bit (7 + 1); #else MPN_FILL (bit_array, limbs, CNST_LIMB(0)); return 0; @@ -249,7 +253,7 @@ first_block_primesieve (mp_ptr bit_array, mp_limb_t n) ASSERT (n > 4); - bits = n_to_bit(n); + bits = n_fto_bit(n); limbs = bits / GMP_LIMB_BITS; if (limbs != 0) @@ -264,7 +268,7 @@ first_block_primesieve (mp_ptr bit_array, mp_limb_t n) ASSERT (i < GMP_LIMB_BITS); - if (n_to_bit (SEED_LIMIT + 1) < GMP_LIMB_BITS) + if (n_cto_bit (SEED_LIMIT) < GMP_LIMB_BITS) i = 0; mask = CNST_LIMB(1) << i; index = 0; @@ -400,7 +404,7 @@ gmp_primesieve (mp_ptr bit_array, mp_limb_t n) ASSERT (n > 4); - bits = n_to_bit(n); + bits = n_fto_bit(n); size = bits / GMP_LIMB_BITS + 1; if (size > BLOCK_SIZE * 2) { -- cgit v1.2.1