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 中,但這沒有任何區別。)
添加回答
舉報