【问题标题】:How to calculate inverse modular exponentation in c?如何计算c中的反模幂?
【发布时间】:2019-05-28 04:32:29
【问题描述】:

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

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

如何实现这个表达式,其中 k≥1?

【问题讨论】:

    标签: c inverse mod


    【解决方案1】:

    你需要定义四个函数:

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

    ma​​in()中:

    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
    

    【讨论】:

    • 您的modInverse 函数可能非常慢,尤其是当a 的倒数接近z 时。
    • 当然可以。但它的运行时间取决于逆的大小。如果 OP 想用它构建一个简单的 RSA 加密,加密或解密通常需要几个小时或更长时间。
    • 所以需要用到,可能是Extended Euclidian
    • 现在 Edit1,完美运行以及优化的解决方案。
    【解决方案2】:

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

    现在你可以用x^-1 = a mod z计算result

    result = power(a, k) * y % z
    

    在 C 中使用普通整数运算,其中power() 是普通整数幂运算。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2020-05-24
      • 2013-09-14
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多