- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近遇到了这段 Rabin-Miller 算法的代码,如描述的那样 here :
from random import randint
def _bits_of_n(n):
""" Return the list of the bits in the binary
representation of n, from LSB to MSB
"""
bits = []
while n:
bits.append(n % 2)
n /= 2
return bits
def _MR_composite_witness(a, n):
""" Witness functions for the Miller-Rabin
test. If 'a' can be used to prove that
'n' is composite, return True. If False
is returned, there's high (though < 1)
probability that 'n' is prime.
"""
rem = 1
# Computes a^(n-1) mod n, using modular
# exponentation by repeative squaring.
#
for b in reversed(_bits_of_n(n - 1)):
x = rem
rem = (rem * rem) % n
if rem == 1 and x != 1 and x != n - 1:
return True
if b == 1:
rem = (rem * a) % n
if rem != 1:
return True
return False
def isprime_MR(n, trials=6):
""" Determine whether n is prime using the
probabilistic Miller-Rabin test. Follows
the procedure described in section 33.8
in CLR's Introduction to Algorithms
trials:
The amount of trials of the test.
A larger amount of trials increases
the chances of a correct answer.
6 is safe enough for all practical
purposes.
"""
if n < 2:
return False
for ntrial in xrange(trials):
if _MR_composite_witness(randint(1, n - 1), n):
return False
return True
我知道 RM 测试应该采用 N,分解 N-1 = t*(2^s),然后尝试找到 a^t != 1 和 a^((2^r)t) ! = -1 对于所有 0 <= r < s
但是这个算法做了一些不同的事情。它部分让我想起了 Fermats 算法,我们在其中测试 a^(n-1) mod n == 1,因为它使用平方和乘法得到 a^(n-1) 但检查是否有任何中间结果是一致的 1国防部
我看不出这 2 个是等价的,你能解释一下为什么 (x^2==1 and x != 1 and x!=n-1) 可以作为充分条件吗?
谢谢!
最佳答案
如果我们找到一个与 1(模 n)一致的中间结果,并且之前的结果 x 不与 1 或 -1(即 n-1)模 n 一致,那么这个数字 x 是一个非平凡的平方1 模 n 的根(即一个数字 x 使 x ≠ -1, 1 mod n 但 x^2 = 1 mod n)。这意味着 n 是合数。
证明:为了自相矛盾,假设x^2 与1 模p 全等,x 不是1 或-1 模p,并且p 是质数。这相当于说 p 除 x^2 - 1 = (x-1)(x+1)。因此,由于 p 是质数,p 整除 x-1 或 x+1,这意味着 x 与 1 或 -1 模 p 全等。
这就是为什么 (x^2==1 and x != 1 and x!=n-1) 是一个充分条件——这直接意味着 n 是合数。因此我们可以提前停止算法以节省计算时间。
正如您的链接状态(有错别字),在 Cormen、Leiserson、Rivest 和 Stein 的《算法简介》第 31.8 节中可以找到对此的一个很好的解释,我的一些回答改编自那本书。
关于python - 使用模平方的 Rabin-Miller 素数测试算法是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30541639/
突然遇到两种Miller Rabin素性检验方法。其中一个uses randoms和另一个 does not use randoms . 第二个里面有隐藏的随机生成还是什么?谢谢。 最佳答案 第二个是
我正在实现 Wikipedia's Miller-Rabin algorithm但似乎没有得到甚至模糊恰当的结果。 7, 11, 19, 23 等被报道为复合 Material 。事实上,当 k>12
我很清楚单个 Miller-Rabin 测试以三次对数时间运行。我知道蒙哥马利模幂和 GNFS 并且我不会问任何那些奇特的理论。我想知道的是,在特征硬件(例如,2.2 GHz Opteron 或某某显
我正在尝试制作 RSA 算法。为此,我需要 rabin-miller+witness+modular exponentiation(至少我需要使用它)。当我生成随机数以检查 rabin miller
我有 Miller-Rabin 实现 def MillerRabin(n,a): e = 0 q = n-1 while q % 2 == 0: e +=
我是一名计算机科学专业的学生,我正在自学算法类(class)。 在类(class)中我看到了这个问题: Show an efficient randomized algorithm to fact
我需要每天拆分包含 50K+ 列的巨大 (>1 Gb) CSV 文件。 我找到了Miller作为此类任务的有趣且高性能的工具。 但我被米勒的文档困住了。 如何将一个 CSV 拆分为 N 个较小的 CS
我仍然是一个新手编码员,本着努力提高我的技能的精神,我正在开发一个 Miller-Rabin java 程序,该程序似乎在大多数情况下都能工作。然而,有一些数字会导致程序连续运行(至少几分钟)。 其中
我正在学习 Miller Rabin,我正在查看来自 https://en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/Primal
Miller-Rabin test使用 k 个随机整数来测试素数。 根据 CLRS,第 3rd 版,第 971 页: Theorem 31.38 If n is an odd composite nu
我是 Scheme 新手。我尝试并使用 PLT Scheme 实现了 Rabin-Miller 算法的概率变体。我知道这是概率性的,但大多数时候我都得到了错误的结果。我已经使用 C 实现了同样的事情,
我最近遇到了这段 Rabin-Miller 算法的代码,如描述的那样 here : from random import randint def _bits_of_n(n):
作为我自己的练习,我正在实现 Miller-Rabin 测试。 (通过 SICP 工作)。我理解费马小定理并且能够成功地实现它。我在 Miller-Rabin 测试中被绊倒的部分是这个“1 mod n
我正在尝试使用确定性 Miller-Rabin 算法实现素数检查功能,但结果并不总是正确的:在检查前 1,000,000 个数字时,它只找到 78,495 而不是 78,498。 这是使用 [2, 7
我知道 Miller–Rabin primality test是概率的。但是我想将它用于 programming task没有错误的余地。 如果输入数字是 64 位整数(即 C 中的 long lon
我正在为 Diffie-Hellman 类型的 key p 生成一个 2048 位安全素数,使得 p 和 (p-1)/2 都是素数。 我可以在 p 和 (p-1)/2 上使用多少次 Rabin-Mil
欢迎。我正在尝试实现 MillerRabin 测试以检查给定的大数是否为素数。这是我的代码: public static bool MillerRabinTest(BigInteger number
我正在尝试使用 Park&Miller RNG ran0 1 2 3(3 目前不起作用)在 C++ 中生成伪随机数,来自“C 中的数值配方”。这些生成器可以正常工作,因为它使样本均匀分布在 0 和 1
我一直在尝试实现 the algorithm from wikipedia虽然它从不将合数输出为质数,但它会将大约 75% 的质数输出为合数。 最多 1000 它为我提供了这个素数输出: 3, 5,
我已经实现了 Miller-Rabin 素数测试,并且每个函数似乎都可以单独正常工作。但是,当我尝试通过生成 70 位随机数来找到素数时,我的程序在找到通过 Miller-Rabin 测试(10 步)
我是一名优秀的程序员,十分优秀!