【问题标题】:finding modular inverse of a large number找到大量的模逆
【发布时间】:2019-06-27 10:17:06
【问题描述】:

给定一个 GP 和 (1-((n-1)/n)^r) = P/Q ,当 r 很大并且输出 (P*Q^(-1) 时如何计算这个 P/Q 分数)%1000000007 其中 Q^(-1) 是 Q 模 1000000007 的模逆

我可以使用模幂计算 (n-1)^r 和 n^r,然后使用费马小定理使用模逆公式打印 P*Q^(-1),但这是不正确的,因为我认为 ( n^r) 模逆与 Q^(-1) 不同,如果我在不使用模幂运算的情况下计算 Q,它在 C++ 中甚至会溢出很长。 所以请指导我做错了什么?

ll modInverse(ll a, ll m) 
{  
       ll ans = power(a, m-2, m);  //for finding modular inverse
       return ans;  
} 

ll power(ll x, ll y, ll p) 
{ 
    ll res = 1;      
    x = x % p;  
    while (y > 0)             // ll is long long
    {                         //p=1000000007;
        if (y & 1)            //for calculating n^r and (n-1)^r
            res = (res*x) % p; 
        y = y>>1;
        x = (x*x) % p;   
    } 
    return res; 
} 

计算 P*Q^(-1) % 1000000007 会因为溢出而对大值给出意外的答案,并且如果使用 mod 1000000007 限制溢出会给出错误的值。 我使用费马小定理计算模逆和快速幂方法来评估 n^r。

【问题讨论】:

  • extended Euclidean algorithm 可用于求模逆。也许这种方法对中间结果的溢出更免疫(尽管我认为只要你的数字远低于 long long 可以保持的平方根,溢出不应该是使用费马小定理的问题,如果它已正确实施)。
  • 实际上我试图找到 (10000^10000)^(-1)%1000000007 所以这就是为什么我得到错误的结果或数字溢出@JohnColeman
  • 为什么不找到 (10000^10000)%1000000007 然后找到它的倒数呢?使用良好的模幂算法,溢出不是问题。
  • @JohnColeman 它会产生与第一个逆然后取模相同的结果吗?我目前也在做同样的事情,但我没有得到正确的结果,这是概率最大化游戏的任务
  • 在任何组中(非零数 mod 1000000007 在模乘下形成一个组)(a^k)^-1 = (a^-1)^k 对于所有整数 k

标签: c++ math sum largenumber modular-arithmetic


【解决方案1】:

我们必须找到一个值 x 使得 (Qx)%MOD = 1。这意味着 (Q%MODx%MOD)%MOD = 1。这意味着对于分母,你可以使用模幂求 Q%MOD 即 (n^r)%MOD。然后将 Q%MOD 替换为 Q'。这意味着 (Q'*x)MOD=1。所以找到 Q' 的模逆。 (MOD=1000000007)

【讨论】:

  • 我知道这一点,但我想知道当 Q 太大(如 100^10000)时该怎么做
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多