【问题标题】:Finding a prime with Miller Rabin与米勒拉宾一起寻找素数
【发布时间】:2018-11-05 21:59:13
【问题描述】:

我有我认为是使用 Lua 的 miller-rabin 算法的正确实现,并且我试图获得素数的一致回报。看来我的实现只工作了一半。尽管如果我尝试在 python 中实现类似的代码,那么该代码 100% 的时间都有效。有人能指出我正确的方向吗?

--decompose n-1 as (2^s)*d
local function decompose(negOne)
  exponent, remainder = 0, negOne
  while (remainder%2) == 0 do 
    exponent = exponent+1
    remainder = remainder/2
  end
  assert((2^exponent)*remainder == negOne and ((remainder%2) == 1), "Error setting up s and d value")
  return exponent, remainder
end

local function isNotWitness(n, possibleWitness, exponent, remainder)
  witness = (possibleWitness^remainder)%n

  if (witness == 1) or (witness == n-1) then
    return false
  end

  for _=0, exponent do
    witness = (witness^2)%n
    if witness == (n-1) then
      return false
    end
  end

  return true
end

--using miller-rabin primality testing
--n the integer to be tested, k the accuracy of the test
local function isProbablyPrime(n, accuracy)
  if n <= 3 then
    return n == 2 or n == 3
  end
  if (n%2) == 0 then
    return false
  end

  exponent, remainder = decompose(n-1)

  --checks if it is composite
  for i=0, accuracy do
    math.randomseed(os.time())
    witness = math.random(2, n - 2)
    if isNotWitness(n, witness, exponent, remainder) then
      return false
    end
  end

  --probably prime
  return true
end

if isProbablyPrime(31, 30) then
  print("prime")
else
  print("nope")
end

【问题讨论】:

  • 将math.randomseed(os.time()) 移动到程序的开头。它只能被调用一次。

标签: lua primality-test


【解决方案1】:

Python 有任意长度的整数。 Lua 没有。
问题出在witness = (possibleWitness^remainder)%n。
Lua 无法直接计算出29^15 % 31 的准确结果。
有一种适用于数字n &lt; sqrt(2^53) 的解决方法:

witness = mulmod(possibleWitness, remainder, n)

在哪里

local function mulmod(a, e, m)
   local result = 1
   while e > 0 do
      if e % 2 == 1 then 
         result = result * a % m
         e = e - 1
      end
      e = e / 2
      a = a * a % m
   end
   return result
end

【讨论】:

  • 感谢您的解释;如果我能打扰您的话:是否有该函数所基于的算法和/或数学理论?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2011-12-02
  • 1970-01-01
  • 2017-04-24
  • 2011-04-13
  • 1970-01-01
  • 2014-11-14
相关资源
最近更新 更多