素数–一个大于1的自然数,除了1和它本身外,不能整除以其他自然数,因其特殊的性质,被广泛用于密码学领域,在程序设计竞赛及各大公司的面试中也经常出现,今天和大家分享几道有关素数的基础问题。
素性测试
问题描述:给定整数num,判断num是不是素数。
由素数的定义,我们知道一个素数只能拥有两个约数,即1和它本身,又因为一个数的约数不能大于它本身,由此只要我们只要遍历2到num-1,找到除此之外的约数即可判断其不为素数,否则就判断它是一个素数。这样遍历时间复杂度为O(n)。但是,约数是相互对称的,即n1是num的约数,则num/n1也是num的约数,这样我们其实搜索2到sqrt(num)(定义sqrt(num)为num开根号)即可。这样时间复杂度为O(sqrt(n))。
代码:
#include<iostream>
bool is_prime(int num){
bool result = true;
if (num<2)
{
result = false;
}
for (int i = 2; i*i <= num; i++)
{
if (num % i == 0)
{
result = false;
break;
}
}
return result;
}
int main(){
int num = 0;
printf("请输入数字:\n");
scanf_s("%d", &num);
if (is_prime(num))
printf("Yes\n");
else
printf("No\n");
system("pause");
return 0;
}
费马检测
这同样是一个判断素数的方法,费马检测是基于费马小定理的检测方法,是一种基于概率的检测方法。
费马小定理:
假如p是质数,且Gcd(a,p)=1,那么 a^(p-1) ≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1,即a^(p-1) % p