Barrett约减

基本概念及证明

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)的一个好的估计值,即二者非常接近,也就是能使得最后一步做的减法次数非常少。

[lfloor lfloor z/b^{k-1} floorcdot mu /b^{k+1} floor = lfloor lfloor frac{z}{b^{k-1}} floor cdot lfloor frac{b^{2k}}{p} floor cdot frac{1}{b^{k+1}} floor leq lfloor frac{z}{b^{k-1}} cdot frac{b^{2k}}{p} cdot frac{1}{b^{k+1}} floor = lfloorfrac{z}{p} floor ]

[hat{q} leq q ]

再设

[alpha = frac{z}{b^{k-1}} - lfloor frac{z}{b^{k-1}} floor \ eta = frac{b^{2k}}{p} - lfloor frac{b^{2k}}{p} floor ]

那么就有(0 leq alpha < 1, 0 leq eta < 1),此外有

[q = lfloor frac{z}{b^{k-1}} cdot frac{b^{2k}}{q} cdot frac{1}{b^{k+1}} floor =lfloor frac{(lfloorfrac{z}{b^{k-1}} floor + alpha)(lfloorfrac{b^{2k}}{p} floor + eta)}{b^{k+1}} floor leq lfloorhat{q} + frac{lfloorfrac{z}{b^{k-1}} floor+lfloorfrac{b^{2k}}{p} floor+1}{b^{k+1}} floor ]

由于(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}),综合上面两点,该不等式可转化为

[q leq lfloor hat{q} + frac{b^{k+1}-1+b^{k+1}+1}{b^{k+1}} floor = lfloor hat{q} + 2 floor ]

综上,可以证明经由算法第一步计算得到的(hat{q})满足以下条件

[q-2 leq hat{q} leq q ]

(hat{q})的确是(q)的一个很好的估计值。

进而,我们可以得到

[0 < z - hat{q}p leq z - (q-2)p ]

(r = z-qp < p),所以

[z-hat{q}p < 3p ]

上文中我们提到,(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)可以通过预计算的方式为多次同一模数的模约减服务)。

原文地址:https://www.cnblogs.com/chuaner/p/14751650.html