5

f(a,b,c,d)次の順列対称性を持つスカラー関数があります

f(a,b,c,d) = f(c,d,a,b) = -f(b,a,d,c) = -f(d,c,b,a)

私はそれを使用して、4D 配列を完全に設定しています。以下のコード (python/NumPy を使用) は機能します。

A = np.zeros((N,N,N,N))
for a in range(N):
    for b in range(N):
        for c in range(N):
            for d in range(N):
                A[a,b,c,d] = f(a,b,c,d)

しかし明らかに、対称性を利用して、このコード セクションの実行時間を短縮したいと考えています。私はもう試した:

A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
    for b in range(N):
        ab += 1
        cd  = 0
        for c in range(N):
            for d in range(N):
                cd += 1
                if ab >= cd:
                    A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)

これにより、実行時間が半分に短縮されます。しかし、私が試した最後の対称性のために:

A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
    for b in range(N):
        ab += 1
        cd  = 0
        for c in range(N):
            for d in range(N):
                cd += 1
                if ab >= cd:
                    if ((a >= b) or (c >= d)):
                        A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)
                        A[b,a,d,c] = A[d,c,b,a] = -A[a,b,c,d]

これはうまくいきますが、2 倍のスピードアップは得られません。正しい理由で正しいとは思いませんが、理由がわかりません。

ここで、この特定の順列対称性をよりうまく活用するにはどうすればよいでしょうか?

4

1 に答える 1