浅说连续区间异或和

前言:
本文的讨论范围仅限于自然数集;
本文中,记 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) 2k1(k2),将其二分,于其二进制,可发现某种对称性

显然,有


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,2k11)=f(2k1,2k1)(k2)(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,2k11)=f(2k1,2k1)=1(k=2)f(0,2k11)=f(2k1,2k1)=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(k2)(2)
前式等价于
f ( 0 , 2 k − 1 ) = 0 ( k ≥ 2 ) (2*) f(0,2^k-1) = 0 (k \ge 2)\tag{2*} f(0,2k1)=0(k2)(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,2k1)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,2k1)=f(0,2k11)f(2k1,2k1)=f(0,2k11)f(0,2k11)=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)(mk)(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(k2)加和的数 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=1n2ai(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+...+2an1+1,2a1+2a2+...+2an1+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(n0)


推导·其二

既得 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)(0k3).

计算如下:
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(ai2) ( 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 n0

在上述计算的过程中,这些数的二进制末两位我们必可确定。


推导·其三

现在,我们已经知道了如何求得 f ( 0 , x ) ( x ≥ 0 ) f(0, x) (x \ge 0) f(0,x)(x0),那么自然会思考,能不能给定任意两个自然数 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(0xy)
或写为
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,x1)f(0,y)(0<xy)

需要指出,上下两式并不等价,请诸君留意。


后记

诸君览阅至此,余不胜感激。

鄙人才疏学浅,难免纰漏之处,还望阁下不吝赐教。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值