关于这道题目
需要解决的点主要是
- 判断一个数是不是素数
- 如何有效的减枝
判断一个数是不是素数
判断一个数是不是素数有很多种做法,比如试除法
今天呢使用一个更快的办法米勒测试
主要的原理是根据费马小定理
定理描述
当且仅当 P 为素数时:
ap-1 mod P 为 1
1 <= a <= p - 1
那么我们只需要选取若干个a,代入以上公式
求得结果,若均为1,说明 P 在很大概率上是个素数
代码如下
/*************************************************************************
> File Name: 1.c
> Author:Gin.TaMa
> Mail:1137554811@qq.com
> Created Time: 2019年01月08日 星期二 11时52分13秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define test_round 30
int r_m_test(int x){
if(x <= 1)return 0;
//注意对函数的输入范围进行限制,这才是一个良好的函数定义方法
int a , m, ans ;
for(int i = 0;i < test_round;i ++){
a = rand()%(x - 1) + 1;
m = x - 1;
ans = 1;
while(m){
if(m & 1)ans = ans * a % x;
a = a * a % x;
m >>= 1;
}
if(ans != 1