素数性をチェックする場合は、効率的なアルゴリズムを選択することをお勧めします。1つの答えが(不可解に)指摘したように、2より大きいすべての偶数は素数ではありません。したがって、半分の数のチェックを短絡することができます。これにより、特定の数をチェックする速度が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
私のテストでは、ふるいバージョンは、100万未満のすべての素数を生成するための以前のアルゴリズムよりも約6倍高速です。(マイレージは異なる場合があります。)number
追加費用なしで、すべての番号の素数性を簡単に確認できます。一方、それはより多くのメモリを使用し、本当に1つの数値の素数性をチェックしたい場合は、効率が低下します。