1

これは、しばらくの間私を悩ませてきた単純な質問です。

コードを並列に書き直そうとしていますが、その過程で複数のノードで実行する合計を分割し、それらの小さな合計を合計する必要があります。私が取り組んでいる作品はこれです:

def pia(n, i):
        k = 0
        lsum = 0
        while k < n:
                p = (n-k)
                ld = (8.0*k+i)
                ln = pow(16.0, p, ld)
                lsum += (ln/ld)
                k += 1
        return lsum

ここnで、 は限界で、iは整数です。これを分割して最終的に同じ結果を得る方法についてのヒントはありますか?

編集:尋ねる人のために、私は使用していませんpow()が、浮動小数点で効率的に行うためのカスタムバージョンを使用しています:

def ssp(b, n, m):
    ssp = 1
    while n>0:
            if n % 2 == 1:
                    ssp = (b*ssp) % m
            b = (b**2) % m
            n = n // 2
    return ssp
4

2 に答える 2

1

あるパスから次のパスまで使用される唯一の変数はkであり、k毎回 1 ずつ増加するだけなので、計算を分割するのは簡単です。

にも渡すと、定義可能な開始点と終了点の両方が得kられpia、これを必要な数の断片に分割し、最後にすべての結果を一緒に追加できます。次のようなものです:

# instead of pia(20000, i), use pia(n, i, k) and run
result = pia(20000, i, 10000) + pia(10000, i, 0)

また、nは制限の設定と計算の両方に直接使用されるため、これら 2 つの用途を分割する必要があります。

from math import pow

def pia(nlimit, ncalc, i, k):
        lsum = 0
        while k < nlimit:
                p = ncalc-k
                ld = 8.0*k+i
                ln = ssp(16., p, ld)
                lsum += ln/ld
                k += 1
        return lsum

if __name__=="__main__":
    i, ncalc = 5, 10
    print pia(10, ncalc, i, 0)
    print pia(5, ncalc, i, 0) + pia(10, ncalc, i, 5)
于 2013-08-07T16:55:29.733 に答える