2 回答

TA贡献1719条经验 获得超6个赞
我可以看到发生偏差的一个地方是您对这一行的翻译,以及三个类似的翻译:
U, V = (P*U + V + n) >> 1, (D*U + P*V + n) >> 1
这些是Python中的并行赋值,即使用语句之前的旧值V计算。但在你的翻译中:U
U = (P*U + V + n) >> 1;
V = (D*U + P*V + n) >> 1;
V正在使用 的新值进行计算U。更好的翻译可能是:
long old_U = U;
U = (P*U + V + n) >> 1;
V = (D*old_U + P*V + n) >> 1;
同样,这也需要为其他并行分配完成。

TA贡献1854条经验 获得超8个赞
如果您观察到循环重复使用P * U + VandD * U + P * V值,则有改进的余地。您根本不需要oldU接受的答案中提到的变量。只需在循环开始时计算这两个,稍后将它们用于条件和新值的U计算V。您在两个方面都获胜:使用单独的值将确保分配不再并行,并且您可以节省一些不必要的重新计算:
if (k.testBit(i)) {
val PU_V = P * U + V
val DU_PV = D * U + P * V
if (IsEven(PU_V)) {
if (IsEven(DU_PV)) {
U = PU_V shr 1
V = DU_PV shr 1
}
else {
U = PU_V shr 1
V = (DU_PV + n) shr 1
}
}
else if (IsEven(DU_PV)) {
U = (PU_V + n) shr 1
V = DU_PV shr 1
}
else {
U = (PU_V + n) shr 1
V = (DU_PV + n) shr 1
}
subscript++
U %= n
V %= n
}
(这恰好是在 Kotlin 而不是 Java 中,但这没有任何区别。)
添加回答
举报