- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Exercise 1.28. One variant of the Fermat test that cannot be fooled is called the Miller-Rabin test (Miller 1976; Rabin 1980). This starts from an alternate form of Fermat's Little Theorem, which states that if n is a prime number and a is any positive integer less than n, then a raised to the (n - 1)st power is congruent to 1 modulo n. To test the primality of a number n by the Miller-Rabin test, we pick a random number a < n and raise a to the (n - 1)st power modulo n using the expmod procedure. However, whenever we perform the squaring step in expmod, we check to see if we have discovered a ''nontrivial square root of 1 modulo n,'' that is, a number not equal to 1 or n - 1 whose square is equal to 1 modulo n. It is possible to prove that if such a nontrivial square root of 1 exists, then n is not prime. It is also possible to prove that if n is an odd number that is not prime, then, for at least half the numbers a < n, computing a^(n-1) in this way will reveal a nontrivial square root of 1 modulo n. (This is why the Miller-Rabin test cannot be fooled.) Modify the expmod procedure to signal if it discovers a nontrivial square root of 1, and use this to implement the Miller-Rabin test with a procedure analogous to fermat-test. Check your procedure by testing various known primes and non-primes. Hint: One convenient way to make expmod signal is to have it return 0.
(define (fast-prime? n)
(define (fast-prime-iter n counter)
(cond ((= counter 1) #t) ; There is no need to check 1
((miller-rabin-test n counter)
(fast-prime-iter n (- counter 1)))
(else
(newline)
(display counter)
#f)))
(fast-prime-iter n (- n 2)))
(define (miller-rabin-test n a)
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(nontrivial-square-root?
(remainder (square (expmod base (/ exp 2) m))
m)))
(else
(remainder (* base (expmod base (- exp 1) m))
m))))
(= (expmod a (- n 1) n) 1))
(define (nontrivial-square-root? val)
(if (= val 1)
0
val))
我的想法是使用过程 nontrivial-square-root?
过滤掉那些所谓的“1 模 n 的非平凡平方根”。如果 (remainder (square (expmod base (/exp 2) m)) m)
为 1,则返回 0
,在这种情况下,(expmod base (/exp 2) m)
必须等于 1 modulo n(这是因为 m
始终等于 n
),使其成为非平凡的平方根。
虽然 nontrivial-square-root?
确实过滤掉了 561、1105、1729、2465、2821 和 6601 等卡迈克尔数,但据报道 7 和 13 等素数也是合数。
是什么导致了这些假阴性?
最佳答案
引用的重要部分用粗体标出:
However, whenever we perform the squaring step in expmod, we check to see if we have discovered a ''nontrivial square root of 1 modulo n,'' that is, a number not equal to 1 or n - 1 whose square is equal to 1 modulo n
因此,在平方和取余之前,您必须检查参数不是 1 或 n - 1。这种情况会发生,例如,如果您调用 (miller-rabin-test 5 3)
.计算递归时,您会注意到有一个调用 (nontrivial-square-root? (remainder (square 4) 5))
计算结果为 (nontrivial-square-root? 1)
。但是,5 仍然可以是质数,因为 4 是 5 - 1。
因此在平方部分,您可以调用以下函数:
(define (sqrmod-with-check val n)
(let ((sqrmod (remainder (square val) n)))
(cond ((or (= val (- n 1)) (= val 1)) sqrmod)
((= sqrmod 1) 0)
(else sqrmod))))
参数是 expmod
调用和 m
。这会为您计算平方和余数,除非我们找到 1 模 n 的非平凡平方根,当它返回 0 时。我将它分为三个条件,而不是两个,只是为了可读性。
关于algorithm - SICP练习1.28 : false negatives in the Miller-Rabin test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785214/
突然遇到两种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 步)
我是一名优秀的程序员,十分优秀!