t = 0 // trip count
for l in 0:N
for k in 0:N
for j in max(l,k):N
for i in k:j+1
t += 1
t is loop trip count
是否有一般算法/方式(显然优于N ^ 4)来计算循环行程计数?
如果没有,我很想知道你将如何接近这个特定的循环。上面的循环是对称的(它是在对称秩-4张量上的循环),我也对检测循环对称性的方法感兴趣。
我正在假设迭代边界仅依赖于常量或先前的循环变量。链接/期刊文章,如果你知道一个,那就太好了。
答案 0 :(得分:2)
我相信内循环会运行
t = 1/8 * (N^4 + 6 * N^3 + 7 * N^2 + 2 * N)
次。
我没有直接解决问题,我将4阶多项式表达式拟合为从1到50精确计算的N,希望我能得到精确拟合。
计算我使用过的确切
sum(sum(sum(sum(1,i,k,j+1),j,max(l,k),N),k,1,N),l,1,N)
应该相当于实际运行循环。
data fit, log scale http://img714.imageshack.us/img714/2313/plot3.png
N的拟合从1到50完全匹配,并且计算N = 100得到13258775使用这两种方法。
编辑: 练习是使用开源代数系统maxima完成的,这里是实际的源(丢弃输出):
nr(n):=sum(sum(sum(sum(1,i,k,j+1),j,max(l,k),n),k,1,n),l,1,n);
M : genmatrix( lambda([i,j],if j=1 then i else nr(i)), 50, 2 );
coefs : lsquares_estimates(M, [x,y], y = A*x^4+B*x^3+C*x^2+D*x+E, [A,B,C,D,E]);
sol(x):=ev(A*x^4+B*x^3+C*x^2+D*x+E, coefs);
sol(N);
S : genmatrix( lambda([i,j], if j=1 then i else sol(i)), 50, 2);
M-S;
plot2d([[discrete,makelist([M[N][1],M[N][2]],N,1,50)], sol(N)], [N, 1, 60], [style, points, lines], [color, red, blue], [legend, "simulation", sol(N)], [logy]);
compare(nr(100),sol(100));
答案 1 :(得分:0)
如果你想知道内循环的次数:
for j in max(l,k):N
将执行,只计算:N - max(l, k)
假定开放范围,N + 1 - max(l, k)
假设闭合范围。
例如,如果:
l = 2
k = 7
N = 10
然后它将在7,8,9,10(闭范围)上运行,所以确实10 + 1 - 7 = 4
次。
答案 2 :(得分:0)
答案是 no ,只要循环边界可以以任意方式从外部变量中获取,因为这将提供获得整数系列的闭合形式公式的一般方法。
要查看此内容,请考虑以下事项:
for x in 0:N
for y in 0:f(x)
t += 1
行程计数t(N)等于和t(N)= f(0)+ f(1)+ f(2)+ f(3)+ ... + f(N-1)。< / p>
因此,如果你能得到t(N)的封闭形式公式而不管f(),你已经找到了一种生成封闭形式的非常通用的方法,我会说,因为你在这里对应的是积分,众所周知,并非所有积分都承认封闭形式。