51Nod-1106-质数检测

51Nod-1106-质数检测

                1106 质数检测

给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。

Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000)
第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)

Output
输出共N行,每行为 Yes 或 No。

Input示例
5
2
3
4
5
6
Output示例
Yes
Yes
No
Yes
No

解题方法
该题可以直接暴力通过,当然,也可以用一些素数检测方法。
那些数学大师总结出的求质数的算法多种多样,如费马素数判定法、米勒-拉宾素数判定法和AKS素数测试等。

在这里我分别用暴力与费马素数判定法来解答此题。有兴趣的可以去看看其他算法。
暴力就不多解释了,说说费马素数判定法。它一个随机算法。
首先需要对费马小定理有一个基本的认识。
费马小定理的概括如下:
假如a是一个整数,p是一个质数,那么 ap1 是p的倍数,即
apa(modp)
如果a不是p的倍数,即a,p互质,定理也可以写成
ap11(modp)

也就是说随机取[1,n-1]中的值赋值给a,一旦不满足费马小定理则是合数(即不是质数),否则就是质数。

若是能翻墙的,可以去维基百科上看——质数
这上面列举了很多方法。


解题代码
暴力求解质数代码, 暴力速率太慢。

import math

def isprime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    N = int(math.sqrt(n)+1)
    for i in range(2,N): 
        if n % i == 0:
            return False
    return True

N = int(input())
for _ in range(N):
    a = int(input())
    if isprime(a):
        print('Yes')
    else:
        print('No')

费马素数判定法代码。

import random

def isprime(n, k=128):
    if n<2:
        return False
    #循环次数是自定义的,适当次数不要太小
    for _ in range(k):
        #随机取值赋值给a
        a = random.randrange(1, n)
        #判断是否符合费马小定理,不为1即不符合
        if pow(a, n-1, n)!=1:
            return False

    return True

N = int(input())
for _ in range(N):
    print('Yes' if isprime(int(input())) else 'No')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值