7 条题解
-
3
MillerRabin算法
算法描述
- 该算法为随机化算法,适用于大数的素性测试,时间复杂度为O(T*logn)
- 若不通过测试则该数一定为合数
- 若通过测试则该数不为素数的概率小于1/4
- 进行t次检验若均通过则该数为素数的概率为 1-4^(-t)
算法流程
- 输入正整数x, x>=3
- 计算奇数q和整数k,满足q*2^k=x-1
- 任选整数a属于(1,x-1)
- 若a^q mod x=1则通过测试
- 若a^(q*2^i) mod x=x-1则通过测试,i属于[0,k),有一次通过即可
- 若上述均不满足则不通过测试
代码实现
#include <stdlib.h> #include <stdio.h> #define ull unsigned long long ull pow(ull x, ull y, ull z) { ull res = 1; for(; y; y >>= 1) { if(y & 1) res = (res % z * x % z) % z; x = (x % z * x % z) % z; } return res; } int MillerRabin(ull x) { ull q = x - 1, k = 0; while(!(q & 1)) { q >>= 1; k++; } ull a = rand() % (x - 2) + 2; if(pow(a, q, x) == 1) return 1; for(int i = 0; i < k; i++) { if(pow(a, q, x) == x - 1) return 1; q <<= 1; } return 0; } int test(ull x) { if(x == 2) return 1; for(int i = 1; i <= 10; i++) { if(!MillerRabin(x)) return 0; } return 1; } int main() { printf("2\n"); for(int i = 3; i < 1e5; i += 2) { if(test(i)) printf("%d\n", i); } return 0; }
-
0
-
0
#include <iostream> #include <cmath> using namespace std; bool prim(int m); int main() { printf("2\n"); for(int i=3;i<=100000000;i+=2){ if(prim(i)){ printf("%d\n",i); } }return 0; }
bool prim(int m){ bool flag=true; int k=sqrt(m); for(int i=2;i<=k;i++){ if(m%i==0){ flag=false; break; } } return flag; }
- 1
信息
- ID
- 36
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 3204
- 已通过
- 788
- 上传者