【问题标题】:Is modulo 10^9+7 useful in real world problems?模 10^9+7 对现实世界的问题有用吗?
【发布时间】:2021-10-17 12:19:00
【问题描述】:

以 5^100000 为例

在竞争性编程中给出了一个约束,因为我们应该在 10^9+7 下计算我理解他们为什么使用它(以防止溢出) 但我的问题是如果乘法产生的数字超过 10^9+7,那么它会回绕,所以答案不是我们正在寻找的确切值。 取模后得到的这个值在现实世界的问题中仍然有用吗?还是以某种方式转换了?

示例代码

#define N 1000000007 // prime modulo value

    long int exponentiation(long int base,
                        long int exp)
{
    if (exp == 0)
        return 1;
  
    if (exp == 1)
        return base % N;
  
    long int t = exponentiation(base, exp / 2);
    t = (t * t) % N;
  
    // if exponent is even value
    if (exp % 2 == 0)
        return t;
  
    // if exponent is odd value
    else
        return ((base % N) * t) % N;
}

    int main()
{
    long int base = 5;
    long int exp = 100000;
  
    long int modulo = exponentiation(base, exp);
    cout << modulo << endl;
    return 0;
}

输出


754573817

【问题讨论】:

  • 哦,令人震惊的认识。 :P 您所做的最具竞争力的编程练习可能没有实际用途。
  • 投票关闭“基于意见”。这个问题你不一定能得到正确答案。只抨击竞争性编程和在渲染和密码学等其他领域使用模数的轶事。
  • 如果模幂运算没有给出“你正在寻找的值”,那么它是不合适的。否则就是这样。
  • 模运算在现实世界中有许多合法用途。应用于任何特定问题的答案的模运算是否有意义取决于问题。大多数竞争性编程问题本身在现实世界中毫无意义,即使在模之前也是如此。
  • PKI 模数 - 研究公钥密码学

标签: c++ exponent


【解决方案1】:

在非对称加密系统或更广泛的Multiplicative groups of integers modulo n 中,您经常使用部分随机模数的结果。

在您的具体示例中,我们很幸运 1000000007(p) 是质数,因此 xy 可以是任何数字,并且以下情况成立1

(x * y) mod p == (x mod p) * (y mod p)

让我们构建一个问题,例如: “细菌与输入应用程序的每日速率 (1

有了这些知识,我们现在可以不用计算一些非常大的数字然后取模,我们可以:

foreach(x in input)
    output = output * (input mod 1000000007)
    output = output mod 1000000007

将所需的变量大小限制为(四舍五入到通常大小)64 位,而不是一些无限制的宽度。

1 取质数实际上是需求for any x used in the computation: gcd(x, p) == 1 must hold

的一种特殊形式

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-05-31
    • 2010-10-02
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多