我想计算函数H(n)
H(0)=0;
H(i)=H(i-1)×A+Ci mod B;
10<=A,B<=10^15;
C是n个元素的数组
以下代码需要花费太多时间......有没有更好的方法呢?
public BigInteger H(int no) {
if(no>0) {
bi=H(no-1);
bi=bi.multiply(BigInteger.valueOf(A));
bi=bi.add(BigInteger.valueOf(c[no-1]));
bi=bi.remainder(BigInteger.valueOf(B));
return bi;
}
return BigInteger.ZERO;
}
答案 0 :(得分:3)
尝试使用动态编程方法。而不是使用递归,循环从最初的情况H(0)开始并从那里向上移动。例如:
public static BigInteger H(BigInteger[] c, int no, BigInteger A, BigInteger B) {
if (c.length < no - 1) {
throw new IllegalArgumentException("no is too large");
}
BigInteger bi = BigInteger.ZERO; // Initial case H(0) = 0
for (int i = 1; i <= no; i++) { // From H(1) -> H(no)
bi = bi.multiply(A).add(c[i - 1]).remainder(B);
}
return bi;
}
答案 1 :(得分:2)
尝试不使用每次迭代的余数,它使用非常慢的分区。
每次迭代都不应该使用BigInteger.valueOf()。 只创建一次A和B作为BigIntegers并保存,不需要多次执行。
答案 2 :(得分:-1)
是的,欢迎来到BigIntegers的世界。
我记得的一件事是你可以为此做两条道路:
1)BigIntegers的慢速路径 2)当两个参数都小于Max Double时,具有双原语类型的快速路径。
这应该会加快速度。
如果可以的话,请在这里告诉我们它是如何发布的。这真的很有趣。