【问题标题】:Finding modulo inverse if gcd is not 1如果 gcd 不为 1,则求模逆
【发布时间】:2015-06-22 05:01:51
【问题描述】:

我必须找到 (p^e-1)/(p-1) mod 1000000007,其中 p 是质数。 如果 gcd(p-1,1000000007) 不为 1,则 (p-1) 的模逆未定义。此外,(p^e-1) 可以被 (p-1) 整除(几何级数的总和)。我也找不到 (p^e-1),因为 p,e

【问题讨论】:

  • 这可能更适合 Math.SE
  • 您应该在Math 上提问,因为您的问题与编程无关
  • 其实我在解决一个有竞争力的编程问题,我想出了这个公式。这就是我在这里问的原因

标签: math modulo


【解决方案1】:

当你除以整数,然后取模时,你必须以特殊的方式处理模的素数。考虑例如 6/3 mod 3。如果我们只是尝试写 6/3 mod 3 = (6 mod 3)/(3 mod 3),我们将有未定义的 0/0,而正确答案当然是 6/3模 3 = 2 模 3 = 2。

所以我们需要做的是从分子和分母中提取 3 的幂,然后分别除以(通过减去指数)。所以我们有 6 = 3^1 x 2, 3 = 3^1 x 1,所以 6/3 = 3^1/3^1 x 2/1 = 3^{1-1} x 2 = 3^0 x 2 = 2 mod 3。让我们尝试一个更复杂的例子:18/6 mod 3 = (3^2 x 2)/(3^1 x 2) = 3^{2-1} x 2/2 = 3 x 1 = 3 模 3 = 0。

这是另一个例子:36/18 = (3^2 x 4)/(3^2 x 2) = 3^{2-2} x 4 x 2^{-1} mod 3 = 4 x 2 mod 3 (因为 2^{-1} = 2 mod 3) = 8 mod 3 = 2。一般来说,我们减去 3 部分的幂的指数,并将除数的 3 部分的非幂取反 mod 3。

在您的示例中,我们必须找到进入 p^e-1 的 1000000007 的最大幂 m,并重写 p^e-1 = 1000000007^m x s,其中 s 与 1000000007 互质。我们也这样做对于 p-1 = 1000000007^n x t,其中 t 与 1000000007 互质。那么商 (p^e-1)/(p-1) = 1000000007^{m-n} x s x t^{-1}。如果 m>n,答案是 0 mod 1000000007;否则答案是 s x t^{-1} mod 1000000007。存在 t mod 1000000007 的倒数,因为 t 与 1000000007 互质;逆可以通过欧几里得算法的修改版本来计算。

【讨论】:

    【解决方案2】:

    因为 1000000007 是素数,所以有两种情况。

    案例 1:1000000007 是 p-1 的因数。那么 p mod 1000000007 = 1,所以 1+p+p^2+...+p^(e-1) = 1+1+1...+1 = e mod 1000000007。

    案例 2:1000000007 与 p-1 互质,您可以将 1/(p-1) 计算为 (p-1)^1000000005 mod 1000000007,或者使用欧几里得算法,您可以计算出 mod 1000000007 的相对幂通过平方快速使用求幂。

    【讨论】:

      【解决方案3】:

      你有两个案例

      1. p-1 与大素数 1000000007 互质。对于p <= 1000000007 总是如此,对于较大的p 通常也是如此。看来您知道在这种情况下该怎么做 - 使用算法找到 p-1 的模逆,即 a 使得 a * (p - 1) == 1 mod 1000000007

      2. p-11000000007 的倍数 - 即 p-1 == k*1000000007。在这种情况下,p == k*1000000007 + 1

        让我们把注意力转向表达式的第一行

        p^e - 1 == (k * 1000000007 + 1) ^ e - 1
        

        这可以通过二项展开式展开为

        ((k*1000000007)^e + e*(k*1000000007)^(e-1) + ... + 1) - 1
        

        但请记住,(k*1000000007) == p-1。所以,展开是

        ((p-1)^e + e*(p-1)^(e-1) + ... + e*(p-1))
        

        我们可以除以 p-1 并留下

        ((p-1)^(e-2) + e*(p-1)^(e-2) + .... + e)
        

        我们知道在这种情况下所有包含p-1 的词都是0 mod 1000000007,所以我们只剩下最后一个词e。因此,在这种情况下,表达式 (p^e - 1) / (p - 1) mod 1000000007 的结果是 e - 你找不到 p-1 的模逆,因为你不能,但你也不需要。

      【讨论】:

        【解决方案4】:

        1000000007 is a prime number,所以如果p-1 < 1000000007,gcd 将始终为 1。如果p-1 是 1000000007 的某个倍数,则根据定义,它是 0 模 1000000007,因此没有逆定义。

        【讨论】:

        • 这并不总是正确的。 gcd(11 - 1, 5) = 5。11 和 5 都是素数。
        • 好吧,我在模 1000000007 为零的情况下添加了一点
        • 这是一个定义:x modolo y 的倒数表示您可以将 x 乘以得到 1 +(乘以 y)的数。但是如果 x = (sometimes y) 比 x 的任何倍数也有相同的形式,所以你永远无法得到你需要的东西。
        • 这意味着 1/(p-1) mod 1000000007 没有定义??
        • 是的,但情况可能并非如此,想想 p-1 成为如此巨大素数的倍数的可能性有多大
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2021-02-23
        • 2020-09-08
        • 2015-01-08
        • 1970-01-01
        • 2021-06-05
        • 2019-03-10
        相关资源
        最近更新 更多