蒙哥馬利約減演算法

2022-07-08 09:42:10 字數 1701 閱讀 2150

我們需要求t mod n 的結果,設蒙哥馬利約減演算法為f,可以做到f(x)=x\(\times\)r' mod n

r為進製數或進製數的冪次,在計算機當中,設n的2進製位數為s,r可以取2^s,且與n互質

比如2進製數,r=2;

10進製數,r=10;

2^30 進製,r=2^30;

如此這樣,某個r進製的數乘除以及modr就是在移位和取低位操作

其中r'滿足條件: \(r \times r' \ mod n=1\)

等價於方程\(x \times r -y \times n=1\)

由r和n求r'和n'可以利用擴充套件歐幾里得求這個方程\(x \times r -y \times n=1\)

求得x y的整數解 x=r' y=n'

可以得到\(r \times r' -n \times n'=1\)

即\(rr' -nn'=1\)

如此我們要想得到t mod n 則需要計算 \(f(t\times r)=t \times r \times r' \ mod\ n =t \ mod\ n\)

計算\(t \times r' \ mod\ n\)

\(rr' -nn'=1\)

不寫乘號了,接下來省略乘號,看起來好像有點奇怪

對這個方程 mod n可以得到\(rr' \ mod\ n=1\)

即r'和r在mod n運算下互為逆元且r'\(\in\)(0,n)

對這個方程 mod r可以得到\(-nn' \ mod\ r=1\)

即n'和(-n)在mod r運算下互為逆元且n'\(\in\)(0,r),後面會用到這個條件

接下來有

設\(t\in [0,r*n)\)??這個我暫時不知道還有什麼深意,僅僅是後面那個範圍判斷?

注意這個t應該是下面那個函式引數裡的t,並不是單純的上面一開始的那個t,傳入引數f(tr),tr整體就是函式中的t了

\(t=t \times (rr' -nn')\)

\(t+tn'n=trr'\)

令\(m=tn'\)

有\(t+mn=trr'\)

有\((t+mn)/r=tr'\)

關於上面這個式子有乙個非常有意思的角度看待它

在與t同餘的數中,選取乙個低位有bitlen個0,且高位小於n的數,去掉該數低位的bitlen個0,所得的數即為(t+mn)/r,bitlen為模數n的位數

有興趣的去看一下這篇文章

這說明對任意的\(t\in [0,r*n)\),存在整數m使得上式沒有餘數,即完全整除,是個整數

\(tr' \ mod\ n=(trr')/r \ mod\ n=t(n'n + 1)/ r\ mod\ n=(tn'n+krn+t)/r \ mod\ n=((tn'+kr)n+t)/r \ mod\ n,k為任意整數\)

如此的話,我們把tn'中的所有r全部消去,即對tn'做mod r不影響結果,因為k可以設為負值達到這個效果

所以在計算\(m=tn'時可以用m=tn'\ mod\ r\)代替

//rr' -nn'=1

f(t)=tr' mod n

int f(int t)

return t;

}

實際上,t=(t+mn)/r<2n

由\(m,n' \in (0,r)\),\(t\in [0,r*n)\)

t=(t+mn)/r<(rn+rn)/r=n+n=2n,即t<2n,所以有上面那個if

蒙哥馬利冪模a b n

description a b的含義是 a的b次方 1 a,b 1000000000。請你程式設計計算a b的最後3位數。input 輸入有多個案例。每個案例佔一行,每行兩個數a b。當a 0,b 0時表示結束。ouput 每行對應輸出乙個結果。sample input 2 312 6 6789 1...

日期加減演算法

already be tested in linux with gcc 4.1.2.already be tested in windows with vc2005.please contact me with any bugs in these two functions.email ka bar...

Linux 時間加減演算法

本文參考 date加減 不影響原來時間 時間的值不是數字,不能直接對其進行加減數 算。root localhost service date y m d 20190820 加1天 root localhost service date y m d date 1 days 20190821 減一天 r...