背景
在我们平时接触到的二元运算符中,有些同时满足 交换律(Commutative property) 和 结合律(Associative property),例如
- 定义在整数上的加法(+)
- 满足交换律: a+b=b+a
- 满足结合律: (a+b)+c=a+(b+c)
- 定义在整数上的乘法(×)
- 满足交换律: a×b=b×a
- 满足结合律: (a×b)×c=a×(b×c)
- 定义在 0, 1 上的
And 运算(∧)
- 满足交换律: a∧b=b∧a
- 满足结合律: (a∧b)∧c=a∧(b∧c)
- 定义在 0, 1 上的
Or 运算(∨)
- 满足交换律: a∨b=b∨a
- 满足结合律: (a∨b)∨c=a∨(b∨c)
- 定义在 0, 1 上的异或运算(⊕)
- 满足交换律: a⊕b=b⊕a
- 满足结合律: (a⊕b)⊕c=a⊕(b⊕c)
- 定义在 0, 1, 2, ... n−1 上的模n加法(+n)
- 满足交换律: a+nb=b+na
- 满足结合律: (a+nb)+nc=a+n(b+nc)
- 定义在 0, 1, 2, ... n−1 上的模n乘法(×n)
- 满足交换律: a×nb=b×na
- 满足结合律: (a×nb)+nc=a×n(b×nc)
以我们熟悉的整数加法(+)和整数乘法(×)为例,如果有 k 个(k≥2)操作数,我们可以任意调整操作数的顺序(常见的场景是为了让计算变得更方便而调整操作数的顺序),例如
- a1+a2+a3+a4=a1+a4+a2+a3
- 具体的例子: 1+4+6+9=1+9+4+6=10+4+6=14+6=20
- a1×a2×a3×a4=a2×a4×a1×a3
- 具体的例子: 3×2×5×3=2×5×3×3=10×3×3=30×3=90
那么对一个二元运算符而言,从 A 能否推出 B 呢? ⬇️ (换句话说,A 是 B 的充分条件吗?)
- A: 满足 交换律(
Commutative property) 和 结合律(Associative property)
- B: 如果有 k (k≥2)个操作数,我们可以任意调整这 k 个操作数的顺序
正文
目标
为了方便讨论,我们用 ⋄ 来表示任意一个二元运算。我们的目标是,证明 A 是 B 的充分条件,或者找到反例说明 A 不是 B 的充分条件 ⬇️
- A: 二元运算 ⋄ 满足
- 交换律(
Commutative property): a⋄b=b⋄a
- 结合律(
Associative property): (a⋄b)⋄c=a⋄(b⋄c)
- B: 有 k (k≥2)个操作数通过 ⋄ 进行计算,即 a1⋄a2⋄a3⋄...⋄ak,而 b1,b2,b3,...,bk 是 a1,a2,a3,...,ak 的任意一个排列,那么
a1⋄a2⋄a3⋄...⋄ak=b1⋄b2⋄b3⋄...⋄bk
证明
先看看 k 很小的情况。
k=2 的情况
当 k=2 时,因为 ⋄ 满足交换律(Commutative property),所以
a1⋄a2=a2⋄a1
而下面的等式显然成立
a1⋄a2=a1⋄a2
所以 k=2 时,A 是 B 的充分条件。
k=3 的情况
当 k=3 时,我们需要证明以下 6 个式子相等(因为 3 个操作数的排列一共有 3!=6 种)
- a1⋄a2⋄a3
- a1⋄a3⋄a2
- a2⋄a1⋄a3
- a2⋄a3⋄a1
- a3⋄a1⋄a2
- a3⋄a2⋄a1
我们可以按照 a3 所在的位置,把这 6 个式子分成以下 3 类
(为了便于描述,我把另外两个操作数依次称为 x,y,也就是说 x,y 是 a1,a2 的一个排列)
- 第 1 类: a3⋄x⋄y
- 第 2 类: x⋄a3⋄y
- 第 3 类: x⋄y⋄a3
第 1 类情况: a3⋄x⋄y
运用结合律,可以得到
a3⋄x⋄y=a3⋄(x⋄y)
运用交换律,可以得到
a3⋄(x⋄y)=(x⋄y)⋄a3=x⋄y⋄a3
用图来展示这个转化过程,会比较直观 ⬇️

由于 x,y 是 a1,a2 的一个排列,所以 x⋄y=a1⋄a2 成立(k=2 的情况我们已经证明过了)。所以
a3⋄x⋄y=a3⋄(x⋄y)
因为 ⋄ 满足交换律(Commutative property),所以
a3⋄x⋄y
=x⋄y⋄a3
=(x⋄y)⋄a3
=(a1⋄a2)⋄a3
=a1⋄a2⋄a3
第 2 类情况: x⋄a3⋄y
运用交换律,可以得到
x⋄a3⋄y=a3⋄x⋄y
在处理第 1 类情况时,我们已经证明了
a3⋄x⋄y=x⋄y⋄a3
所以
x⋄a3⋄y=a3⋄x⋄y=x⋄y⋄a3=a1⋄a2⋄a3
看图会更直观 ⬇️

