高次冪函數取模算法


高次冪函數取模算法

在平常的工作學習中,我們經常需要用到求取一個數字或者冪運算的余數,尤其在密碼學中最為常用的RSA算法就經常要用到這種運算,我們稱之為高次冪函數的取模運算。

在本篇文章中,將會首先介紹運用程序求解高次冪函數取模的暴力求解方法,然后針對暴力方法算法效率低下的缺點,給出一種快速的取模算法。


暴力取模算法

由於我們的高次冪函數往往擁有很高的冪,而我們在計算機中只有intfloatdoublelong long這幾種變量類型,遠遠不能滿足我們對於大數字運算的要求,從而導致數據溢出無法完成運算。
所以這里我們需要在每次迭代取模的過程中進行取模運算,從而保證數據不會溢出。代碼如下:

int get_mod(int a, int b, int c)
{
    long long result = 1;//聲明為long long類型防止溢出
    while(b--)
    {
        result = result * a % c;//這個算法的核心就是在迭代運算過程中進行取模運算
    }
    return static_cast<int> (result);
}

這種算法的正確性毋庸置疑,但是如果冪指數太大的話,需要耗費的時間就更非常多,直接導致運算效率低下,所以只適用於指數不大的情況下使用,下面我們要講解的蒙哥馬利算法就很好地解決了這個問題,而且該算法非常簡單,效率極高,完全可以手動演算。


蒙哥馬利算法

蒙哥馬利算法是一種快速的大數(通常達到幾百個二進制)的模乘算法,由彼得·蒙哥馬利在1985年提出。
下面直接放代碼:

int get_mod(int a, int b, int c)
{
    long long res = 1;//聲明為long long類型防止數據溢出
    int temp = a;
    while(b > 0)
    {
        if( b & 1)//取冪指數二進制最后一位
        {
            res = (res * temp) % c;
        }
        temp = (temp * temp) % c;
        b >>= 1;//冪指數二進制向右移動一位
    }
    return static_cast<int> (res);//以int類型返回最終結果
}

使用這個算法,即便是處理很大的數據都可以快速的求得余數,非常好用,這里想說,學好數學才是真的生產力!


github Githubhttps://github.com/haoyuanliu
個人博客 個人博客http://haoyuanliu.github.io/

個人站點,歡迎訪問,歡迎評論!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM