有效地计算pow(a,nCr)%m

时间:2017-10-21 06:51:10

标签: combinatorics

我认为有一些计算pow(a,nCr)%b的过程? 但我想知道如何在编程中有效地解决这个问题?

1 个答案:

答案 0 :(得分:0)

我可以想到一种仅~O(n^2*log(m))并且不需要使用大整数的方法。我有一个更快(如O(k*log(m)*log(n)))方法的概念,如果你可以考虑因素m,你可以考虑某些m/gcd(a^k,m) totientk),但它变得非常毛茸茸。

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)