快速查找每 (2k) 个阶乘

Mar*_*ark 1 java algorithm math optimization

我得到一个数字 k,我必须从 [0;k] 中找到每个 (2k) 阶乘;例如 0, 2!, 4!, 6! 等。我尝试了一个解决方案,将值保存在地图中,并为每个第 k 个值使用第 (k-1) 个结果,如下所示:

private Map<Long, BigInteger> cache;

private FactorialCache(int k) {//
    cache = new HashMap<>();
    calculate(k);
    System.out.println("last item " + k);
}

private void calculate(int k) {
    BigInteger result = BigInteger.ONE;
    cache.put(0l, result);
    cache.put(1l, result);

    for (long i = 2; i <= k; i += 1) {
        BigInteger currentRes = cache.get(i - 1).multiply(BigInteger.valueOf(i));
        cache.put(i, currentRes);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我很好奇是否有更快的方法来查找和保存这些特定阶乘?

use*_*697 5

这不是一个答案,而是一个扩展的评论。

如果您的目标是计算阶乘,那么您就不可能变得更快。但是,我认为这个问题是在您上一个问题的上下文中提出的,关于某个系列的总和,

?(2k+1)/(2k)! , k =0,... ,?
Run Code Online (Sandbox Code Playgroud)

如果我是对的,答案是根本不计算阶乘。改用霍纳时间表。你的总和可以表示为

1 + 1/(1*2)(3 + 1/(3*4)(5 + 1/(5*6)(7 + 1/(7*8)(9 + ...)))...)))
Run Code Online (Sandbox Code Playgroud)

看看阶乘是如何消失的。现在修正一些你想添加的术语,然后彻底处理这个表达式。

查找多个术语以达到所需的精度是一个完全不同的主题。正如我在评论中提到的,泰勒定理非常有用。