题目描述
给定多个大于 1 的整数,判断是否为素数
输入
输入多行,每行是一个大于 1 的整数或字母 q
输出
对于每一行输入:
如果该行是正整数,那么输出一行,输出内容为 T 或 F,代表这个正整数是或不是素数;
如果该行是字母 q,则退出程序
样例输入
8888 123 29 q
样例输出
F F T
解法
对待判断数p,取几个素数a验证a^(p-1)与1模p同余,根据费马小定理若不同余,则p为合数,因此通过多取不同的素数进行检验能够极大概率保证准确率。
而同时使用蒙哥马利模幂来加速a^(p-1)mod p 的运算过程。
代码如下:
def montgomery(base, quo, mod):
c = 1
while quo > 0:
c = c * (1 if quo % 2 == 0 else base) % mod
quo >>= 1
base = base * base % mod
return c == 1
def isPrime(x):
if x == 2 or x == 3 or x == 5 or x == 7 or x == 11 or x == 13 or x == 17 or x == 19 or x == 23 or x == 29 or x == 31: