Python 所有数字(2个数字之间)的乘法

Python 所有数字(2个数字之间)的乘法,python,algorithm,exponent,Python,Algorithm,Exponent,我正在解决一个问题(这是我以前问过的问题的扩展,可以找到),需要我计算两个数字之间的乘法,然后计算指数: 我的第一个方法很简单: n0=n+1 n1=n0+1 while n1<=(p-1): n0=n1%p*n0%p n1+=1 print p-pow(n0,(p-2),p) constraints: 1 < P <= 2*10^9 , a prime number 1 <= N <= 2*

我正在解决一个问题(这是我以前问过的问题的扩展,可以找到),需要我计算两个数字之间的乘法,然后计算指数:

我的第一个方法很简单:

    n0=n+1
    n1=n0+1
    while n1<=(p-1):
        n0=n1%p*n0%p
        n1+=1
    print  p-pow(n0,(p-2),p) 


constraints:
1 < P <= 2*10^9 , a prime number 
1 <= N <= 2*10^9
Abs(N-P) <= 1000
n0=n+1
n1=n0+1
而n1[Edit]表示,对于大的
N
,您可以近似
N带有日志,对于计算机来说有更容易处理的数字:

N! % p =~ exp((N* ln(N) - N)) % p

对于较小的数字,请保留阶乘以获得更高的精度。

将代码更改为以下值可以提高一个简单的*2速度:

n0=n+1
for n1 in range(n0+1,p):
    n0 = (n0 * n1)%p
return p-pow(n0,(p-2),p) 
每次迭代只执行一次模运算

预计算阶乘可以使速度提高10倍。 您将乘以从n+1到p-1的所有值,这与从-1到n+1-p的乘积相同。因此,您可以预计算一个数组A[x],该数组等于-1*-2…*-x的乘积,并使用该预计算值代替循环

(请注意,您需要保持此预计算数组的完整整数精度,因为在预计算期间您不知道将使用哪个素数。)

预计算代码为:

t=1
A=[1]
for y in range(1,10**4+1):
    A.append(t)
    t*=-y
然后针对每种情况计算:

return 0 if n>=p else p-pow(A[p-n]%p,(p-2),p) 

当我看到“数字太大”和“乘法”时,我想到了对数变换。@muraveill为什么你删除了你的帖子,我刚刚看到它(我出去了一段时间),它就消失了?因为它是错误的。现在再想想对数,如果数字太大,也许可以使用斯特林公式来近似阶乘,因为在这种情况下,近似值是很好的。你确定这在你的代码中花费的时间太长了吗?你提到的1000次乘法(模p)几乎不需要时间。是的,这就是我要找的。非常感谢你@Peter de Rivaz的帮助。你完全正确,你从哪里发现“从n+1到p-1的所有值,这和-1乘以n+1-p是一样的。我的意思是这是对的,但是你从哪里知道这个性质的?我想的是如果我从每个数字中减去p会发生什么。n+1变为n+1-p,p-1变为-1。当你在做模p的计算时,这显然不会改变结果,现在模式变得很容易发现。哇!很好,你想了那么多,有了你的这种想法,我的代码在最短的时间内完成了与在线法官。再次感谢
return 0 if n>=p else p-pow(A[p-n]%p,(p-2),p)