Miller-Rabin素数测试算法
由于收到某退役学长的鞭策,忽然就想学习一丢数论 来补充一下虎哥基础数论中没有出现的东西 本文转载须联系作者,并标明出处 定义 Miller-Rabin素数测试,又称米勒-拉宾素性检验,是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。 卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义黎曼猜想的确定性算法,由于广义黎曼猜想并没有被证明,其后由以色列耶路撒冷希伯来大学的Michael O. Rabin教授作出修改,提出了不依赖于该假设的随机化算法。(摘自百度百科) 用处&背景 根据上面的定义可以显然的看到,这个算法的主要目的就是进行单个素数的判定 在前期学习当中,我们也学习过单个素数的判定 复杂度为 \(O(\sqrt n)\) ,代码如下 bool isPrime(int x) { if (x < 2) return false; for (int i = int(sqrt(x+0.5)); i >= 2; --i) { if (x % i == 0) return false; } return true; } 那么利用Miller-Rabin(简称MR)算法 还有优秀的龟速乘(快速加)以及快速幂 复杂度可以达到O(klog_n) MR的复杂度在百科中给出了一大堆 \(log\) 像这样: 使用快速傅里叶变换能够将这个时间推进到 \(O