我想有效地计算((X+Y)!/(X!是的!)%p(p等于10^9+7)
这个discussion提供了一些关于在除法上分配模的见解。
我关心的是,没有必要对一个数存在模逆。
基本上,我在寻找解决问题的代码实现。
乘法很简单:

public static int mod_mul(int Z,int X,int Y,int P)
{
// Z=(X+Y) the factorial we need to calculate, P is the prime
long result = 1;
while(Z>1)
  {
    result = (result*Z)%P
    Z--;
  }
return result;
}

我也意识到许多因子在除法中可以被取消(在取模之前),但是如果除数增加,我发现很难有效地提出除法算法(在列表上循环(因子(X)+因子(Y)…)以查看是哪个除以分子的当前乘因子)。
编辑:我不想使用BigInt解决方案。
是否有任何基于java/python的解决方案或标准算法/库来消除因子(如果逆选项不是完全证明)或处理此类问题。

最佳答案

((X+Y)!/(X!Y!))是二项系数((X+Y)-choose-X的一种低级拼写方法虽然您在问题中没有这么说,但代码中的注释意味着P是prime。把这两个放在一起,卢卡斯定理直接适用:http://en.wikipedia.org/wiki/Lucas%27_theorem
这给出了一个基于PX+Y的基表示的非常简单的算法。不需要猜测X,因为你没有对你的参数给出任何限制,除非它们是BigInts。注意,你的样本int代码可能根本不起作用,例如,mod_mul大于最大P的平方根(因为int可能溢出)。

10-05 23:24