优化非常大数的算术运算

时间:2010-08-08 16:45:55

标签: java biginteger largenumber

我想计算函数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;

}

3 个答案:

答案 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时,具有双原语类型的快速路径。

这应该会加快速度。

如果可以的话,请在这里告诉我们它是如何发布的。这真的很有趣。