0
点赞
收藏
分享

微信扫一扫

判断素数问题(费马小定理,蒙哥马利模幂)

金刚豆 2022-04-02 阅读 63
python

题目描述

给定多个大于 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()
举报

相关推荐

0 条评论