【发布时间】:2014-10-29 16:51:17
【问题描述】:
我正在尝试用这个算法找到素根:
std::vector<unsigned long long> Keyexchange::primroot(unsigned long long val) {
std::vector<unsigned long long> res;
for (unsigned long long i = 2; i<val - 1; i++) {
unsigned long long start = 1;
bool flag = 1;
for (unsigned long long j = 0; j<val / 2; j++) {
start = (start * i) % val;
if (start % val == 1) {
flag = 0;
break;
}
}
if (flag) {
res.push_back(i);
}
}
return res;
}
效果很好,但速度非常慢。 我想计算像 1073741789 这样的大数的原始根。如果有可能设置一个范围,那将是最好的,因为我现在正在计算整个集合。
所以基本上我正在寻找一种方法 [代码片段会很棒] 从给定的大数字中生成大约 100.000 个最大的原始根。
我知道使用 Eulersche φ 函数会快得多,但我不知道如何实现它。
非常感谢。
【问题讨论】:
-
如果输入数字是半素数并且你知道它的(两个)素数因子,那么使用 φ 函数是可行的。你输入的数字是这样的吗?
标签: c++ algorithm math primitive