求原根
程序员文章站
2022-07-09 12:37:26
...
输入m, 输出它的所有原根
Code:
#include<bits/stdc++.h>
using namespace std;
int ele[100000];
bool IsPrime(int num)
{
bool flag = true;
for(int i = 2; i <= sqrt(num); i++)
{
if(num % i == 0) {
flag = false;
while(num % i == 0){
ele[i]++;
num /= i;
}
}
}
return flag;
}
int Euler(int num)
{
if(IsPrime(num))
return num-1;
else
{
int ans = num;
for(int i = 0; i <= sqrt(num); i++)
{
if(ele[i] != 0)
ans = (ans/i) * (i-1);
}
return ans;
}
}
int Pow(int a, int b, int mod)
{
int ans = 1, base = a%mod;
while(b != 0)
{
if(b & 1)
ans = (ans * base) % mod;
base = (base * base) % mod;
b >>= 1;
}
return ans;
}
int main()
{
int m;
while(scanf("%d", &m) != EOF)
{
int i, j;
int ans = Euler(m);
for(i = 1; i < m; i++)
{
for(j = 1; j <= ans; j++)
if(Pow(i, j, m) == 1)
break;
if(j == ans)
cout << i << endl;
}
}
return 0;
}
上一篇: 小米耳机值得买吗 小米降噪项圈蓝牙耳机上手体验及评测
下一篇: 数字签名