当一个二元运算符同时满足 交换律 和 结合律 时

38 阅读3分钟

背景

在我们平时接触到的二元运算符中,有些同时满足 交换律(Commutative property)结合律(Associative property),例如

  • 定义在整数上的加法(++)
    • 满足交换律: a+b=b+aa+b=b+a
    • 满足结合律: (a+b)+c=a+(b+c)(a+b)+c=a+(b+c)
  • 定义在整数上的乘法(×\times)
    • 满足交换律: a×b=b×aa \times b=b \times a
    • 满足结合律: (a×b)×c=a×(b×c)(a \times b) \times c=a \times (b \times c)
  • 定义在 00, 11 上的 And 运算(\land)
    • 满足交换律: ab=baa\land b=b \land a
    • 满足结合律: (ab)c=a(bc)(a\land b) \land c=a \land (b \land c)
  • 定义在 00, 11 上的 Or 运算(\lor)
    • 满足交换律: ab=baa\lor b=b \lor a
    • 满足结合律: (ab)c=a(bc)(a \lor b) \lor c=a \lor (b \lor c)
  • 定义在 00, 11 上的异或运算(\oplus)
    • 满足交换律: ab=baa \oplus b=b \oplus a
    • 满足结合律: (ab)c=a(bc)(a \oplus b) \oplus c=a \oplus (b \oplus c)
  • 定义在 00, 11, 22, ... n1n-1 上的模nn加法(+n+_n)
    • 满足交换律: a+nb=b+naa+_n b=b+_n a
    • 满足结合律: (a+nb)+nc=a+n(b+nc)(a+_n b)+_n c=a+_n (b+_n c)
  • 定义在 00, 11, 22, ... n1n-1 上的模nn乘法(×n\times_n)
    • 满足交换律: a×nb=b×naa\times_n b=b\times_n a
    • 满足结合律: (a×nb)+nc=a×n(b×nc)(a\times_n b)+_n c=a\times_n (b\times_n c)

以我们熟悉的整数加法(++)和整数乘法(×\times)为例,如果有 kk 个(k2k\ge 2)操作数,我们可以任意调整操作数的顺序(常见的场景是为了让计算变得更方便而调整操作数的顺序),例如

  • a1+a2+a3+a4=a1+a4+a2+a3a_1 + a_2 + a_3 + a_4=a_1 + a_4 + a_2 + a_3
    • 具体的例子: 1+4+6+9=1+9+4+6=10+4+6=14+6=201 + 4 + 6 + 9=1 + 9 + 4 + 6 =10 + 4 + 6= 14+6=20
  • a1×a2×a3×a4=a2×a4×a1×a3a_1 \times a_2 \times a_3 \times a_4=a_2 \times a_4 \times a_1 \times a_3
    • 具体的例子: 3×2×5×3=2×5×3×3=10×3×3=30×3=903 \times 2 \times 5 \times 3=2\times 5 \times 3 \times 3 =10 \times 3 \times 3= 30 \times 3=90

那么对一个二元运算符而言,从 AA 能否推出 BB 呢? ⬇️ (换句话说,AABB 的充分条件吗?)

  • AA: 满足 交换律(Commutative property)结合律(Associative property)
  • BB: 如果有 kk (k2k\ge 2)个操作数,我们可以任意调整这 kk 个操作数的顺序

正文

目标

为了方便讨论,我们用 \diamond 来表示任意一个二元运算。我们的目标是,证明 AABB 的充分条件,或者找到反例说明 AA 不是 BB 的充分条件 ⬇️

  • AA: 二元运算 \diamond 满足
    • 交换律(Commutative property): ab=baa\diamond b=b\diamond a
    • 结合律(Associative property): (ab)c=a(bc)(a\diamond b) \diamond c=a \diamond (b\diamond c)
  • BB: 有 kk (k2k\ge 2)个操作数通过 \diamond 进行计算,即 a1a2a3...aka_1 \diamond a_2 \diamond a_3 \diamond ... \diamond a_k,而 b1,b2,b3,...,bkb_1,b_2,b_3,...,b_ka1,a2,a3,...,aka_1,a_2,a_3,...,a_k 的任意一个排列,那么
