需要帮助解决免费pascal中的eratosthenes筛选

时间:2014-10-08 02:42:26

标签: primes pascal sieve-of-eratosthenes sieve wheel-factorization

我的老师给了我这个:

N'LT = 10 ^ 6;

n个整数的数组:ai..an(ai< = 10 ^ 9);

找到所有素数。

他说了一些关于eratosthenes的筛子,我读到了它,也读了轮子因子化,但我仍然无法弄清楚如何让程序(fpc)以1s运行。 我知道这是不可能的,但仍然想知道你的意见。  并且通过车轮分解,一个2 * 3的圆圈会将25视为素数,我想问一下是否有办法找出错误的轮子的第一个数字作为素数。 例如:2 * 3 * 5圈,如何找到第一个复合数作为极数? 请帮忙..对不起英语不好。

2 个答案:

答案 0 :(得分:1)

一个适当的Eratosthenes筛子应该在大约一秒钟内找到不到十亿的素数;这是可能的。如果您向我们展示您的代码,我们很乐意帮助您找到问题所在。

没有用2,3,5轮标记的最小复合材料是49:未成为轮子成员的下一个最大复合材料是7,而7 * 7 = 49。

答案 1 :(得分:0)

我现在就做了,它在几毫秒内找到了1000000的素数,而没有显示所有这些数字。 声明一个n + 1个bool的数组a(如果它是从零开始的)。在开头0和第1个元素是假的,所有其他元素都是真的(假不是素数)。 该算法看起来像:

i = 2;
while i * i <= n
    if a[i] == true
        j = i * i;
        while j < n
            a[j] = false;
            j = j + i;
    i = i + 1;

在一个循环中,条件是i * i&lt; = n因为你从i * i开始搜索(比其他素数之一已经发现的素数小),所以i的平方根不能大于n。删除所有素数乘以n的数字。 时间复杂度为O(n log log n)。 如果要显示素数,则显示数组中的值为true的索引。

如果您想查找例如,则分解是有用的所有半数从0到n(两个素数的乘积)。然后你找到从0到n / 2的所有最小素数除数,并检查每个数字是否有素数除数,如果数除以其素数除数为零除数。如果是这样 - 这是一个半素。我的程序写得像是第一次查找所有素数然后将它们相乘并将结果保存在数组中的速度快8倍。