如何在O(1)运行时上找到素数

时间:2018-06-11 07:31:22

标签: math primes

我在接受采访时得到了这个问题

  

请提供一个解决方案,以检查数字是否为使用的素数   一个循环 - O(1)。输入数字可以介于1到10,000之间   仅

我说这是不可能的,除非你已经存储了所有素数高达10,000。现在我不完全确定我的答案是否正确。我试图在互联网上搜索答案,最好的我想出了运行时为O的AKS算法((log n)^ 6)

2 个答案:

答案 0 :(得分:0)

使用SoE (Sieve of Eratosthenes)可行。其结果是bool的数组通常在BYTE/WORD/DWORD数组中编码为单个位,以获得更好的存储密度。通常只有奇数存储为偶数,除了2都不是素数。通常真值意味着它不是素数......

因此,检查O(1)的天真x C ++ 代码如下所示:

bool SoE[10001]; // precomputed sieve array
int x = 27; // any x <0,10000>

bool x_is_prime = !SoE[x];

如果 SoE 被编码为8位BYTE数组,则需要稍微调整一下访问权限:

BYTE SoE[1251]; // precomputed sieve array ceil(10001/8)
int x = 27; // any x <0,10000>

BYTE x_is_prime = SoE[x>>3]^(1<<(x&7));

粗构造 SoE 不是O(1) !!!这里有一个大量使用它来加速我的IsPrime函数的例子:

答案 1 :(得分:0)

是的!, 您可以使用 Eratosthenes 筛来检查数字是否为素数, 但是,您必须预先计算一定数量的值并将其存储在数组中,并且对于每个查询,您都可以在 O(1) 中进行检查。

如果你不想预先计算,因为它需要 O(log(long)) 时间,那么你可以使用这个概念,

如果 P 是素数,则 P^2 - 1 可以被 24 整除。 所以在 C++ 的情况下,如果给定的数字小于或等于 10^9 ,我们可以使用这个概念。

这个概念的来源可以在www.brilliant.org