a1a2a3...ak=b1b2b3...bka_1 \diamond a_2 \diamond a_3 \diamond ... \diamond a_k=b_1 \diamond b_2 \diamond b_3 \diamond ... \diamond b_k

证明

先看看 kk 很小的情况。

k=2k=2 的情况

k=2k=2 时,因为 \diamond 满足交换律(Commutative property),所以

a1a2=a2a1a_1 \diamond a_2=a_2\diamond a1

而下面的等式显然成立

a1a2=a1a2a_1 \diamond a_2=a_1\diamond a2

所以 k=2k=2 时,AABB 的充分条件。

k=3k=3 的情况

k=3k=3 时,我们需要证明以下 66 个式子相等(因为 33 个操作数的排列一共有 3!=63!=6 种)

  • a1a2a3a_1\diamond a_2 \diamond a_3
  • a1a3a2a_1\diamond a_3 \diamond a_2
  • a2a1a3a_2\diamond a_1 \diamond a_3
  • a2a3a1a_2\diamond a_3 \diamond a_1
  • a3a1a2a_3\diamond a_1 \diamond a_2
  • a3a2a1a_3\diamond a_2 \diamond a_1

我们可以按照 a3a_3 所在的位置,把这 66 个式子分成以下 33 类 (为了便于描述,我把另外两个操作数依次称为 x,yx,y,也就是说 x,yx,ya1,a2a_1,a_2 的一个排列)

  • 11 类: a3xya_3\diamond x \diamond y
  • 22 类: xa3yx\diamond a_3 \diamond y
  • 33 类: xya3x\diamond y \diamond a_3
11 类情况: a3xya_3\diamond x \diamond y

运用结合律,可以得到

a3xy=a3(xy)a_3\diamond x \diamond y=a_3\diamond (x \diamond y)

运用交换律,可以得到

a3(xy)=(xy)a3=xya3a_3\diamond (x \diamond y)=(x\diamond y) \diamond a_3=x\diamond y \diamond a_3

用图来展示这个转化过程,会比较直观 ⬇️ p1.jpg

由于 x,yx, ya1,a2a_1,a_2 的一个排列,所以 xy=a1a2x\diamond y=a_1\diamond a_2 成立(k=2k=2 的情况我们已经证明过了)。所以

a3xy=a3(xy)a_3\diamond x \diamond y=a_3\diamond (x \diamond y)

因为 \diamond 满足交换律(Commutative property),所以

a3xya_3\diamond x\diamond y
=xya3=x\diamond y \diamond a_3
=(xy)a3=(x\diamond y)\diamond a_3
=(a1a2)a3=(a_1\diamond a_2)\diamond a_3
=a1a2a3=a_1\diamond a_2\diamond a_3
22 类情况: xa3yx\diamond a_3 \diamond y

运用交换律,可以得到

xa3y=a3xyx\diamond a_3 \diamond y=a_3\diamond x \diamond y

在处理第 11 类情况时,我们已经证明了

a3xy=xya3a_3\diamond x\diamond y=x\diamond y\diamond a_3

所以

xa3y=a3xy=xya3=a1a2a3x\diamond a_3 \diamond y=a_3\diamond x \diamond y=x\diamond y\diamond a_3=a_1\diamond a_2\diamond a_3

看图会更直观 ⬇️

p2.jpg

33 类情况: xya3x\diamond y \diamond a_3

由于 x,yx, ya1,a2a_1,a_2 的一个排列,所以 xy=a1a2x\diamond y=a_1\diamond a_2 成立(k=2k=2 的情况我们已经证明过了)。所以

xya3=a1a2a3x\diamond y \diamond a_3=a_1\diamond a_2\diamond a_3

到这里,我们就把 k=3k=3 时可能出现的所有情况都验证完了。

k=4k=4 的情况

