前言:
本文的讨论范围仅限于自然数集;
本文中,记 f ( x , y ) f(x,y) f(x,y)为区间 [ x , y ] [x, y] [x,y]的异或和。
准备·其一
首先,让我们观察如下的一些示例
1 = 2-1
[0, 0] 00
[1, 1] 01
3 = 4-1
[0, 1] 00 01
[2, 3] 10 11
7 = 8-1
[0, 3] 000 001 010 011
[4, 7] 100 101 110 111
15 = 16-1
[0, 7] 0000 0001 0010 0011 0100 0101 0110 0111
[8, 16] 1000 1001 1010 1011 1100 1101 1110 1111
想必诸君不难看出,对于 2 k − 1 ( k ≥ 2 ) 2^k-1(k \ge 2) 2k−1(k≥2),将其二分,于其二进制,可发现某种对称性。
显然,有
f ( 0 , 2 k − 1 − 1 ) = f ( 2 k − 1 , 2 k − 1 ) ( k ≥ 2 ) (1) f(0,2^{k-1}-1)=f(2^{k-1},2^k-1)(k \ge 2)\tag{1} f(0,2k−1−1)=f(2k−1,2k−1)(k≥2)(1)
不过,上述式子对于 2 1 2^1 21并不成立。
有意思的是,
{ f ( 0 , 2 k − 1 − 1 ) = f ( 2 k − 1 , 2 k − 1 ) = 1 ( k = 2 ) f ( 0 , 2 k − 1 − 1 ) = f ( 2 k − 1 , 2 k − 1 ) = 0 ( k > 2 ) \begin{cases} f(0,2^{k-1}-1)=f(2^{k-1},2^k-1) = 1 \quad (k = 2)\\ f(0,2^{k-1}-1)=f(2^{k-1},2^k-1) = 0 \quad (k > 2) \end{cases} {f(0,2k−1−1)=f(2k−1,2k−1)=1(k=2)f(0,2k−1−1)=f(2k−1,2k−1)=0(k>2)
各位可在阅读结束后再回看此处,这对于后文并无实质性帮助。
让我们先忽略这个特例,那么由 ( 1 ) (1) (1)式,我们可证一个对后文证明有利的式子,即
f
(
0
,
2
k
)
=
2
k
(
k
≥
2
)
(2)
f(0,2^k)=2^k(k \ge 2)\tag{2}
f(0,2k)=2k(k≥2)(2)
前式等价于
f
(
0
,
2
k
−
1
)
=
0
(
k
≥
2
)
(2*)
f(0,2^k-1) = 0 (k \ge 2)\tag{2*}
f(0,2k−1)=0(k≥2)(2*)
这是因为
f
(
0
,
2
k
)
=
f
(
0
,
2
k
−
1
)
⊕
2
k
.
f(0,2^k) = f(0,2^k-1) \oplus 2^k.
f(0,2k)=f(0,2k−1)⊕2k.
此时不妨先回头看看
(
1
)
(1)
(1)式,接着,我们便可以轻松地来证明此等价命题
(
2
∗
)
(2^*)
(2∗),
且看:
f
(
0
,
2
k
−
1
)
=
f
(
0
,
2
k
−
1
−
1
)
⊕
f
(
2
k
−
1
,
2
k
−
1
)
=
f
(
0
,
2
k
−
1
−
1
)
⊕
f
(
0
,
2
k
−
1
−
1
)
=
0
f(0,2^k-1) = f(0,2^{k-1}-1) \oplus f(2^{k-1}, 2^k-1) = f(0,2^{k-1}-1) \oplus f(0,2^{k-1}-1) = 0
f(0,2k−1)=f(0,2k−1−1)⊕f(2k−1,2k−1)=f(0,2k−1−1)⊕f(0,2k−1−1)=0
由此,(2)式得证.
准备·其二
接下来是另外一个对这个问题具有重要意义的式子。
显然有
f ( 2 k + 1 , 2 k + 2 m ) = f ( 1 , 2 m ) = f ( 0 , 2 m ) ( m ≤ k ) (3) f(2^k + 1, 2^k + 2^m) = f(1,2^m) = f(0,2^m)(m \le k)\tag{3} f(2k+1,2k+2m)=f(1,2m)=f(0,2m)(m≤k)(3)
这是因为,自然数集 [ 2 k + 1 , 2 k + 2 m ] [2^k + 1, 2^k + 2^m] [2k+1,2k+2m] 的势为 2 m 2^m 2m,这 2 m 2^m 2m个自然数二进制下的前导1在异或和后无贡献。
推导·其一
现在,我们已经获得了两个重要式子, ( 2 ) (2) (2)与 ( 3 ) (3) (3)。
显而易见,一些偶数可以写做一系列二次幂和的形式,如
28
=
16
+
8
+
4
28 = 16 + 8 + 4
28=16+8+4、
12
=
8
+
4
12 = 8 + 4
12=8+4。
沿着这一思考,可考虑计算一系列二次幂
2
k
(
k
≥
2
)
2^k(k\ge2)
2k(k≥2)加和的数
N
N
N,来看看
f
(
0
,
N
)
f(0, N)
f(0,N)的值为何。
前述的二次幂不取 k = 1 k=1 k=1的理由是, k k k为1时 ( 2 ) (2) (2)式不成立。
也就是说,尽管 14 = 8 + 4 + 2 14 = 8 +4 + 2 14=8+4+2也满足上面的描述,但我期望诸君能暂时将这些数不予考虑,而仅在目前思考那些最小二次幂数为4的数字们。
那么必然有 N = 4 n N = 4n N=4n。
若一个数可表示为若干二次幂的加和,且最小二次幂数不低于 2 2 2^2 22,那么这些数一定能表示为 4 n 4n 4n。
取
N
=
4
n
N = 4n
N=4n,则有
4
n
=
∑
i
=
1
n
2
a
i
(4)
4n=\sum_{i=1}^{n}2^{a_i}\tag{4}
4n=i=1∑n2ai(4)
其中,
{
a
i
}
\{a_i\}
{ai}是一个单调递减的数列且
m
i
n
{
a
i
}
≥
2
min\{a_i\} \ge 2
min{ai}≥2。
据(3)(4)可得
f ( 0 , 4 n ) \quad f(0,4n) f(0,4n)
= f ( 0 , 2 a 1 ) ⊕ f ( 2 a 1 + 1 , 2 a 1 + 2 a 2 ) ⊕ . . . ⊕ f ( 2 a 1 + 2 a 2 + . . . + 2 a n − 1 + 1 , 2 a 1 + 2 a 2 + . . . + 2 a n − 1 + 2 a n ) =f(0,2^{a_1})\oplus f(2^{a_1}+1,2^{a_1}+2^{a_2})\oplus ...\oplus f(2^{a_1}+2^{a_2}+...+2^{a_{n-1}}+1,2^{a_1}+2^{a_2}+...+2^{a_{n-1}}+2^{a_n}) =f(0,2a1)⊕f(2a1+1,2a1+2a2)⊕...⊕f(2a1+2a2+...+2an−1+1,2a1+2a2+...+2an−1+2an)
= f ( 0 , 2 a 1 ) ⊕ f ( 0 , 2 a 2 ) ⊕ . . . ⊕ f ( 0 , 2 a n ) =f(0,2^{a_1}) \oplus f(0,2^{a_2}) \oplus ... \oplus f(0,2^{a_n}) =f(0,2a1)⊕f(0,2a2)⊕...⊕f(0,2an)
= ∑ i = 1 n 2 a i =\sum_{i = 1}^{n}2^{a_i} =∑i=1n2ai
= 4 n =4n =4n
当 4 n = 0 4n = 0 4n=0时,显然有 f ( 0 , 0 ) = 0 f(0, 0) = 0 f(0,0)=0, 所以 f ( 0 , 4 n ) = 4 n ( n ≥ 0 ) f(0, 4n) = 4n (n \ge 0) f(0,4n)=4n(n≥0)。
推导·其二
既得 f ( 0 , 4 n ) = 4 n f(0,4n) = 4n f(0,4n)=4n,下面,我们很自然地想到要来计算 f ( 0 , 4 n + k ) ( 0 ≤ k ≤ 3 ) f(0,4n+k)(0 \le k \le 3) f(0,4n+k)(0≤k≤3).
计算如下:
由
4
n
=
∑
i
=
1
n
2
a
i
(
a
i
≥
2
)
4n=\sum_{i=1}^{n}2^{a_i}(a_i \ge 2)
4n=∑i=1n2ai(ai≥2)知
(
4
n
)
2
=
1
(
.
.
.
)
00
(4n)_2 = 1(...)00
(4n)2=1(...)00
而
(
4
n
+
1
)
2
=
1
(
.
.
.
)
01
(4n+1)_2 = 1(...)01
(4n+1)2=1(...)01
故
f
(
0
,
4
n
+
1
)
=
1
f(0,4n+1) = 1
f(0,4n+1)=1
又
(
4
n
+
2
)
2
=
1
(
.
.
.
)
10
(4n+2)_2 = 1(...)10
(4n+2)2=1(...)10
故
f
(
0
,
4
n
+
2
)
=
1
(
.
.
.
)
11
=
4
n
+
3
f(0,4n+2) = 1(...)11 = 4n+3
f(0,4n+2)=1(...)11=4n+3
故
f
(
0
,
4
n
+
3
)
=
0
f(0,4n+3) = 0
f(0,4n+3)=0
于是,
{
f
(
0
,
4
n
)
=
4
n
f
(
0
,
4
n
+
1
)
=
1
f
(
0
,
4
n
+
2
)
=
4
n
+
3
f
(
0
,
4
n
+
3
)
=
0
\begin{cases} f(0,4n) = 4n \\ f(0,4n+1) = 1 \\ f(0,4n+2) = 4n+3 \\ f(0,4n+3) = 0 \end{cases}
⎩
⎨
⎧f(0,4n)=4nf(0,4n+1)=1f(0,4n+2)=4n+3f(0,4n+3)=0
其中,
n
≥
0
n \ge 0
n≥0
在上述计算的过程中,这些数的二进制末两位我们必可确定。
推导·其三
现在,我们已经知道了如何求得 f ( 0 , x ) ( x ≥ 0 ) f(0, x) (x \ge 0) f(0,x)(x≥0),那么自然会思考,能不能给定任意两个自然数 x , y x,y x,y而立即得出 f ( x , y ) f(x, y) f(x,y)呢?
可以类比「连续区间代数和」,应当有
f
(
x
,
y
)
=
f
(
0
,
x
)
⊕
f
(
0
,
y
)
⊕
x
(
0
≤
x
≤
y
)
f(x, y) = f(0, x) \oplus f(0, y) \oplus x \quad (0 \le x \le y)
f(x,y)=f(0,x)⊕f(0,y)⊕x(0≤x≤y)
或写为
f
(
x
,
y
)
=
f
(
0
,
x
−
1
)
⊕
f
(
0
,
y
)
(
0
<
x
≤
y
)
f(x, y) = f(0, x-1) \oplus f(0, y) \quad (0 < x \le y)
f(x,y)=f(0,x−1)⊕f(0,y)(0<x≤y)
需要指出,上下两式并不等价,请诸君留意。
后记
诸君览阅至此,余不胜感激。
鄙人才疏学浅,难免纰漏之处,还望阁下不吝赐教。