在从元组向量(残差,模数)计算中国剩余定理时,以下代码失败:
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(
使用第一批发电机之一?添加list
到任何后续生成器不会更改失败 (0) 结果。仅列出第一个生成器会产生正确的结果。这里发生了什么 ?