迭代计算递归序列 - 代码优化

时间:2015-11-16 19:34:26

标签: iteration time-complexity sequence magma

我必须按如下方式计算序列的前3000项:

A_1 = 1, a_n + 1 =最小整数> a_n,对于每个(不一定是不同的)1< = i,j,k< = n + 1适用(a_i + a_j不等于3 * a_k)

我编写的代码(在Magma中)可以正常工作,但其时间复杂度显然太大了。我在问是否有办法减少时间复杂度。我有一个想法以某种方式移动内部for循环(这是造成破坏的那个)以一种方式来制作所有总和的数组,但我不能让它正常工作。在下面附上我的代码:

S:=[1];
for n:=2 to 3000 do
    new:=S[n-1];
    repeat
        flag:=0;
        new+:=1;
        for i,j in S do
            if (i+j eq 3*new) or (i+new eq 3*j) then
                flag:=1;
                break i;
            end if;
        end for;
    until flag eq 0;
    S[n]:=new;
end for;
print S[2015];

P.S。:如果有帮助,如果你喜欢这些语言,我也会认识Python,Pascal和C.

1 个答案:

答案 0 :(得分:0)

我在MAGMA中复制了你的程序。 n=2978的运行时间为4712.766秒。我改变你的程序如下,结果很棒。 n=3000的更改版本的运行时间为41.250秒。

S:=[1];
for n:=2 to 3000 do
    new:=S[n-1];
    repeat
        flag:=0;
        new+:=1;
        for i in S do
            if ((3*new-i) in S) or ((i+new)/3 in S) then
                flag:=1;
                break i;
            end if;
        end for;
    until flag eq 0;
    S[n]:=new;
end for;