C ++ Coprimes问题。优化代码

时间:2010-09-11 21:24:25

标签: c++ optimization numbers

您好我想优化以下代码。它试图通过将它们与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;
}

3 个答案:

答案 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。它表示,在典型的英特尔芯片上,双打分区更快。整数除法是最慢的指令。这是一个鸡蛋问题。没有人使用它们因为它们很慢并且英特尔没有使它更快,因为没有人使用它。