您好我想优化以下代码。它试图通过将它们与n进行比较来找到给定范围内的所有互质。但我想让它运行得更快......任何想法?
#include <iostream>
using namespace std;
int GCD(int a, int b)
{
while( 1 )
{
a = a % b;
if( a == 0 )
return b;
b = b % a;
if( b == 0 )
return a;
}
}
int main(void){
int t;
cin >> t;
for(int i=0; i<t; i++){
int n,a,b;
cin >> n >> a >> b;
int c = 0;
for(int j=a; j<=b; j++){
if(GCD(j, n) == 1) c++;
}
cout << c << endl;
}
return 0;
}
答案 0 :(得分:5)
这闻起来像家庭作业,所以只是一个暗示。
您无需在此计算GCD。如果你可以对n进行因式分解(即使以最粗略的方式试图除以小于2 ^ 16的每个奇数),那么你可以只计算不会被n除以的数字。
请注意,32位数最多有10个因子(我们不需要记住在分解中使用给定素数的次数)。
怎么做?尝试使用包含 - 排除原则来计算非互质。您将需要检查最多1023个素数子集,以计算每个子集所需的每个子集,即每个子集的常数时间。
无论如何,我的代码现在可以立即运行:
liori:~/gg% time ./moje <<< "1 1003917915 1 1003917915"
328458240
./moje <<< "1 1003917915 1 1003917915" 0,00s user 0,00s system 0% cpu 0,002 total
答案 1 :(得分:2)
在单核计算机上,它不会比现在快得多。因此,您希望使用多个核心甚至多台计算机。并行化和分发。
由于您想要计算GCD的每对数字都没有链接到任何其他数字,您可以使用线程轻松修改程序以利用多个核心。
如果这仍然不够快,你最好开始考虑使用分布式计算,将工作分配给许多计算机。这有点棘手,但如果搜索空间很大,应该最大程度地提高性能。
答案 2 :(得分:0)
考虑尝试使用double
s。它表示,在典型的英特尔芯片上,双打分区更快。整数除法是最慢的指令。这是一个鸡蛋问题。没有人使用它们因为它们很慢并且英特尔没有使它更快,因为没有人使用它。