cinversemodulo

How to calculate inverse modular exponentation in c?


I want to take modular inverse(k≥1) of integer and then multiply the result to another integer, as explain in following expression:

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

How can i implement this expression, where k≥1?


Solution

  • You need to define four function:

    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);                     
    }
    

    In 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