區塊鏈中的數學(一)

區塊鏈中的數學(一)

介紹

前面說過密碼學是區塊鏈的基石,沒有密碼學技術,區塊鏈就是空中樓閣,也難以存在。那麼密碼學的基石是什麼?答案是數學。
從這一篇起始,將會由淺入深的介紹一些密碼學中經常使用的數學知識。本節主要講歐幾里得算法及其擴展算法。其應用會在以後文章中體現(固然,若是已經有研究過的朋友應該已經知曉)。web

歐幾里得算法

歐幾里得算法是指:對於任意的非負整數𝑎和正整數𝑏,求這兩個數的最大公因數,記爲gcd(a,b)的算法, 其中gcd表明greatest common division首字母。
最大公因數的問題很基礎,也很好理解。有多種方法實現,歐幾里得算法利用如下性質:
gcd(a,b)=gcd(b, a mod b)
mod是模運算,即求餘數運算。算法自己比較簡單,很容易實現,這裏主要說下爲何能夠這麼算?
證實以下:
假設a>b, a能夠表示成a = kb + r(a,b,k,r皆爲正整數,且r<b),則r = a mod b 假設d是a,b的一個公約數,記做d|a,d|b,即a和b均可以整除d。
而r = a - kb,兩邊同時除以d,r/d=a/d-kb/d=m,由等式右邊可知m爲整數,  所以d|r 所以d也是b,a mod b的公約數
假設d是b,a mod b的公約數, 則d|b,d|(a-k*b),k是一個整數。進而d|a.所以d也是a,b的公約數 所以(a,b)和(b,a mod b)的公約數是同樣的,其最大公約數也必然相等,得證。具體實現可參考以下:算法

 //歐幾里德算法迭代實現 public long gcd(long a, long b) { if (b == 0) { return a; } return gcd(b, a % b); }

擴展歐幾里得算法

擴展歐幾里德算法能夠用來幹什麼呢? 咱們來看下面一個線性方程,該線性方程的整數求解過程與最大公約數有密切關係。微信

對於線性方程(𝑎,𝑏,𝑐爲常數):編輯器

𝑎𝑥+𝑏𝑦=𝑐 是普通且熟悉的方程。咱們討論特殊狀況:𝑐=𝑔𝑐𝑑(𝑎,𝑏),也便是這樣的線性方程:區塊鏈

𝑎𝑥+𝑏𝑦=𝑔𝑐𝑑(𝑎,𝑏)flex

更特殊的狀況,若是a,b互質,則gcd(a,b)=1, 方程簡化爲 ax+by=1 。
這樣的線性方程必然有整數解,歐幾里得擴展算法利用上面提到的歐幾里德算法求解最大公約數過程當中的中間商和餘數,進行擴展運算,在求𝑔𝑐𝑑(𝑎,𝑏)的過程當中,同時也就求得線性方程的整數解(𝑥,𝑦)。示例代碼以下:spa

//擴展歐幾里得算法:ax+by=g=gcd(a,b) => // tuple[1]x+tuple[2]y=gcd(a,b) public long[] gcdExt(long a, long b) { long ans; long[] tuple = new long[3]; if (b == 0) { tuple[0] = a; tuple[1] = 1; tuple[2] = 0; return tuple; } long[] temp = gcdExt(b, a % b); ans = temp[0]; tuple[0] = ans; tuple[1] = temp[2]; tuple[2] = temp[1] - (a / b) * temp[2]; return tuple; }

tuple中三個數分別表明方程𝑎𝑥+𝑏𝑦=𝑔𝑐𝑑(𝑎,𝑏) 中的解x,y,gcd(a,b).net

好了就到這裏, 若是喜歡,敬請關注區塊鏈公衆號!!疑問請留言code


本文分享自微信公衆號 - Rebase社區(rebase_network)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。ip

相關文章
相關標籤/搜索