质数判断(Miller_Rabin)
发布时间:2020-12-14 03:18:16 所属栏目:大数据 来源:网络整理
导读:题意简述 给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 题解思路 费马小定理: n是一个奇素数,a是任何整数( (1≤ a≤n-1) ) ,则 (a^{p-1}≡1(mod p)) 。 推论: 如果n是一个奇素数,则方程 (x^2 ≡ 1 (mod n))
题意简述给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 题解思路费马小定理: n是一个奇素数,a是任何整数((1≤ a≤n-1)) ,则(a^{p-1}≡1(mod p))。 代码#include <cstdio> using namespace std; const int t[5] = {0,2,7,61}; int n,m,x; int ksm(int a,int r,int mod) { if (r == 0) return 1; if (r == 1) return a; int x = ksm(a,r >> 1,mod) % mod; if (r & 1) return ((long long) x * x * a) % mod; else return ((long long) x * x) % mod; } bool mr(int x) { if (x == 1) return 0; int cnt = 0,p1 = x - 1; while (p1 % 2 == 0) { ++cnt; p1 /= 2; } for (int i = 1; i <= 3; ++i) { if (x == t[i]) return 1; int xx = ksm(t[i],p1,x); if (xx % x != 1 && xx % x != x - 1) { bool flag = 0; for (int j = 1; j <= cnt; ++j) { xx = (long long) xx * xx % x; if (xx == x - 1) { flag = 1; break; } } if (!flag) return 0; } } return 1; } int main() { scanf("%d%d",&n,&m); for (int i = 1; i <= m; ++i) { scanf("%d",&x); if (mr(x)) puts("Yes"); else puts("No"); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |