summaryrefslogtreecommitdiff
path: root/primesieve.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2021-10-01 22:42:42 +0200
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2021-10-01 22:42:42 +0200
commit59020e286b79b9f892bd16302281c905ce124277 (patch)
tree1a564306dca2fb65c4dafafa017b3430ee9a40db /primesieve.c
parent756b1834033ce64cc689a326453f611467471cd4 (diff)
downloadgmp-59020e286b79b9f892bd16302281c905ce124277.tar.gz
primesieve.c: Simplify first_block_primesieve if a presieved array is available
Diffstat (limited to 'primesieve.c')
-rw-r--r--primesieve.c105
1 files changed, 27 insertions, 78 deletions
diff --git a/primesieve.c b/primesieve.c
index a88bae01f..fa8039f18 100644
--- a/primesieve.c
+++ b/primesieve.c
@@ -190,15 +190,9 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset)
#ifdef SIEVE_2MSK2
mp_limb_t m11, m12, m21, m22, m23;
- if (offset == 0) { /* This branch is not needed. */
- m11 = SIEVE_MASK1;
- m12 = SIEVE_MASKT;
- m21 = SIEVE_2MSK1;
- m22 = SIEVE_2MSK2;
- m23 = SIEVE_2MSKT;
- } else { /* correctly handle offset == 0... */
- m21 = offset % (11 * 5 * 2);
- SET_OFF1 (m11, m12, SIEVE_MASK1, SIEVE_MASKT, m21, 11 * 5 * 2);
+ { /* correctly handle offset == 0... */
+ mp_limb_t off1 = offset % (11 * 5 * 2);
+ SET_OFF1 (m11, m12, SIEVE_MASK1, SIEVE_MASKT, off1, 11 * 5 * 2);
offset %= 13 * 7 * 2;
SET_OFF2 (m21, m22, m23, SIEVE_2MSK1, SIEVE_2MSK2, SIEVE_2MSKT, offset, 13 * 7 * 2);
}
@@ -219,11 +213,7 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset)
#ifdef SIEVE_MASK2
mp_limb_t mask, mask2, tail;
- if (offset == 0) { /* This branch is not needed. */
- mask = SIEVE_MASK1;
- mask2 = SIEVE_MASK2;
- tail = SIEVE_MASKT;
- } else { /* correctly handle offset == 0... */
+ { /* correctly handle offset == 0... */
offset %= 7 * 5 * 2;
SET_OFF2 (mask, mask2, tail, SIEVE_MASK1, SIEVE_MASK2, SIEVE_MASKT, offset, 7 * 5 * 2);
}
@@ -246,70 +236,6 @@ fill_bitpattern (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset)
}
static void
-first_block_primesieve (mp_ptr bit_array, mp_limb_t n)
-{
- mp_size_t bits, limbs;
- mp_limb_t i;
-
- ASSERT (n > 4);
-
- bits = n_fto_bit(n);
- limbs = bits / GMP_LIMB_BITS;
-
- if (limbs != 0)
- i = fill_bitpattern (bit_array + 1, limbs, 0);
- bit_array[0] = SIEVE_SEED;
-
- if (n > SEED_LIMIT) {
- mp_limb_t mask, index;
-
- ASSERT (i < GMP_LIMB_BITS);
-
- if (n_cto_bit (SEED_LIMIT) < GMP_LIMB_BITS)
- i = 0;
- mask = CNST_LIMB(1) << i;
- index = 0;
- do {
- ++i;
- if ((bit_array[index] & mask) == 0)
- {
- mp_size_t step, lindex;
- mp_limb_t lmask;
- unsigned maskrot;
-
- step = id_to_n(i);
-/* lindex = n_to_bit(id_to_n(i)*id_to_n(i)); */
- lindex = i*(step+1)-1+(-(i&1)&(i+1));
-/* lindex = i*(step+1+(i&1))-1+(i&1); */
- if (lindex > bits)
- break;
-
- step <<= 1;
- maskrot = step % GMP_LIMB_BITS;
-
- lmask = CNST_LIMB(1) << (lindex % GMP_LIMB_BITS);
- do {
- bit_array[lindex / GMP_LIMB_BITS] |= lmask;
- lmask = lmask << maskrot | lmask >> (GMP_LIMB_BITS - maskrot);
- lindex += step;
- } while (lindex <= bits);
-
-/* lindex = n_to_bit(id_to_n(i)*bit_to_n(i)); */
- lindex = i*(i*3+6)+(i&1);
-
- lmask = CNST_LIMB(1) << (lindex % GMP_LIMB_BITS);
- for ( ; lindex <= bits; lindex += step) {
- bit_array[lindex / GMP_LIMB_BITS] |= lmask;
- lmask = lmask << maskrot | lmask >> (GMP_LIMB_BITS - maskrot);
- };
- }
- mask = mask << 1 | mask >> (GMP_LIMB_BITS-1);
- index += mask & 1;
- } while (1);
- }
-}
-
-static void
block_resieve (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset,
mp_srcptr sieve)
{
@@ -375,6 +301,29 @@ block_resieve (mp_ptr bit_array, mp_size_t limbs, mp_limb_t offset,
} while (1);
}
+static void
+first_block_primesieve (mp_ptr bit_array, mp_limb_t n)
+{
+ static mp_limb_t presieved[] = {PRIMESIEVE_INIT_TABLE};
+
+ mp_size_t bits, limbs;
+ mp_limb_t i;
+
+ ASSERT (n > 4);
+
+ bits = n_fto_bit(n);
+ limbs = bits / GMP_LIMB_BITS + 1;
+
+ for (mp_size_t j = 0, lim = MIN (limbs, PRIMESIEVE_NUMBEROF_TABLE);
+ j < lim; ++j)
+ bit_array [j] = presieved [j]; /* memcopy? */
+
+ if (limbs > PRIMESIEVE_NUMBEROF_TABLE)
+ block_resieve (bit_array + PRIMESIEVE_NUMBEROF_TABLE,
+ limbs - PRIMESIEVE_NUMBEROF_TABLE,
+ GMP_LIMB_BITS * PRIMESIEVE_NUMBEROF_TABLE, bit_array);
+}
+
#define BLOCK_SIZE 2048
/* Fills bit_array with the characteristic function of composite