summaryrefslogtreecommitdiff
path: root/primesieve.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2020-11-28 23:36:54 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2020-11-28 23:36:54 +0100
commitf6edd3286d4bb8ed6484ad2cd7d87a55ccc41f3b (patch)
tree95064681bd3c7aa4059ca0e2167f573b910ce4da /primesieve.c
parent2dacfb6efa59ebfd5d26d3a73e2b9c375a78bbd3 (diff)
downloadgmp-f6edd3286d4bb8ed6484ad2cd7d87a55ccc41f3b.tar.gz
primesieve.c: Differentiate n_to_bit into floor and ceil.
Diffstat (limited to 'primesieve.c')
-rw-r--r--primesieve.c46
1 files changed, 25 insertions, 21 deletions
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) {