如果你要检查素数,你不妨选择一个有效的算法。正如一个答案(隐晦地)指出的那样,所有大于 2 的偶数都不是素数。因此,您可以对一半的数字进行短路检查,从而使检查任何特定数字的速度加倍:
function check_prime (x)
-- Negative numbers, 0 and 1 are not prime.
if x < 2 then
return false
end
-- Primality for even numbers is easy.
if x == 2 then
return 2
end
if x%2 == 0 then
return false
end
-- Since we have already considered the even numbers,
-- see if the odd numbers are factors.
for i = 3, math.sqrt(x), 2 do
if x%i == 0 then
return false
end
end
return x
end
我们可以应用各种优化,但让我们尝试以更 Lua 的方式来做这件事:
function sieve (x)
if x < 2 then
return false
end
-- Assume all numbers are prime until proven not-prime.
local prime = {}
prime[1] = false
for i = 2, x do
prime[i] = true
end
-- For each prime we find, mark all multiples as not-prime.
for i = 2, math.sqrt(x) do
if prime[i] then
for j = i*i, x, i do
prime[j] = false
end
end
end
return prime
end
要使用筛分功能:
prime = sieve(number)
if prime[number] then
print("Your number is prime!")
else
print("Your number is not prime!")
end
在我的测试中,sieve 版本的生成所有小于 100 万的素数的算法比之前的算法快 6 倍。(您的里程可能会有所不同。)您可以轻松地检查所有数字的素数,而number
无需额外费用。另一方面,它使用更多的内存,如果你真的想只检查一个数字的素数,它的效率就会降低。