题目描述
给定多个大于 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:
return True
elif x < 37:
return False
else:
return montgomery(2, x - 1, x) and montgomery(3, x - 1, x) and montgomery(7, x - 1, x) and montgomery(19, x - 1,
x)
n = input()
while n != 'q':
if isPrime(eval(n)):
print('T')
else:
print('F')
n = input()