[学习笔记]Miller Rabin测试

我们直接给出其测试方法。

\(a^{n - 1} \equiv 1 (\bmod p)\)

的指数分解为\(n - 1 = u \times 2^t\),在每轮测试中随机出来的\(a\),先求\(a^u(\bmod n)\),对这个值执行最多\(t\)次平方操作,发现非平凡平方根时即可判断出不是素数。

一个较为正确的 \(Miller Rabin\)

Miller Rabin
// C++ Version
bool millerRabin(int n) {
  if (n < 3 || n % 2 == 0) return n == 2;
  int a = n - 1, b = 0;
  while (a % 2 == 0) a /= 2, ++b;
  for (int i = 1, j; i <= test_time; ++i) {
    int x = rand() % (n - 2) + 2, v = quickPow(x, a, n);
    if (v == 1) continue;
    for (j = 0; j < b; ++j) {
      if (v == n - 1) break;
      v = (long long)v * v % n;
    }
    if (j >= b) return 0;
  }
  return 1;
}
posted @ 2021-12-22 21:45  fhq_treap  阅读(50)  评论(0编辑  收藏  举报