2012-08-06 61 views
-4

我想讓下面的代碼快速。這需要很長時間才能運行,我得到這個錯誤:如何快速創建這個MATLAB代碼(m文件腳本)?

Warning: FOR loop index is too large. Truncating to 2147483647.

我需要計算超過3^100所以...是不可能的?

function sodiv = divisorSum(n) 
    sodiv = 0; 
    for i=1:n 
     if (mod(n,i) == 0) 
      sodiv = sodiv + i; 
     end 
    end 
end 

function finalSum1 = formular1(N,n) 
    finalSum1 = 0; 
    for k = 1:N 
     finalSum1 = finalSum1 + (divisorSum(k) * divisorSum(3^n*(N-k))); 
    end 
end 

Nv=100; 
nv=[1:20]; 

for i=1:length(nv) 
    tic; 
    nfunc1(i)=formular1(Nv,nv(i)); 
    nt1(i)=toc; 
    sprintf('nt1 : %d finished, %f', i,nt1(i)) 
end 

這段代碼的目的是檢查算法的計算時間。

+0

如果它的功課,然後'3^100'取這麼大大抵如此你不能計算它的暴力(至少不是沒有專門的軟件) – 2012-08-06 06:35:23

回答

3

這段代碼永遠不會完成,因爲它效率太低。

例如,有一個函數可以計算所有除數的數量,並且會遍歷從1到N的所有數字並計數。但使用高效的配方會讓它運行很多主。

假設需要求和的因數的總和,其中a是素數。 除了計算^ b和去形式1 to a^b,我們可以看到最好是 a^1, a^2, a^3, ..., a^n,因爲只有這些數字是除數。但是你可以更進一步,並留意這些數字的總和是the sum of geometric progression所以除數的數量變爲:

和除數,a^b = (a^(b+1)-1)/(a-1)

+0

你知道如何修改這段代碼嗎? – wonjun 2012-08-06 06:43:40

+0

你能解釋一下你需要做什麼嗎? – 2012-08-06 19:59:51

+0

我想計算Nv = 100和nv = [1:20]時的因數總和 – wonjun 2012-08-07 00:56:53

4

該算法對於這個特定的問題過於普遍且效率低下。

我知道你想總結3^100的除數。但這些除數很容易確定。

S = 1 + 3 + 3^2 + 3^3 + ... + 3^100,一個幾何級數。

3 * S = 3 + 3^2 + ... + 3^101

減法

2 * S = 3^101 - 1

S =(3^101 - 1)/ 2

+0

你知道如何修改此代碼嗎?我需要修改這段代碼來計算算法 – wonjun 2012-08-06 06:44:41

+0

的結果是http://codepad.org/mL6Sv5Fr – wonjun 2012-08-06 08:41:18