1. 程式人生 > 實用技巧 >蒙哥馬利約減演算法

蒙哥馬利約減演算法

0.說明

我們需要求T mod N 的結果,設蒙哥馬利約減演算法為F,可以做到F(x)=x\(\times\)R' mod N
R為進位制數,且與N互質
比如2進位制數,R=2;
10進位制數,R=10;
2^30 進位制,R=2^30;
如此這樣,某個R進位制的數乘除以及modR就是在移位和取低位操作
其中R'滿足條件: \(R \times R' \ mod N=1\)
如此我們要想得到T mod N 則需要計算 \(F(T\times R)=T \times R \times R' \ mod\ N =T \ mod\ N\)

1.目標

計算\(T \times R' \ mod\ N\)

2.過程

由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\)
不寫乘號了,接下來省略乘號,看起來好像有點奇怪
對這個方程 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 \times (RR' -NN')\)
\(T+TN'N=TRR'\)
\(m=TN'\)
\(T+mN=TRR'\)
\((T+mN)/R=TR'\)
這說明對任意的\(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)
{
    int m,t;
    m=((T%R)*N')%R;//m<R,原理在上面
    t=(T+m*N)/R;
    if(t>=N)//有疑問對吧,先接著看
    {
      t-=N;
    }
    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