输入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;
}
本文介绍了一个C++程序,该程序用于求解给定整数m的所有原根。通过判断m是否为素数并计算欧拉函数值来找到m的所有原根。文章包含完整的代码实现,包括素性检测、欧拉函数计算、幂运算和查找原根等功能。
4315

被折叠的 条评论
为什么被折叠?



