我正在实现一个相当快的素数生成器,并通过对 Eratosthenes 的筛子进行了一些优化,获得了一些不错的结果。特别是,在算法的初步部分,我以这种方式跳过了所有 2 和 3 的倍数:
template<class Sieve, class SizeT>
void PrimeGenerator<Sieve, SizeT>::factorize()
{
SizeT c = 2;
m_sieve[2] = 1;
m_sieve[3] = 1;
for (SizeT i=5; i<m_size; i += c, c = 6 - c)
m_sieve[i] = 1;
}
这m_sieve
是根据埃拉托色尼筛法的布尔数组。我认为这是一种仅考虑素数 2 和 3 的轮分解,按照模式 2、4、2、4、.. 递增。
我想做的是实现一个更大的轮子,也许考虑素数 2,3 和 5。
我已经阅读了很多关于它的文档,但我没有看到任何使用 Eratosthenes 筛子的实现......示例代码可以提供很多帮助,但也有一些提示会很好:) 谢谢。