【问题标题】:Issue with inverse modulo where gcd(denominator,mod)!=1gcd(denominator,mod)!=1 的反模问题
【发布时间】:2015-01-08 16:40:41
【问题描述】:

我如何计算F(n)%mod,其中mod 是质数。 和F(n)=n!/(q!^r)%mod....(x^r 代表pow(x,r))。

我正在尝试使用 fermat 的小定理来计算反模,但我面临的问题是 fermat 仅适用于 gcd(denominator,mod)=1

那么有没有其他方法可以解决这个问题。

【问题讨论】:

  • 这是什么语言的?它不能同时是 Java 和 C。
  • 扩展欧几里得算法。谷歌它!

标签: java c algorithm math data-structures


【解决方案1】:

如果模数是素数,您可以使用扩展欧几里得算法计算逆:

function inverse(x, m)
    a, b, u = 0, m, 1
    while x > 0
        q = b // x # integer division
        x, a, b, u = b % x, u, x, a - q * u
    if b == 1 return a % m
    error "must be coprime"

如果模数是合数,只要 xm 互质,这个算法仍然有效。如果它们共享一个因子,则逆不存在。

【讨论】:

    【解决方案2】:

    如果 gcd 不是 1,则没有模逆。就在 Wikipedia page 的顶部:

    模 m 的乘法逆存在当且仅当 a 和 m 互质(即,如果 gcd(a, m) = 1)。

    【讨论】:

      【解决方案3】:

      当您尝试计算此商模 p(对于某个素数)时,让我假设您知道结果是一个整数。

      正如人们所提到的,如果 q >= p,那么你不能计算分母的倒数,因为 q! 与模数不互质,所以这个数不可逆。但这并不意味着您不能计算 整个 商模p

      ab分别为分子和分母中p因子的个数。因为结果是一个整数,所以我们有 a >= b。如果不等式是严格的,则结果为 0。否则,如果等式成立,我们可以从分子和分母中删除这些因素并继续,因为现在分母与 p 互质。

      那么让我从有效计算这些 ab 数字的方法开始。密钥被称为De Polignac's formula,它表示对于给定的k,可以计算出k!p 因子的数量像这样:

      int polignac(int k, int p) {
        int res = 0, power = p;
        while (k >= power) {
          res += k/power;
          power *= p;
        }
        return res;
      }
      

      因此,我们获得了 n!q!p 因子,因此获得 是微不足道的q!^r 的 p 个因数(乘以 r)。

      在严格不等式的情况下,我们完成了。如果不是,我们必须计算分子和分母的模数,“删除”所有 p 因子。这也可以有效解决。我们可以这样写k!

      k! = 1 x 2 x 3 x ... x p x (p + 1) x (p + 2) ... x (p^2) x ...

      如果我们去掉 p 因素并应用模数,我们有以下结果:

      k! = 1 x 2 x 3 x ... x(这里什么都没有,只有一个 1)x 1 x 2 ... x(另一个 1)x ...

      因此,相同的产品不断重复直到结束。所以计算 1 x 2 x ... x (p - 1)p,将其提高到适当的幂模 p(使用快速取幂),然后将其乘以“剩余”项,因为一般 k 不能被 p 整除。

      【讨论】:

        猜你喜欢
        • 2011-09-27
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多