1.模乘的兩種優化
1.蒙哥馬利模乘算法
2.Barrett reduction算法
使用算法1需要滿足條件,模數N和進制數R互質
當不符合此條件時,使用算法2
這次來記錄下第二種算法,防止遺忘
2.先說一下流程
b進制下,求 x mod m,默認大於0
m為k位數(b進制下),x位數小於等於2*k
//b^n代表b的n次冪,mu=b^2k / m,可以預計算
int BaRdc(x){
q1 = x / b^(k-1);//右移k-1位,取整,后面同
q2 = q1 * mu;
q3 = q2 / b^(k+1);//移位
r1 = x % b^(k+1);//取低k位,因為mod m,m是k位的,所以只需看低k位即可
r2 = (q3 * m) % b^(k+1);//低k位
r = r1 - r2;//低k位相減
if ( r > m ) r -= m;
return r;
}
3.原理說明
\(mu=[\frac{b^{2k}}{m}\ ]\)
\(q_{1} =[\frac{x}{b^{k-1} }\ ]\)方括號代表取整
\(q_{2} =q_{1}\times mu\)
\(q_{3} =[\frac{q_{2}}{b^{k+1}}\ ]\)
可以得到幾個范圍
\(\frac{x}{b^{k-1}}-1< q_{1} \leq \frac{x}{b^{k-1}}\)
\(\frac{b^{2k}}{m}-1< mu \leq \frac{b^{2k}}{m}\) 這兩個應該很明顯
\(\frac{x\times b^{k+1}}{m}-\frac{b^{2k}}{m}-\frac{x}{b^{k-1}}+1< q_{2} \leq \frac{x\times b^{k+1}}{m}\) 兩個范圍相乘
\(\frac{x}{m}-\frac{b^{k-1}}{m}-\frac{x}{b^{2k}}+\frac{1}{b^{k+1}}< q_{3} \leq \frac{x}{m}\)
另外還有兩個顯然的條件
\(\frac{b^{k-1}}{m}\leq 1,\frac{x}{b^{2k}}\leq 1\)
m在b進制下為k位,x在b進制下不大於2k位
所以進行下放縮,兩項放縮一項舍去,\(\frac{x}{m}-2< q_{3} \leq \frac{x}{m}\)
設\(d=[x/m]\)
q3是整數,很容易觀察到,\(d-1\leq q_{3} \leq d\)
q3應該大概率為d
如果q3=d,\(x mod m=(x-q_{3}m)mod m\)
q3=d-1時再減去一個m即可