第 3 类情况: x⋄y⋄a3
由于 x,y 是 a1,a2 的一个排列,所以 x⋄y=a1⋄a2 成立(k=2 的情况我们已经证明过了)。所以
x⋄y⋄a3=a1⋄a2⋄a3
到这里,我们就把 k=3 时可能出现的所有情况都验证完了。
k=4 的情况
a1,a2,a3,a4 的排列共有 4!=24 种,我们对这 24 种排列进行如下分类,分类的依据是 a4 所在的位置(为了便于描述,我把另外三个操作数依次称为 x,y,z)
- 第 1 类: a4⋄x⋄y⋄z
- 第 2 类: x⋄a4⋄y⋄z
- 第 3 类: x⋄y⋄a4⋄z
- 第 4 类: x⋄y⋄z⋄a4
第 1 类情况: a4⋄x⋄y⋄z
我们反复利用 k=3 时所用到的手段,就可以证明
a4⋄x⋄y⋄z
=x⋄a4⋄y⋄z
=x⋄y⋄a4⋄z
=x⋄y⋄z⋄a4
看图可能会更直观 ⬇️ (在图中,我用波浪线把 a4 的位置都标出来了)
由于 x,y,z 是 a1,a2,a3 的一个组合,所以 x⋄y⋄z=a1⋄a2⋄a3 成立(k=3的情况我们已经证明过了)。所以
a4⋄x⋄y⋄z
=x⋄y⋄z⋄a4
=(x⋄y⋄z)⋄a4
=(a1⋄a2⋄a3)⋄a4
=a1⋄a2⋄a3⋄a4
第 2 类情况: x⋄a4⋄y⋄z
在第 1 类情况中,我们已经证明了
x⋄a4⋄y⋄z
=x⋄y⋄z⋄a4
由于 x,y,z 是 a1,a2,a3 的一个组合,所以 x⋄y⋄z=a1⋄a2⋄a3 成立(k=3的情况我们已经证明过了)。所以
x⋄a4⋄y⋄z
=x⋄y⋄z⋄a4
=(x⋄y⋄z)⋄a4
=(a1⋄a2⋄a3)⋄a4
=a1⋄a2⋄a3⋄a4
第 3 类情况: x⋄y⋄a4⋄z
在第 1 类情况中,我们已经证明了
x⋄y⋄a4⋄z
=x⋄y⋄z⋄a4
由于 x,y,z 是 a1,a2,a3 的一个组合,所以 x⋄y⋄z=a1⋄a2⋄a3 成立(k=3的情况我们已经证明过了)。所以
x⋄y⋄a4⋄z
=x⋄y⋄z⋄a4
=(x⋄y⋄z)⋄a4
=(a1⋄a2⋄a3)⋄a4
=a1⋄a2⋄a3⋄a4
第 4 类情况: x⋄y⋄z⋄a4
由于 x,y,z 是 a1,a2,a3 的一个组合,所以 x⋄y⋄z=a1⋄a2⋄a3 成立(k=3的情况我们已经证明过了)。所以
x⋄y⋄z⋄a4
=(x⋄y⋄z)⋄a4
=(a1⋄a2⋄a3)⋄a4
=a1⋄a2⋄a3⋄a4
k≥5 的情况
对 k=5 的情况,我们可以 k=4 时所用到的手段来证明。我们可以用和 k=4 时类似的手段来证明(为了便于描述,我们将另外 4 个操作数依次称为 w,x,y,z)
a5⋄w⋄x⋄y⋄z
用交换律可以得到
=(a5⋄w)⋄x⋄y⋄z=(w⋄a5)⋄x⋄y⋄z=w⋄a5⋄x⋄y⋄z
我们已经证明过 k=3 的情况,所以下面的转化成立
=(w⋄a5⋄x)⋄y⋄z=(w⋄x⋄a5)⋄y⋄z=w⋄x⋄a5⋄y⋄z
我们已经证明过 k=4 的情况,所以下面的转化成立
=(w⋄x⋄a5⋄y)⋄z=(w⋄x⋄y⋄a5)⋄z=w⋄x⋄y⋄a5⋄z
将 w⋄x⋄y 看成一个整体,可以得出下面的转化成立
=(w⋄x⋄y)⋄a5⋄z=(w⋄x⋄y)⋄z⋄a5=w⋄x⋄y⋄z⋄a5
所以以下 5 个式子都相等
- a5⋄w⋄x⋄y⋄z
- w⋄a5⋄x⋄y⋄z
- w⋄x⋄a5⋄y⋄z
- w⋄x⋄y⋄a5⋄z
- w⋄x⋄y⋄z⋄a5
也就是说,无论 a5 的初始位置在哪里,我们都可以将它移动到最后去,而且最终的结算结果不变。
而 w,x,y,z 是 a1,a2,a3,a4 的一个排列,所以下面的等式成立(这是 k=4 的情况)
w⋄x⋄y⋄z=a1⋄a2⋄a3⋄a4
所以我们是在用数学归纳法来证明 A 是 B 的充分条件。k≥6 时的情况就不赘述了。
A 是 B 的充分条件,这有什么用处?
在 A 是 B 的充分条件的基础上,我们还能推出更强的结论。
更强的结论 1
有 k (k≥2)个操作数通过 ⋄ 进行计算,即 a1⋄a2⋄a3⋄...⋄ak,而 b1,b2,b3,...,bk 是 a1,a2,a3,...,ak 的任意一个排列,在 b1⋄b2⋄b3⋄...⋄bk 中可以任意添加不嵌套的括号,最终的结果不变。
这个结论也可以用数学归纳法来证明,但是严格的证明写起来会比较繁琐,我们通过一个例子来展示证明思路吧。
我们用 k=4 时的一个具体例子来进行说明。求证
a1⋄a2⋄a3⋄a4=a4⋄(a2⋄a1)⋄a3
可以这样证明 ⬇️
a1⋄a2⋄a3⋄a4=a4⋄a2⋄a1⋄a3
=(a4⋄a2⋄a1)⋄a3
=(a4⋄(a2⋄a1))⋄a3
=a4⋄(a2⋄a1)⋄a3
更强的结论 2
有 k (k≥2)个操作数通过 ⋄ 进行计算,即 a1⋄a2⋄a3⋄...⋄ak,而 b1,b2,b3,...,bk 是 a1,a2,a3,...,ak 的任意一个排列,在 b1⋄b2⋄b3⋄...⋄bk 中可以任意添加括号(允许括号之间嵌套),最终的结果不变。
这个结论可以用数学归纳法或者通过递归的方式来证明,有兴趣的朋友可以自己思考一下。
这些结论的应用
整数上的加法和乘法,我们都很熟悉了,就不再举例子了。我来找些其他运算的例子。
定义在 0, 1 上的异或运算(⊕)
假设有 M 个 1 和 N 个 0 (M+N≥2)进行异或运算,那么这些 1 和 0 的顺序并不影响最终的结果。所以它的结果总是等于 1⊕1⊕1...⊕1⊕0⊕0...⊕0 (我们可以把所有的 1 移动到所有 0 的前面去)。结合以下两个等式,可以得出,异或运算结尾处的 0 对最终结果没有影响。
- 1⊕0=1
- 0⊕0=0
所以最后的 N 个 0 对最终结果没有影响。以 M=4,N=2 为例
1⊕0⊕1⊕1⊕1⊕0
=1⊕1⊕1⊕1⊕0⊕0
=1⊕1⊕1⊕1
我们看一下下面这两个等式
- 1⊕1=0
- 0⊕1=1
可以得出
- 参与异或运算的 1 的个数是奇数时,结果为 1
- 参与异或运算的 1 的个数是偶数时,结果为 0
所以 M 个 1 和 N 个 0 进行异或运算时,最终结果一定满足
1 if M is odd
0 else
定义在 0, 1 上的同或运算(⊙)
假设有 M 个 1 和 N 个 0 (M+N≥2)进行同或运算,那么这些 1 和 0 的顺序并不影响最终的结果。所以它的结果总是等于 0⊙0⊙0...⊙0⊙1⊙1...⊙1 (我们可以把所有的 0 移动到所有 1 的前面去)。结合以下两个等式,可以得出,同或运算结尾处的 1 对最终结果没有影响。
- 0⊙1=0
- 1⊙1=1
所以最后的 M 个 1 对最终结果没有影响。以 M=4,N=2 为例
1⊙0⊙1⊙1⊙1⊙0
=0⊙0⊙1⊕1⊙1⊙1
我们看一下下面这两个等式
- 0⊙0=1
- 1⊙0=0
可以得出
- 参与异或运算的 0 的个数是奇数时,结果为 0
- 参与异或运算的 0 的个数是偶数时,结果为 1
所以 M 个 1 和 N 个 0 进行异或运算时,最终结果一定满足
0 if N is odd
1 else
定义在 0, 1 上的 Or 运算(∨)
如果有 k (k≥2)个操作数进行 Or 运算,那么我们可以随意添加括号。例如
a1∨a2∨a3∨a4∨a5∨a6∨a7∨a8=(a1∨a2)∨(a3∨a4)∨(a5∨a6)∨(a7∨a8)