Baillie PSW 素性测试
2023 年 1 月 22 日
目录
理论
理论我也讲不出啥。
一个显然的观察是,Fermat 反素数和 Lucas 反素数的从计算过程来看就很不一样,换基不如换算法。把两个算法糅到一块就行了。
算法描述
输入整数 $N$ 。
- 试除小素数,若能整除则输出 $N$ 为合数。
- 使用基为 $2$ 的 Miller Rabin 算法
- 进行一次 Lucas 素性测试判断。
$2^{64}$ 内无反例。
备注
在 LOJ143 上跑起来没 Miller Rabin 算法快,也可能是数据有所针对。
参考
代码
#ifndef ALGO_MATH_BAILLIE_PSW
#define ALGO_MATH_BAILLIE_PSW
#include "../../base.hpp"
#include "miller-rabin.hpp"
#include "lucas.hpp"
bool baillie_psw_test(u64 n) {
if (n <= 6)
return n == 2 || n == 3 || n == 5;
if (n % 6 != 1 && n % 6 != 5)
return false;
if (!miller_rabbin_base(n, 2))
return false;
u64 d = 5;
while (jacobi(d, n) != -1)
d += 4;
return lucas_test_pd(n, d, d);
}
#endif // ALGO_MATH_BAILLIE_PSW