查找大量的模逆

时间:2019-02-03 13:06:36

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

给出一个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。

对于

1 个答案:

答案 0 :(得分:-1)

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