基本概念及证明
Barrett约减是一种高效计算(r = z mod q)的约减方法,它基于一种低成本的求商运算,估算出一个近似于(q = lfloor z/p floor)的值(hat{q}),这样使得(z-hat{q}p=r+np),其中(n)是一个很小的数,因此最终的结果(r)可以通过很少次数的减法计算得出。该低成本的求商运算依赖于一个适当选择的基(b)(如(b = 2^L), (L)根据模数(p)来选择)的幂,并且计算过程中涉及到计算一个与模数相关的量(lfloor b^{2k}/p floor),因此适合对同一个模进行多次约减的运算。
下面是Barrett约减的算法描述
参照算法描述,我们来验证其正确性,
首先我们要确定(hat{q})是(q)的一个好的估计值,即二者非常接近,也就是能使得最后一步做的减法次数非常少。
即
再设
那么就有(0 leq alpha < 1, 0 leq eta < 1),此外有
由于(z<b^{2k}),所以(lfloor frac{z}{b^{k-1}} floor leq b^{k+1}-1);又因为(k = lfloor log_b{p} floor + 1),所以(p geq b^{k-1}),也就是说(lfloor frac{b^{2k}}{q} floor leq b^{k+1}),综合上面两点,该不等式可转化为
综上,可以证明经由算法第一步计算得到的(hat{q})满足以下条件
即(hat{q})的确是(q)的一个很好的估计值。
进而,我们可以得到
又(r = z-qp < p),所以
上文中我们提到,(p < b^k),并且(b geq 3),也就是说(3p < 3b^k leq b^{k+1}),也就是说步骤2中计算的结果就等价于(r = z-hat{q}pmod {b^{k+1}}),进而能够得到(r < 3p(r = rmod p, p+rmod p, 2p+ r mod p))这样一个结论,在这一结论下步骤4的减法操作最多需要两次。督导这里可能会想,步骤2不是多此一举吗,直接计算不行吗?如果我理解的没错,这样做也是为了简化计算,假设我们选择的(b)值为(2^L)次方,那么对(b^k)取模的操作只需要去掉该计算数的高(L*k)位即可,同理,步骤一中的(/b^{k+1})的操作也可以直接通过右移(k+1)位来实现,那这样整个约减操作中就不需要进行除法操作,大大提高了计算效率(唯一需要的除法操作为(mu = lfloor b^{2k}/p floor)可以通过预计算的方式为多次同一模数的模约减服务)。