Yuval Domb 2022年论文《Fast Modular Multiplication》
模乘可以说是任何密码系统中计算量最大的算术原语。本文提出了一种高效、硬件友好的算法,据作者所知,该算法优于迄今为止的算法。
标准的modulo-prime multiplication problem in
F
s
\mathbb{F}_s
Fs表示为:
r
=
a
⋅
b
m
o
d
s
其中
a
,
b
,
s
∈
F
s
a,b,s\in\mathbb{F}_s
a,b,s∈Fs,
s
s
s为素数,并利用标准
Z
\mathbb{Z}
Z-algebra。
等价为:
a
⋅
b
=
l
⋅
s
+
r
其中,
l
∈
Z
l\in \mathbb{Z}
l∈Z,使得
0
≤
r
<
s
0\leq r < s
0≤r<s。
本文主要为(1)中计算提供了一种高效、硬件友好的快速计算方法。
将所有变量以
d
d
d-进制来表示,其中
F
s
\mathbb{F}_s
Fs内的每个元素都以
n
n
n个digits来表示,有:
n
=
⌈
log
d
s
⌉
接下来,简单地令 d = 2 d=2 d=2,所有元素以二进制来表示。
尽管本文重点关注modulo-prime multiplication,但可将其推广到任意
a
m
o
d
s
a\mod s
amods运算,其中
a
<
s
2
aa<s2,
s
s
s可为素数或非素数的任意值。
本文主要展现了,如何将:
结合,用于求取quotient l l l的近似值,近视精度为一个小的constant error,该constant error与 n n n无关(无论 n n n值大小)。
令人惊讶的是,最终的reduction算法与Montgomery的Modular-Multiplication算法(见Montgomery 1985年论文《 Modular multiplication without trial division》)类似,但是本文最终的reduction算法不需要coordinate translation。
本文的bounding技术可用于进一步降低特定感兴趣场景的计算复杂度(知识需要增加constant error),本文不展开。
假设
l
l
l 为近似已知,将其近似值表示为
l
^
\hat{l}
l^,使得:
l
−
λ
≤
l
^
≤
l
其中
λ
=
O
(
1
)
\lambda=O(1)
λ=O(1)为一个已知的constant。
若
λ
=
0
\lambda=0
λ=0,则显然有:
a
b
[
2
n
−
1
:
0
]
−
l
^
s
[
2
n
−
1
:
0
]
=
r
[
n
−
1
:
0
]
其中[]中括号内的值表示了bit locations和sizes。
注意,当 λ = 0 \lambda=0 λ=0时,可推测余数 r r r最大长度为 n n n bits,使得等式(5)中右侧值的剩余最高有效位(ms (most-significant) bits)必须为 0 0 0。
通过简单的bit操作,可以long addition表示为:

