2012-08-06 104 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