Barrett reduction算法

参考文章

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即可

posted @ 2020-12-23 15:03  ecnu_lxz  阅读(3103)  评论(0编辑  收藏  举报