a1,a2,a3,a4a_1,a_2,a_3,a_4 的排列共有 4!=244!=24 种,我们对这 2424 种排列进行如下分类,分类的依据是 a4a_4 所在的位置(为了便于描述,我把另外三个操作数依次称为 x,y,zx,y,z

  • 11 类: a4xyza_4 \diamond x\diamond y \diamond z
  • 22 类: xa4yzx \diamond a_4 \diamond y \diamond z
  • 33 类: xya4zx \diamond y\diamond a_4\diamond z
  • 44 类: xyza4x\diamond y\diamond z\diamond a_4
11 类情况: a4xyza_4 \diamond x\diamond y \diamond z

我们反复利用 k=3k=3 时所用到的手段,就可以证明

a4xyza_4\diamond x \diamond y \diamond z
=xa4yz=x \diamond a_4 \diamond y \diamond z
=xya4z=x \diamond y \diamond a_4 \diamond z
=xyza4=x \diamond y \diamond z\diamond a_4

看图可能会更直观 ⬇️ (在图中,我用波浪线把 a4a_4 的位置都标出来了) p3.jpg 由于 x,y,zx, y, za1,a2,a3a_1,a_2,a_3 的一个组合,所以 xyz=a1a2a3x\diamond y\diamond z=a_1\diamond a_2\diamond a_3 成立(k=3k=3的情况我们已经证明过了)。所以

a4xyza_4 \diamond x\diamond y \diamond z
=xyza4= x\diamond y \diamond z \diamond a_4
=(xyz)a4= (x\diamond y \diamond z)\diamond a_4
=(a1a2a3)a4= (a_1\diamond a_2 \diamond a_3) \diamond a_4
=a1a2a3a4= a_1\diamond a_2 \diamond a_3 \diamond a_4
22 类情况: xa4yzx \diamond a_4 \diamond y \diamond z

在第 11 类情况中,我们已经证明了

xa4yzx \diamond a_4 \diamond y \diamond z
=xyza4=x \diamond y \diamond z\diamond a_4

由于 x,y,zx, y, za1,a2,a3a_1,a_2,a_3 的一个组合,所以 xyz=a1a2a3x\diamond y\diamond z=a_1\diamond a_2\diamond a_3 成立(k=3k=3的情况我们已经证明过了)。所以

xa4yzx \diamond a_4 \diamond y \diamond z
=xyza4= x\diamond y \diamond z \diamond a_4
=(xyz)a4= (x\diamond y \diamond z)\diamond a_4
=(a1a2a3)a4= (a_1\diamond a_2 \diamond a_3) \diamond a_4
=a1a2a3a4= a_1\diamond a_2 \diamond a_3 \diamond a_4
33 类情况: xya4zx \diamond y\diamond a_4\diamond z

在第 11 类情况中,我们已经证明了

xya4zx \diamond y \diamond a_4 \diamond z
=xyza4=x \diamond y \diamond z\diamond a_4

由于 x,y,zx, y, za1,a2,a3a_1,a_2,a_3 的一个组合,所以 xyz=a1a2a3x\diamond y\diamond z=a_1\diamond a_2\diamond a_3 成立(k=3k=3的情况我们已经证明过了)。所以

xya4zx \diamond y \diamond a_4 \diamond z
=xyza4= x\diamond y \diamond z \diamond a_4
=(xyz)a4= (x\diamond y \diamond z)\diamond a_4
=(a1a2a3)a4= (a_1\diamond a_2 \diamond a_3) \diamond a_4
=a1a2a3a4= a_1\diamond a_2 \diamond a_3 \diamond a_4
44 类情况: xyza4x\diamond y\diamond z\diamond a_4

由于 x,y,zx, y, za1,a2,a3a_1,a_2,a_3 的一个组合,所以 xyz=a1a2a3x\diamond y\diamond z=a_1\diamond a_2\diamond a_3 成立(k=3k=3的情况我们已经证明过了)。所以

xyza4x\diamond y \diamond z \diamond a_4
=(xyz)a4= (x\diamond y \diamond z)\diamond a_4
=(a1a2a3)a4= (a_1\diamond a_2 \diamond a_3) \diamond a_4
=a1a2a3a4= a_1\diamond a_2 \diamond a_3 \diamond a_4

k5k\ge 5 的情况

k=5k= 5 的情况,我们可以 k=4k=4 时所用到的手段来证明。我们可以用和 k=4k=4 时类似的手段来证明(为了便于描述,我们将另外 44 个操作数依次称为 w,x,y,zw,x,y,z)

a5wxyza_5\diamond w \diamond x\diamond y\diamond z

用交换律可以得到

=(a5w)xyz=(wa5)xyz=wa5xyz=(a_5\diamond w) \diamond x\diamond y\diamond z=(w\diamond a_5) \diamond x\diamond y\diamond z=w\diamond a_5 \diamond x\diamond y\diamond z

我们已经证明过 k=3k=3 的情况,所以下面的转化成立

=(wa5x)yz=(wxa5)yz=wxa5yz=(w\diamond a_5 \diamond x)\diamond y\diamond z=(w\diamond x\diamond a_5)\diamond y\diamond z=w\diamond x\diamond a_5\diamond y\diamond z

我们已经证明过 k=4k=4 的情况,所以下面的转化成立

=(wxa5y)z=(wxya5)z=wxya5z=(w\diamond x\diamond a_5 \diamond y)\diamond z=(w\diamond x\diamond y\diamond a_5)\diamond z=w\diamond x\diamond y\diamond a_5 \diamond z

wxyw\diamond x\diamond y 看成一个整体,可以得出下面的转化成立

=(wxy)a5z=(wxy)za5=wxyza5=(w\diamond x\diamond y)\diamond a_5 \diamond z=(w\diamond x\diamond y)\diamond z \diamond a_5=w\diamond x\diamond y\diamond z \diamond a_5

所以以下 55 个式子都相等

  • a5wxyza_5\diamond w \diamond x\diamond y\diamond z
  • wa5xyzw\diamond a_5 \diamond x\diamond y\diamond z
  • wxa5yzw\diamond x\diamond a_5\diamond y\diamond z
  • wxya5zw\diamond x\diamond y\diamond a_5 \diamond z
  • wxyza5w\diamond x\diamond y\diamond z \diamond a_5

也就是说,无论 a5a_5 的初始位置在哪里,我们都可以将它移动到最后去,而且最终的结算结果不变。 而 w,x,y,zw,x,y,za1,a2,a3,a4a_1,a_2,a_3,a_4 的一个排列,所以下面的等式成立(这是 k=4k=4 的情况)

wxyz=a1a2a3a4w\diamond x\diamond y\diamond z=a_1\diamond a_2\diamond a_3\diamond a_4

所以我们是在用数学归纳法来证明 AABB 的充分条件。k6k\ge 6 时的情况就不赘述了。

AABB 的充分条件,这有什么用处?

AABB 的充分条件的基础上,我们还能推出更强的结论。

更强的结论 11

有 kk (k2k\ge 2)个操作数通过 \diamond 进行计算,即 a1a2a3...aka1\diamond a2 \diamond a3\diamond ... \diamond a_k,而 b1,b2,b3,...,bkb_1,b_2,b_3,...,b_k 是 a1,a2,a3,...,aka_1,a_2,a_3,...,a_k 的任意一个排列,在 b1b2b3...bkb_1\diamond b_2\diamond b_3\diamond ...\diamond b_k 中可以任意添加不嵌套的括号,最终的结果不变。

这个结论也可以用数学归纳法来证明,但是严格的证明写起来会比较繁琐,我们通过一个例子来展示证明思路吧。

我们用 k=4k=4 时的一个具体例子来进行说明。求证

a1a2a3a4=a4(a2a1)a3a_1\diamond a_2 \diamond a_3\diamond a_4=a_4 \diamond (a_2 \diamond a_1) \diamond a_3

可以这样证明 ⬇️

a1a2a3a4=a4a2a1a3a_1\diamond a_2 \diamond a_3\diamond a_4=a_4 \diamond a_2 \diamond a_1 \diamond a_3
=(a4a2a1)a3=(a_4 \diamond a_2 \diamond a_1 )\diamond a_3
=(a4(a2a1))a3=(a_4 \diamond (a_2 \diamond a_1 ))\diamond a_3
=a4(a2a1)a3=a_4 \diamond (a_2 \diamond a_1 )\diamond a_3

更强的结论 22

有 kk (k2k\ge 2)个操作数通过 \diamond 进行计算,即 a1a2a3...aka1\diamond a2 \diamond a3\diamond ... \diamond a_k,而 b1,b2,b3,...,bkb_1,b_2,b_3,...,b_k 是 a1,a2,a3,...,aka_1,a_2,a_3,...,a_k 的任意一个排列,在 b1b2b3...bkb_1\diamond b_2\diamond b_3\diamond ...\diamond b_k 中可以任意添加括号(允许括号之间嵌套),最终的结果不变。

这个结论可以用数学归纳法或者通过递归的方式来证明,有兴趣的朋友可以自己思考一下。

这些结论的应用

整数上的加法和乘法,我们都很熟悉了,就不再举例子了。我来找些其他运算的例子。

定义在 00, 11 上的异或运算(\oplus)

假设有 MM11NN00 (M+N2M+N\ge 2)进行异或运算,那么这些 1100 的顺序并不影响最终的结果。所以它的结果总是等于 111...100...01\oplus 1\oplus 1...\oplus 1 \oplus 0 \oplus 0 ... \oplus 0 (我们可以把所有的 11 移动到所有 00 的前面去)。结合以下两个等式,可以得出,异或运算结尾处的 00 对最终结果没有影响。

  • 10=11\oplus 0=1
  • 00=00\oplus 0=0

所以最后的 NN00 对最终结果没有影响。以 M=4,N=2M=4,N=2 为例

1011101\oplus 0 \oplus 1 \oplus 1 \oplus 1 \oplus 0
=111100=1\oplus 1 \oplus 1 \oplus 1 \oplus 0 \oplus 0
=1111=1\oplus 1 \oplus 1 \oplus 1

我们看一下下面这两个等式

  • 11=01\oplus 1=0
  • 01=10\oplus 1=1

可以得出

  • 参与异或运算的 11 的个数是奇数时,结果为 11
  • 参与异或运算的 11 的个数是偶数时,结果为 00

所以 MM11NN00 进行异或运算时,最终结果一定满足

1 if M is odd 
0 else
定义在 00, 11 上的同或运算(\odot)

假设有 MM11NN00 (M+N2M+N\ge 2)进行同或运算,那么这些 1100 的顺序并不影响最终的结果。所以它的结果总是等于 000...011...10\odot 0\odot 0...\odot 0 \odot 1 \odot 1 ... \odot 1 (我们可以把所有的 00 移动到所有 11 的前面去)。结合以下两个等式,可以得出,同或运算结尾处的 11 对最终结果没有影响。

  • 01=00\odot 1=0
  • 11=11\odot 1=1

所以最后的 MM11 对最终结果没有影响。以 M=4,N=2M=4,N=2 为例

1011101\odot 0 \odot 1 \odot 1 \odot 1 \odot 0
=001111=0\odot 0\odot 1\oplus 1 \odot 1 \odot 1
=00=0\odot 0

我们看一下下面这两个等式

  • 00=10\odot 0=1
  • 10=01\odot 0=0

可以得出

  • 参与异或运算的 00 的个数是奇数时,结果为 00
  • 参与异或运算的 00 的个数是偶数时,结果为 11

所以 MM11NN00 进行异或运算时,最终结果一定满足

0 if N is odd 
1 else
定义在 00, 11 上的 Or 运算(\lor)

如果有 kk (k2k\ge 2)个操作数进行 Or 运算,那么我们可以随意添加括号。例如

a1a2a3a4a5a6a7a8=(a1a2)(a3a4)(a5a6)(a7a8)a_1\lor a_2 \lor a_3 \lor a_4\lor a_5\lor a_6\lor a_7\lor a_8=(a_1\lor a_2)\lor (a_3\lor a_4)\lor (a_5\lor a_6)\lor(a_7\lor a_8)