用c++编程输出给定素数的所有原根,输入素数模m以及m-1的素因子分解 m-1=p_1^(e_1 ) p_2^(e_2 )……p_k^(e_k ),输出m的所有原根
时间: 2024-03-10 13:44:44 浏览: 49
好的,我来为你解答这个问题。
首先,什么是原根呢?在模数为m的剩余系中,若存在一个整数g,使得g的阶为φ(m),则称g为模m的一个原根。
对于给定的素数p,我们可以用以下的代码来求出p的所有原根:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 判断x是否为素数
bool is_prime(int x) {
if(x <= 1) return false;
int sqr = sqrt(x);
for(int i = 2; i <= sqr; i++) {
if(x % i == 0) return false;
}
return true;
}
// 求x的y次方模z的结果
int pow_mod(int x, int y, int z) {
int res = 1;
while(y) {
if(y & 1) res = (long long)res * x % z;
x = (long long)x * x % z;
y >>= 1;
}
return res;
}
// 求模数为m的所有原根
vector<int> primitive_roots(int m) {
vector<int> factor;
int phi = m - 1;
int tmp = phi;
for(int i = 2; i <= sqrt(phi); i++) {
if(tmp % i == 0) {
factor.push_back(i);
while(tmp % i == 0) {
tmp /= i;
}
}
}
if(tmp > 1) factor.push_back(tmp);
vector<int> roots;
for(int i = 2; i <= m; i++) {
bool flag = true;
for(int j = 0; j < factor.size() && flag; j++) {
flag &= pow_mod(i, phi / factor[j], m) != 1;
}
if(flag) roots.push_back(i);
}
return roots;
}
int main() {
int m;
cin >> m;
if(!is_prime(m)) {
cout << "m must be a prime number!" << endl;
return 0;
}
vector<int> roots = primitive_roots(m);
cout << "Primitive roots of " << m << ":" << endl;
for(int i = 0; i < roots.size(); i++) {
cout << roots[i] << " ";
}
cout << endl;
return 0;
}
```
其中,我们首先判断输入的m是否为素数,如果不是则输出错误信息。然后,我们通过素数分解求出m-1的所有素因子,进而求出φ(m),最后枚举2到m-1的所有数,判断其是否为原根。
希望能够帮助到你!
阅读全文