[英]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.