对于一个玩具程序,我需要一种有效的计算方法。
其中,
或者通过反复将
澄清:
‣ 使用
‣ 可以假设
"would do." 可以翻译为“会做。”
句子的完整翻译为:“缓慢的转移和减少算法有点像会做。”
(2**64 * x) % m
其中,
x
和 m
是 Java 的 long
类型,**
表示指数运算。可以计算为: BigInteger.valueOf(x).shiftLeft(64).mod(BigInteger.valueOf(m)).longValue()
或者通过反复将
x
向左移动并减少,但这两种方法都非常缓慢。这不是过早的优化。澄清:
‣ 使用
BigInteger
的任何算法可能比上述表达式更慢。‣ 可以假设
m
太大而无法使用 int
。 long n = (1L<<32) % m;
return ((n*n) % m) * (x % m)) % m
"would do." 可以翻译为“会做。”
句子的完整翻译为:“缓慢的转移和减少算法有点像会做。”
// assuming x >= 0
long shift32Left(long x, long m) {
long result = x % m;
for (int i=0; i<64; ++i) {
x <<= 1;
// here, `x<0` handles overflow
if (x<0 || x>=m) {
x -= m;
}
}
}
m
和/或x
有任何限制/信息吗? - Sirkoxor
。我指的是 $x^{64}$,但是在 SO 上 tex 符号无法使用。 - maaartinus