Algorithm 重复字节序列的CRC32
我阅读了马克·阿德勒的解释(和),Algorithm 重复字节序列的CRC32,algorithm,bit-manipulation,crc,crc32,Algorithm,Bit Manipulation,Crc,Crc32,我阅读了马克·阿德勒的解释(和),crc32_combine如何使用数学技巧来计算在O(log(n))时间内将一个零位送入crc32状态机的效果,使用32x32矩阵和平方求幂 是否有一种技巧可以有效地计算以n字节重复m次的顺序馈送的效果 设x为CRC32位向量。我们可以计算一个矩阵M,计算应用8n零位(O(log(n))时间)的效果,以及一个位向量B=CRC32(n字节)(O(n)时间)。然后我们可以将新的x计算为x'=Mx+B,然后重复此步骤m次(O(m)次)。这将导致总共O(n+m)时间,但
crc32_combine
如何使用数学技巧来计算在O(log(n))
时间内将一个零位送入crc32状态机的效果,使用32x32矩阵和平方求幂
是否有一种技巧可以有效地计算以n
字节重复m
次的顺序馈送的效果
设
x
为CRC32位向量。我们可以计算一个矩阵M
,计算应用8n
零位(O(log(n))
时间)的效果,以及一个位向量B=CRC32(n字节)
(O(n)
时间)。然后我们可以将新的x计算为x'=Mx+B
,然后重复此步骤m
次(O(m)
次)。这将导致总共O(n+m)
时间,但是有更好的算法吗?O(n)
项似乎是不可避免的,因为我们必须读取n
字节作为输入,但是O(m)
部分似乎可以进行优化。有另一种方法可以相互使用carryless,比如X86处理器上的pclmulqdq(使用xmm寄存器)(自2010年起),这应该比使用一个m x m或更大的二进制矩阵更快,而不是使用一个2 x 2整数矩阵,使用33位多项式的无卡利乘法模。即使下面描述的方法使用基于软件的无夹带乘法,也可能比使用m x m或更大的二进制矩阵更快
定义+和-表示异或,·表示无卡利乘法,/表示无借除法,%表示无借模。定义p=33位多项式。然后
(a · b) % p
可以使用3个无载波乘法器和一个异或来实现。将多项式的“逆”定义为ip=(2^64)/p。然后(a·b)%p实现为
(a · b) % p = (a · b) - (p · ((a · b · ip)>>64))
对于pclmulqdq,>>64是通过指定128位xmm寄存器的高64位来完成的。其余操作指定较低的64位并生成128位乘积,其中除>>64的情况外,仅使用较低的64位
设B=CRC(n字节序列)。设C1=2^{n8}%p。这可以通过(2^8)%p的平方进行幂运算,在O(log(n))时间内得到2^{n8}%p。对于m=2:
CRC = (B · (C1 + 1)) % p
对于m=3:
CRC = (B · (C1^2 + C1 + 1)) % p
对于m=4:
CRC = (B · (C1^3 + C1^2 + C1 + 1)) % p
第二步的时间复杂度可通过对该2x2矩阵进行平方运算(使用无角乘法%p)进行幂运算降低为O(log(m)):
CRC=(M^M)[0][1]·B)%p
对于带有pclmulqdq(xmm寄存器)的X86,一个快速汇编程序可以以每秒超过15千兆字节的速度计算CRC(在最新的处理器上),因此尝试优化重复字符串可能没有那么大好处。如果我没有遗漏什么,非零字节的情况也可以通过平方求幂来解决 比如说,你有一个公式:
x' = Mx + B,
其中x和B是m维向量,m是m×m矩阵。如果我们定义大小为(m+1)×(m+1)的矩阵N和大小为(m+1)的向量y,y',这样:
|| M B || || x ||
N = || || y = || ||
|| 0...0 1 || || 1 ||
那么我们可以用单矩阵乘法来表示上面的公式:
|| M B || || x || || M×x + B×1 || || M×x + B || || x' ||
y' = Ny = || 0...0 1 || || 1 || = || 0×x + 1×1 || = || 1 || = || 1 ||
矩阵N可以像往常一样进行幂运算
这就是所谓的齐次坐标是射影几何。我不太懂射影几何,但它们在2d和3d图形中被广泛使用 可能是齐次坐标做的把戏。构建33x33矩阵:((M,byte),(0000001))并尝试对其求幂。在使用测试代码验证其是否有效后,我更新了我的答案。
|| M B || || x || || M×x + B×1 || || M×x + B || || x' ||
y' = Ny = || 0...0 1 || || 1 || = || 0×x + 1×1 || = || 1 || = || 1 ||