考虑一个布尔数组
给定
我观察到:如果我们定义
异或运算符
如果我们让
a[n]
,其中每个元素都是一个单元格。如果只有一个相邻单元格是活着的(设为true
),则该单元格在下一代中变为活着的;否则,它将死亡(设为false
)。第一个和最后一个单元格被认为是相邻的。给定
a[n]
、数组大小n
和正整数t
,我希望计算出在第t代进化后的a[n]
,但不使用任何t
上的迭代算法,因为t
可能非常大。我观察到:如果我们定义
S_k(a[n])
为a[n]
向右循环移位k
个元素。也就是说,如果0 <= k < n
,则一个移位后a[0]
变成了a[k]
。定义a[n] ^ b[n]
为两个布尔数组之间的逐元素异或操作。如果w[n]
是一个布尔数组,则下一代可以表示为:r(w[n]) = S_{-1}(w[n]) ^ S_1(w[n])
异或运算符
^
是可结合和可交换的。利用这个性质,可以通过以下方式计算下几代的w[n]
。r^2(w[n]) = ( S_{-2}(w[n]) ^ S_0(w[n]) ) ^ ( S_0(w[n]) ^ S_2(w[n]) )
= S_{-2}(w[n]) ^ S_2(w[n])
如果我们让
s_j = S_{-j}(w[n]) ^ S_j(w[n])
,会出现一种模式。r(w[n]) = s_1
r^2(w[n]) = s_2
r^3(w[n]) = s_3 ^ s_1
r^4(w[n]) = s_4
...
r(s_m) = s_{m-1} ^ s_{m+1}
此外,s_n = 0
(全为零的数组),因为完全循环移位后的数组与原始数组相同。如何利用此来得出r^t(w[n])
的非迭代表达式?
编辑:该模式为
[1]
[2]
[1,3]
[4]
[3,5]
[2,6]
[1,3,5,7]
[8]
t
上使用任何迭代算法?即使t
非常大,在O(log(t))的迭代算法也会非常高效。 - fjardon