关于有限域的基础知识,可参考:

有限域几乎是密码学中所有数学的基础。
ZKP证明系统中的所有运算都是基于有限域的:
但是,真实的计算机没有有限域电路装置,只有:
因此,需基于以上运算来构建有限域运算。
有限域运算的速度很关键,原因在于:
本文主要关注内容有:
并对大整数乘法运算的经典算法、Barrett算法、Montgomery算法进行了对比:

大整数,又名BigInt或Multiprecision Integers。
真实计算机的运算符是基于word的:
对于更大(如256位)的域,会将其切分为words来表示:
如以100进制的digit来表示大整数27311837,对应为:
(
27
31
18
37
)
100
(27\ 31\ 18\ 37)_{100}
(27 31 18 37)100。
对应的大整数加法运算,如
(
27
31
18
37
)
100
+
(
88
68
97
89
)
100
(27\ 31\ 18\ 37)_{100} + (88\ 68\ 97\ 89)_{100}
(27 31 18 37)100+(88 68 97 89)100,计算规则为:

具体见Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.3算法:






以
(
54
12
)
100
∗
(
36
29
)
100
(54\ 12)_{100}*(36\ 29)_{100}
(54 12)100∗(36 29)100大整数乘法运算为例,具体见Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.8算法:

对应各个step的计算数据为:

需注意,以上加法和乘法运算结果均为更大的值,需将这些大的结果值reduce为相应的canonical表示,如:

常见的Modular Reduction算法有:
相关博客有:
做reduction最明显的方式是做除法,但除法运算昂贵,且可能不是constant time的。以single-word除法运算 b = 1 , R = 2 k b=1,R=2^k b=1,R=2k 为例:
func reduce(a uint) uint {
q:= a / n // Division implicitly returns the floor of the result.
return a - q * n
}
非constant time会存在timing attack攻击问题。
Barrett reduction为将
1
/
n
1/n
1/n近似为
m
/
2
k
m/2^k
m/2k,因为
m
/
2
k
m/2^k
m/2k中的除法实际是右移运算,要便宜得多。【可近似计算
m
m
m值为
m
=
⌊
2
k
/
n
⌋
m=\left \lfloor 2^k/n\right \rfloor
m=⌊2k/n⌋】
func reduce(a uint) uint {
q := (a * m) >> k // ">> k" denotes bitshift by k.
return a - q * n
}
不过这样reduce之后的结果在 [ 0 , 2 n ) [0,2n) [0,2n),而不是 [ 0 , n ) [0,n) [0,n),因此需进一步reduce:
func reduce(a uint) uint {
q := (a * m) >> k
a -= q * n
if a >= n {
a -= n
}
return a
}
Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.17算法,将其扩展为了multi-word Barrett Reduction算法,且在以上最后一步reduce之前的结果不再是
[
0
,
2
n
)
[0,2n)
[0,2n)而是可能更大的范围值,因此在Algorithm 10.17算法中第4步采用的是while:










Montgomery Form为另一种有限域表示,其支持快速combined multiplication and reduction算法。
之前将有限域元素表示为:
x
∈
[
0
,
N
−
1
]
x\in [0,N-1]
x∈[0,N−1]
而Montgomery Form表示定义为:
[
x
]
=
(
x
R
)
m
o
d
N
[x]=(xR)\mod N
[x]=(xR)modN
Montgomery Reduction算法计算的是:
R
E
D
C
(
u
)
=
(
u
R
−
1
)
m
o
d
N
REDC(u)=(uR^{-1})\mod N
REDC(u)=(uR−1)modN
而不是之前Barrett Reduction计算的
u
m
o
d
N
u\mod N
umodN。
R E D C REDC REDC是一个非常多功能的公式:

其中 Handbook of Elliptic and Hyperelliptic Curve Cryptography书本中的Algorithm 10.22算法中所实现的Montgomery reduction算法为:










Multiplication算法的演变过程为:
[1] RISC Zero团队2023年2月视频 Finite Field Implementations: Barrett & Montgomery【slide见Finite Field Implementations】
[2] 维基百科Barrett reduction