其中,上横杠表示的是bit-inversion运算符,横岗上的
1
1
1表示为初始carry bit。
不过,对上面的long addition表示仔细观察可知,仅需要
a
b
[
n
−
1
:
0
]
ab[n-1:0]
ab[n−1:0] 和
l
^
s
[
n
−
1
:
0
]
\hat{l}s[n-1:0]
l^s[n−1:0] 来完成该计算,从而可节约近一半的计算量。最终的adder为a fixed width adder——即,
n
+
n
→
n
n+n\rightarrow n
n+n→n。这意味着可忽略 ms bits(最高有效位)的任何溢出。可将其等价为a fixed-width subtractor——即,
n
−
n
→
n
n-n\rightarrow n
n−n→n,可将其结果看成是unsigned integer。
将生成以上乘积的multiplier表示为
n
×
n
→
n
lsb
n\times n\rightarrow n_{\text{lsb}}
n×n→nlsb,其中
n
lsb
n_{\text{lsb}}
nlsb是指该full product的
n
n
n个least-significant bits。
a
⋅
b
a\cdot b
a⋅b和
l
^
⋅
s
\hat{l}\cdot s
l^⋅s都可通过
n
×
n
→
n
lsb
n\times n\rightarrow n_{\text{lsb}}
n×n→nlsb来生成。
此外,若
s
s
s为constant,
l
^
⋅
s
\hat{l}\cdot s
l^⋅s可通过一个constant
n
×
n
→
n
lsb
n\times n\rightarrow n_{\text{lsb}}
n×n→nlsb multiplier来生成。
当
λ
≠
0
\lambda\neq 0
λ=0时:
a
b
−
l
^
s
=
r
+
λ
s
此时,用于表示等式(5)中右侧值所需的number of bits为:
⌈
log
2
(
r
+
λ
s
)
⌉
≤
n
+
⌈
log
2
r
+
λ
s
s
⌉
≤
n
+
⌈
log
2
(
1
+
λ
)
⌉
因此,若
λ
=
1
\lambda=1
λ=1,则仅需要额外再增加
1
1
1个bit来表示。
采用Barrett的modular reduction算法对
l
l
l求近似值为:
l
=
⌊
a
b
s
⌋
=
lim
k
→
∞
a
b
⋅
m
(
k
)
2
k
+
n
其中:
m
(
k
)
=
⌊
2
k
+
n
s
⌋
<
2
k
+
1
为a function of the
k
k
k,最多有
k
+
1
k+1
k+1 bits,为公式(8)的lower-bound approximator。对于有限的
k
k
k值,该approximation error为:
e
(
k
)
≡
1
s
−
m
(
k
)
2
k
+
n
<
2
−
(
k
+
n
)
其中,可检查二进制表示的左右项的最大差异来派生出该upper-bound。从而有approximation error on
l
(
k
)
l(k)
l(k)为:
e
(
l
,
k
)
≡
a
b
s
−
a
b
⋅
m
(
k
)
2
k
+
n
<
2
2
n
⋅
2
−
(
k
+
n
)
=
2
n
−
k
若
k
≥
n
k\geq n
k≥n,则该approximation error最多为
1
1
1。
选择
k
=
n
k=n
k=n(即
m
(
n
)
<
2
n
+
1
m(n)<2^{n+1}
m(n)<2n+1),则对
l
l
l的近似值为:
l
^
0
=
⌊
a
b
m
2
2
n
⌋
e
(
l
^
0
)
<
1
其中multiplication为
n
×
n
×
(
n
+
1
)
→
(
n
+
1
)
msb
n\times n\times (n+1)\rightarrow (n+1)_{\text{msb}}
n×n×(n+1)→(n+1)msb,且approximation error遵循(11)。
分两个阶段来实现以上multiplication:
注意,由于
m
(
n
)
m(n)
m(n) is typically very close to
2
n
2^n
2n,且
n
n
n通常很大,无需额外增加bits来表示(17)中的constant error,即
n
+
1
n+1
n+1 bits就足够了。
尽管如此,必须为每个特定setup检查并排除溢出的边界情况。
以下为hardware-optimized modular multiplier结构图,假定了
s
s
s和
m
m
m为已知的constants,使用
l
^
1
\hat{l}_1
l^1来表示
l
l
l的近似值。

注意,最左侧的multiplication module独立于reduction logic,使得该circuit的remainder可generalized beyond multiplication reduction。



当
s
=
65717
,
a
=
65535
,
b
=
65631
s=65717, a=65535, b=65631
s=65717,a=65535,b=65631时,真实
l
l
l值应为
⌊
a
b
s
⌋
=
65449
\left \lfloor \frac{ab}{s} \right \rfloor=65449
⌊sab⌋=65449。而根据本文算法获得近似值
l
^
1
=
65546
\hat{l}_1=65546
l^1=65546,此时,error
e
(
l
^
1
)
e(\hat{l}_1)
e(l^1)的值为
3
3
3。
不过,对于prime
s
s
s,这样的例外情况并不多,对于大多数的primes,最大可能error将不会超过
2
2
2。