Lua 素数检测器

Lua 素数检测器,lua,numbers,Lua,Numbers,这是我的Lua代码,用于获取用户输入,并检查输入的数字是否为素数。我的问题是程序认为任何偶数都不是素数,任何奇数都是素数 print("Enter a number.") local number = io.read("*n") function prime(n) for i = 2, n^(1/2) do if (n % i) == 0 then return false end return true end end if prime(numbe

这是我的Lua代码,用于获取用户输入,并检查输入的数字是否为素数。我的问题是程序认为任何偶数都不是素数,任何奇数都是素数

 print("Enter a number.")
 local number = io.read("*n")

 function prime(n)
 for i = 2, n^(1/2) do
   if (n % i) == 0 then
     return false
   end
   return true
 end
 end

 if prime(number) == true then
   print("Your number is prime!")
 end

 if prime(number) == false then
   print("Your number is not prime!")
 end

你太快就回到了现实。只要任何
i
满足条件,就返回true。必须将返回值放在循环之后。

返回真值
移出循环

因此:

function prime(n)
    for i = 2, n^(1/2) do
        if (n % i) == 0 then
            return false
        end
    end
    return true
end

我会用2除以数字,然后检查除法的下限是否等于除法,以此来检查素数。看起来像这样

if (input/2 == math.floor(input/2)) then
  print("is prime")
else
  print("is not prime")
end

如果要检查素性,不妨选择一个有效的算法。正如(神秘地)指出的,所有大于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

在我的测试中,对于生成所有小于100万的素数,sieve版本比以前的算法快6倍左右。(您的里程数可能会有所不同。)您可以轻松检查所有小于
number
的数字的素数,无需额外付费。另一方面,它使用了更多的内存,如果你真的想只检查一个数字的素数,它的效率就低了。

我知道这是一篇老文章,但由于它在谷歌上接近顶端,我想发布我的素数查找器不会有什么坏处。它基本上对明显的东西做一些简单的检查,然后以类似于Jon Ericson文章中第一个例子的方式循环检查剩下的东西。虽然还没有达到基准,但它似乎处理得足够好

--returns true if prime
function isPrime(n)
    local n = tonumber(n)
    --catch nil, 0, 1, negative and non int numbers
    if not n or n<2 or (n % 1 ~=0) then 
        return false
    --catch even number above 2
    elseif n>2 and (n % 2 == 0) then 
        return false
    --primes over 5 end in 1,3,7 or 9
    --catch numbers that end in 5 or 0 (multiples of 5)
    elseif n>5 and (n % 5 ==0) then 
        return false
    --now check for prime
    else
        --only do the odds
        for i = 3, math.sqrt(n), 2 do
            --did it divide evenly
            if (n % i == 0) then
                return false
            end
        end
        --can defeat optimus
        return true
    end
end
——如果为素数,则返回true
函数isPrime(n)
本地n=吨数(n)
--捕捉零、0、1、负数和非整数
如果不是n或n2和(n%2==0),则
返回错误
--超过5的素数以1、3、7或9结尾
--以5或0结尾的捕获数(5的倍数)
如果n>5且(n%5==0),则
返回错误
--现在检查素数
其他的
--只做赔率
对于i=3,math.sqrt(n),2 do
--它平均分配了吗
如果(n%i==0),则
返回错误
结束
结束
--能打败擎天柱吗
返回真值
结束
结束

顺便说一下,“请阅读我的代码并调试它”通常不是一个好问题。顺便问一下,为什么要调用
prime
两次?使用
if-then-else
构造。这是一种奇怪的方法来测试一个数字是否为偶数,而不是它是否为素数。检查一个数字是否为偶数的更简单的方法是测试
输入%2==0
。模运算符(
%
)返回两个数字除后的剩余部分。(当然,奇偶性和素性并不相同。)这个问题是谷歌搜索词“luaprime”(即使个人搜索结果关闭)的第一个结果。也许有一个有效的算法来解答这个问题。(我知道其他算法可能会产生更好的结果。)这是事实。有,但这很容易实现,应该足以处理相对较小的数字。
prime = sieve(number)
if prime[number] then
   print("Your number is prime!")
else
   print("Your number is not prime!")
end
--returns true if prime
function isPrime(n)
    local n = tonumber(n)
    --catch nil, 0, 1, negative and non int numbers
    if not n or n<2 or (n % 1 ~=0) then 
        return false
    --catch even number above 2
    elseif n>2 and (n % 2 == 0) then 
        return false
    --primes over 5 end in 1,3,7 or 9
    --catch numbers that end in 5 or 0 (multiples of 5)
    elseif n>5 and (n % 5 ==0) then 
        return false
    --now check for prime
    else
        --only do the odds
        for i = 3, math.sqrt(n), 2 do
            --did it divide evenly
            if (n % i == 0) then
                return false
            end
        end
        --can defeat optimus
        return true
    end
end