Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 重复字节序列的CRC32_Algorithm_Bit Manipulation_Crc_Crc32 - Fatal编程技术网

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  ||