Robin-Miller测素数
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Robin-Miller测素数相关的知识,希望对你有一定的参考价值。
#include <time.h>
#include<bits/stdc++.h>
#define int long long
using namespace std;
int N;
mt19937 rng(time(0));
int witness(int a, int n)
{
int ans = 1;
int t = n - 1;
int x;
while (t)
{
if (t & 1)ans = ans * a % n;//#define int long long
x = a;
a = a * a % n;
if (a==1&&x!=1&&x!=(n-1))return 1;
t >>= 1;
}
return (ans == 1) ? 0 : 1;
}
int MillerRobin(int n, int s)
{
if (n == 2)return 1;
if (n<2||(n&1)==0)return 0;
int a;
for (int i = 0; i < s; i++)
{
a = rng()%(n-2)+1; //#define int long long
//a =rand() * (n - 2) / RAND_MAX + 1;
if (witness(a, n))return 0;
}
return 1;
}
signed main()
{
int n;
while (scanf("%lld", &n) != EOF)
{
if (MillerRobin(n, 50))
{
printf("%lld is a prime!\\n", n);
}
else
{
printf("%lld is not a prime!\\n", n);
}
}
}
以上是关于Robin-Miller测素数的主要内容,如果未能解决你的问题,请参考以下文章