Barrett reduction
约减概述
约减的定义(reduction):
z
(
m
o
d
p
)
z \pmod p
z(modp)
优化约减的目的:取模操作的底层实现往往使用到的是除法,而除法操作往往是较为耗时的,因此需要把除法操作替换为不那么费时的其他操作。
Barrett 约减概述
单模数多约减:多个约减操作,其模数
p
p
p是固定的,而
z
z
z不同。
针对单模数多约减的情况,可以使用Barrett约减来进行优化操作。
Barrett约减算法的整体流程可以概括如下:
step 1.根据p,选定b和k,其中b代表的是基,满足
b
≥
3
b \ge 3
b≥3,
k
=
⌊
l
o
g
b
p
⌋
+
1
k = \lfloor log_b^p \rfloor+1
k=⌊logbp⌋+1,
0
≤
z
0 \le z
0≤z
<
b
2
k
\lt b^{2k}
<b2k。
step 2.预计算
μ
=
⌊
b
2
k
/
p
⌋
\mu = \lfloor b^{2k} /p \rfloor
μ=⌊b2k/p⌋。
step 3.构造
q
^
\hat{q}
q^,使得
q
−
2
≤
q
^
≤
q
q-2 \le \hat{q} \le q
q−2≤q^≤q (不等式1)
step 4.优化计算
r
=
z
−
q
^
∗
p
r=z-\hat{q}*p
r=z−q^∗p
step 5.在两步减法操作内,计算得到最终的r
算法2.14中,使用荧光笔标记了一些运算过程,其中绿色代表移位操作,粉色代表乘法操作,黄色代表加减操作,蓝色代表预处理操作。因此,整个过程,将除法转化为移位、乘法、加减等操作,从而实现了约减去的目的。
此外,对于
r
=
z
−
q
^
∗
p
r=z-\hat{q}*p
r=z−q^∗p的计算,也存在优化的操作。记
z
=
z
1
∗
2
k
+
1
+
z
0
z=z_1*2^{k+1}+z_0
z=z1∗2k+1+z0,
q
^
∗
p
=
u
1
∗
2
k
+
1
+
u
0
\hat{q}*p=u_1*2^{k+1}+u_0
q^∗p=u1∗2k+1+u0。根据推导可以得出
0
≤
z
−
q
^
∗
p
<
b
k
+
1
0 \le z-\hat{q}*p \lt b^{k+1}
0≤z−q^∗p<bk+1(不等式2),因此先计算
z
0
−
u
0
z_0-u_0
z0−u0(对应算法2.14的第3行),但当存在从
z
1
z_1
z1借位的时候,
z
0
−
u
0
<
0
z_0-u_0 \lt 0
z0−u0<0,因此此时需要再加上
b
k
+
1
b^{k+1}
bk+1(对应算法2.14的第4行)。
正确性证明
下面主要对于不等式1和不等式2进行数学推导与证明。