记x÷m的商的为q。先来对商q做个小小的变形。
…………(2.1)
这样一来,就相当于把x和m“分离”了,“分离”出来的B2k/m与x无关。既然B2k/m的值与x无关,那么这部分值就可以预先计算出来。
再来看另外一部分x/B2k。x的低t(t为某个不确定的值,需要在后面估算)个字对q的影响应该非常有限。这就好比在计算两个十进制大数(足够大的数)相乘时,把被乘数的足够低的位(比如百位以下)都当成零再来计算乘积,这样得到的结果和准确的乘积相差不会很多,同时计算起来也更方便。基于这个想法,所以可以考虑扔掉低t个字。
。 …………(2.2)
只要t值取的好,那么既能使q的真实值和估计值的误差很小,又能大大的简化运算。t到底取多少才合适呢?这在后面给出。
现在考虑(2.2)式的右边。如果对前两个除式取整,忽略掉小数部分,那么就可以得到Barrett对q的估计值:
。 …………(2.3)
再现来考虑一个问题:忽略掉的那些小数部分对估计值的影响有多大呢,即估计值和真实值的差值会不会很大,t的值到底应该取多少才最好呢?
如果,则两者之差最多为2:
。 …………(2.4)
更进一步,在90%的情况下,估计值和真实值q是相等的,而两者之差为2的可能性也只有大约1%。
t的最优取值为t=k+1,这里所谓的最优是指既能使得所做的运算最简单又能使最大误差最小[7,8]。
余数的估计值为(如果B>2)
。 …………(2.5)
由于商的估计值和真实值最多相差2,所以余数的估计值最多比2m大些,此时只需做两次减法减去m。
这里说明一下。以上结论是对B>2而言,如果取B=2的话(给出的C程序就是如此),以上估算思想同样适合,只是和q的差就会比2更大,这就使得从
求出r可能需要做更多次减法。