如何在c中计算逆模指数?

时间:2019-05-28 04:32:30

标签: c inverse mod

我想取整数的模逆(k≥1),然后将结果乘以另一个整数,如以下表达式所示:

result=((x^(-k)))*y mod z

在k≥1的情况下,如何实现该表达式?

2 个答案:

答案 0 :(得分:3)

您需要定义四个功能:

uint64_t modular_exponentiation(uint64_t x, uint64_t y, uint64_t z) 
{ 
    uint64_t res = 1;      
    x = x % z;  
    while (y > 0) 
    { 
        if (y & 1) 
            res = (res*x) % p; 
        y = y>>1; // y = y/2 
        x = (x*x) % z;   
    } 
    return res; 
} 

uint64_t moduloMultiplication(uint64_t a, uint64_t b,uint64_t z) 
{ 
  uint64_t res = 0;  
  a %= z; 

  while (b) 
  {  
     if (b & 1) 
        res = (res + a) % z; 

     a = (2 * a) % p; 
     b >>= 1;  // b = b / 2 
   } 
  return res; 
}


void extendedEuclid(uint64_t A, uint64_t B)
{
uint64_t temp;                           
    if(B == 0)
    {
        d = A;
        x = 1;
        y = 0;
    }
    else
    {
        extendedEuclid(B,A%B);
        temp = x;
        x = y;
        y = temp - (A/B)*y;
    }
}

int modInverse(uint64_t A, uint64_t M)
{
    extendedEuclid(A,M);
    if (x < 0)                      
        x += M;                     
    return (x);                     
}

main()中:

uint64_t result=0x00;
result=modular_exponentiation(x,k,z);   // (x^k) mod z 
result=modInverse(result,z);            // ((x^k)^-1) mod z == x^(-k) mod z    
result=moduloMultiplication(result,y,z);// x^(-k) * y mod z

答案 1 :(得分:1)

您将需要扩展的最大公因数来计算模量x的{​​{1}}的逆。当zx相对质数时,您有z。因此,a * x + b * z = 1 = gcd(x, z)a * x = 1 - b * za * x = 1 mod z在模数a中是x的倒数。

现在您可以使用z来计算result

x^-1 = a mod z

使用C中的普通整数算术,其中result = power(a, k) * y % z 是普通整数幂。

由于此类计算中的系数会很快变得非常大,因此最好使用现成的库(例如gmp)。