タプルのベクトル(剰余、モジュラス)から中国剰余定理を計算する場合、次のコードは失敗します。
c = ((1,5),(3,7),(11,13),(19,23))
def crt(c):
residues, moduli = zip(*c)
N = product(moduli)
complements = (N/ni for ni in moduli)
scaled_residues = (product(pair) for pair in zip(residues,complements))
inverses = (modular_inverse(*pair) for pair in zip(complements,moduli))
si = (product(u) for u in zip(scaled_residues,inverses))
result = sum(si) % N
return result
結果を0として与えます(生成された反復可能オブジェクトは空だと思います)。しかし、次のコードは完全に機能します:
def crt(c):
residues, moduli = zip(*c)
N = product(moduli)
complements = list((N/ni for ni in moduli)) # <-- listed
scaled_residues = (product(pair) for pair in zip(residues,complements))
inverses = (modular_inverse(*pair) for pair in zip(complements,moduli))
si = (product(u) for u in zip(scaled_residues,inverses))
result = sum(si) % N
return result
これにより、(a) 8851の正しい結果が得られます。
なぜlist(
最初のジェネレーターの1つを使用する必要があるのですか?後続のジェネレーターに追加list
しても、失敗(0)の結果は変わりません。この最初のジェネレーターをリストするだけで、正しい結果が得られます。ここで何が起こっているのですか?