Miller Rabin算法学习笔记

定义:

Miller Rabin算法是一个随机化素数测试算法,作用是判断一个数是否是素数,且只要你脸不黑以及常数不要巨大一般来讲都比\(O(\sqrt n)\)的朴素做法更快。

定理:

Miller Rabin主要基于费马小定理:
\(a ^ {p-1} \equiv 1 (mod p)\),其中\(p\)是质数。
于是就有闲得没事干的一群科学家们想,这个问题的逆命题是否成立呢?

逆命题:若对于任意\(a\)\(a ^ {p-1} \equiv 1 (mod p)\)都成立,那么\(p\)是质数。

在很长一段时间里,所有人几乎都以为它是成立的。然鹅你们手玩一个\(a=8, p = 9\)试试
是的,这个东西被搞出了反例。不过幸运的是,用这个办法测试通过的数,还是有很大概率是质数的。
这好办,我们多搞几次不就可以当做它就是质数了吗!脸黑另说

算法流程:

首先我们还得了解一个叫二次探测定理的东西:
\(若p是质数,且x^2 \equiv 1 (mod p), 则有x \equiv ±1 (mod p)\)
证明很简单,第一个式子右边丢过去平方差即可。由于p是质数,所以它肯定不是\((x-1)和(x+1)\)凑起来的,故两个里面总有一个是\(p\)的倍数。
而且很容易脑补的是,这个东西的逆命题是成立的。(划重点)
所以根据这两个定理,我们设计一波算法:
假设我们要判断的数是\(p\),那么\(2\)特判一波,剩下的质数肯定是偶数。
所以\(p-1\)一定是一个奇数。然后就好办辣!
我们把\(p-1\)分解成\(2^k * t\),当\(p\)是素数是,根据费马小定理有\(a ^ {2^k * t} \equiv 1 (mod p)\)
那么我们随机出一个\(a\),然后求出\(a^t\),再不断乘上\(a\),每次进行二次探测,若乘之前不符合二次探测,而乘之后符合,那么p是合数,不符合题意。
老祖宗告诉我们(这个我也不会证),每一次通过测试的数不是质数的概率为\(1/4\)

猜你喜欢

转载自www.cnblogs.com/kma093/p/11115535.html
今日推荐