我认为有一些计算pow(a,nCr)%b的过程? 但我想知道如何在编程中有效地解决这个问题?
答案 0 :(得分:0)
我可以想到一种仅~O(n^2*log(m))
并且不需要使用大整数的方法。我有一个更快(如O(k*log(m)*log(n))
)方法的概念,如果你可以考虑因素m
,你可以考虑某些m/gcd(a^k,m)
totient(k
),但它变得非常毛茸茸。
在O(n^2*log(m))
方法的任何情况下,我们都会利用nCr ==(n-1)C(r-1)+(n-1)Cr
这里是nCr的计算,它利用了:
def nCr(n0,r0):
memoized = {}
def go(n,r):
if r == 0 or r == n:
return 1
if (n,r) not in memoized:
memoized[(n,r)] = go(n-1,r-1) + go(n-1,r)
return memoized[(n,r)]
return go(n0,r0)
powChooseMod
函数的代码几乎相同:
def powChooseMod(a,n0,r0,m):
memoized = {}
def go(n,r):
if r == 0 or r == n:
return a
if (n,r) not in memoized:
memoized[(n,r)] = go(n-1,r-1) * go(n-1,r) % m
return memoized[(n,r)]
return go(n0,r0)