簡體   English   中英

C ++共質問題。 優化代碼

[英]C++ Coprimes Problem. Optimize code

嗨,我想優化以下代碼。 它嘗試通過將它們與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;
}

這聞起來像作業,所以只是一個提示。

您無需在此處計算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

在單核計算機上,它不會比現在快得多。 因此,您想利用多個內核甚至多個計算機。 並行分發。

由於您要為其計算GCD的每對數字均未鏈接到任何其他對數字,因此您可以通過使用線程輕松地修改程序以利用多個內核。

如果仍然不夠快,您最好開始考慮使用分布式計算,將工作分配給多台計算機。 這有點棘手,但是如果搜索空間很大,則應該可以最大程度地提高性能。

考慮嘗試使用double s。 它說,在典型的英特爾芯片上,雙倍除法更快。 整數除法是目前最慢的指令。 這是一個雞蛋問題。 沒有人使用它們是因為它們速度慢,而intel卻沒有使其更快,因為沒有人使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM