[編集:4回目の魅力、ついに賢明なもの]
私はこれに逆戻りしました:私はフィルターベースのアプローチを示す別の答えから始め、それを使用して一連の値のすべての有効な組み合わせを生成し、オンライン整数シーケンスデータベースでシーケンスを調べました。組み合わせの数は、これはありそうにありません(なぜ3ですか?)。それはまた、あるの三角形の数であり、。これを入手したので、その理由を知る必要があります。nn2(n2+3)t(t(n))+t(t(n−1))t(a)at(a)=a(a+1)/2
第一項は簡単である-ペアのペアここでおよび、の三角形の指標である。これは、次のような関数によって実現されます。i≥jtid(i,j)≥tid(k,l)tid(a,b)a,b
def ascendings(n):
idx = 0
for i in range(1,n+1):
for j in range(1,i+1):
for k in range(1,i):
for l in range(1,k+1):
idx = idx + 1
print(i,j,k,l)
k=i
for l in range(1,j+1):
idx = idx + 1
print(i,j,k,l)
return idx
ここで、2番目のループは、三角形のインデックスをチェックするif / skipなしでループをループ内に完全にネストできないためです。llk
2番目の項は、最初のペアが昇順で、2番目のペアが降順です(上で処理されるため、no ==に注意してください)。t(t(n−1))
def mixcendings(n):
idx = 0
for j in range(2,n+1):
for i in range(1,j):
for k in range(1,j):
for l in range(1,k):
print(i,j,k,l)
idx = idx + 1
k=j
for l in range(1,i+1):
print(i,j,k,l)
idx = idx + 1
return idx
これらの両方を組み合わせることで完全なセットが得られるため、両方のループをまとめると、インデックスの完全なセットが得られます。
重要な問題は、これらのパターンを任意のi、j、k、lに対して計算するのが難しいことです。したがって、i、j、k、lが与えられたインデックスを生成するマップを提案します。率直に言って、これを行う場合は、指定された一度だけ行う必要があるため、generate + filterアプローチを使用することもできます。上記の方法のプラス面は、少なくとも予測可能なループ構造があることです。n
Pythonでは、次のイテレータを記述して、さまざまなシナリオごとにidxおよびi、j、k、lの値を提供できます。
def iterate_quad(n):
idx = 0
for i in range(1,n+1):
for j in range(1,i+1):
for k in range(1,i):
for l in range(1,k+1):
idx = idx + 1
yield (idx,i,j,k,l)
#print(i,j,k,l)
k=i
for l in range(1,j+1):
idx = idx + 1
yield (idx,i,j,k,l)
for i in range(2,n+1):
for j in range(1,i):
for k in range(1,i):
for l in range(1,k):
idx = idx + 1
yield (idx,i,j,k,l)
k=i
for l in range(1,j+1):
idx = idx + 1
yield (idx,i,j,k,l)
in3+jn2+kn+l
integer function squareindex(i,j,k,l,n)
integer,intent(in)::i,j,k,l,n
squareindex = (((i-1)*n + (j-1))*n + (k-1))*n + l
end function
integer function generate_order_array(n,arr)
integer,intent(in)::n,arr(*)
integer::total,idx,i,j,k,l
total = n**2 * (n**2 + 3)
reshape(arr,total)
idx = 0
do i=1,n
do j=1,i
do k=1,i-1
do l=1,k
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
k=i
do l=1,j
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
end do
do i=2,n
do j=1,i-1
do k=1,i-1
do l=1,j
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
k=i
do l=1,j
idx = idx+1
arr(idx) = squareindex(i,j,k,l,n)
end do
end do
end do
generate_order_array = idx
end function
そして、このようにループします:
maxidx = generate_order_array(n,arr)
do idx=1,maxidx
i = idx/(n**3) + 1
t_idx = idx - (i-1)*n**3
j = t_idx/(n**2) + 1
t_idx = t_idx - (j-1)*n**2
k = t_idx/n + 1
t_idx = t_idx - (k-1)*n
l = t_idx
! now have i,j,k,l, so do stuff
! ...
end do