集合的异或运算(对称差)

1、集合的异或运算(AΔB)定义
属于A或属于B,但不同时属于A和B的元素的集合称为A和B的对称差,即A和B的异或。

注:草绿色部分即为 AΔB

2、对称差(异或)运算的定律
2.1 AΔB = (A-B)∪(B-A) = (A∪B)-(A∩B)
该公式的证明已在 集合的证明及相关习题 中证明了


2.2 对称差运算的交换律
(AΔB)ΔC = (AΔC)ΔB

注:图1中草绿色部分为 (AΔB) ,三角形区域为 C ,(AΔB)ΔC  = 仅含草绿色或仅含三角形的区域
注:图2中草绿色部分为 (AΔC) ,三角形区域为 B ,(AΔC)ΔB  = 仅含草绿色或仅含三角形的区域

证明:
(AΔB)ΔC
= [(A-B)∪(B-A)]△C         
= {[(A-B)∪(B-A)] - C} ∪ {C - [(A-B)∪(B-A)]}
转换全部 ‘-‘ 号
= {[(A∩~B)∪(~A∩B)] ∩ (~C)} ∪ {C∩~[(A∩~B)∪(~A∩B)]}
对大括号的2部分分别进行公式化解

左边部分:
{[(A∩~B)∪(~A∩B)] ∩ (~C)}
将(A∩~B)和(~A∩B)当整体,根据分配律
{[(A∩~B)∪(~A∩B)] ∩ (~C)}
= {[(A∩~B)∩(~C)]∪[(~A∩B)∩(~C)]}
根据结合律
= {(A∩~B∩~C)∪(~A∩B∩~C)}

右边部分:
{C∩~[(A∩~B)∪(~A∩B)]}
根据De.Morgen定律,将~移进去
= {C∩[~(A∩~B)∩~(~A∩B)]}
根据De.Morgen定律,继续将~移进去
= {C∩[(~A∪~~B)∩(~~A∪~B)]}
∵~~B = B,~~A = A
∴{C∩[(~A∪~~B)∩(~~A∪~B)]} = {C∩[(~A∪B)∩(A∪~B)]}
将(~A∪B)当作整体,继续用分配律处理[(~A∪B)∩(A∪~B)]
[(~A∪B)∩(A∪~B)]
= [(~A∪B)∩A]∪[(~A∪B)∩~B)]
继续分配律
= [(~A∩A)∪(B∩A)]∪[(~A∩~B)∪(B∩~B)]
= [φ∪(B∩A)]∪[(~A∩~B)∪φ]
= (B∩A)∪(~A∩~B)
∴{C∩[(~A∪B)∩(A∪~B)]} = {C∩(B∩A)∪(~A∩~B))
将(B∩A)和(~A∩~B)分别当作整体,根据分配律
= (A∩B∩C)∪(~A∩~B∩C)

∴(AΔB)ΔC = {(A∩~B∩~C)∪(~A∩B∩~C)} ∪ (A∩B∩C)∪(~A∩~B∩C)
根据以上步骤,将B看着C,同理可推得:
(AΔC)ΔB = {(A∩~C∩~B)∪(~A∩C∩~B)} ∪ (A∩C∩B)∪(~A∩~C∩B)
根据结合律:
(AΔC)ΔB = {(A∩~B∩~C)∪(~A∩B∩~C)} ∪ (A∩B∩C)∪(~A∩~B∩C)
∴(AΔB)ΔC = (AΔC)ΔB
点评:该证明过程重点在于将2个类似的式子转化为可用结合律移动位置的中间表达式,从而得证

3、集合的异或运算在计算机中的应用
3.1 证明:当 AΔB = C 时,AΔC = B

即典型的异或运算 A xor B = C,A xor C = B
在编程中常用该可逆运算对数据 B 异或一个常量 A 转换后进行加密保护,当要还原数据B时,再次用 C 异或常量 A 即可得到B

 
注:图1中草绿色部分即为 AΔB = C
    图2中草绿色部分即为 C,三角形区域为 A,AΔC = 仅有草绿色或仅有三角形的区域 = B

证明:
∵AΔB = C
∴C = (A∪B)-(A∩B)
将C代入到AΔC中
AΔC = AΔ[(A∪B)-(A∩B)]
= {A∪[(A∪B)-(A∩B)]} - {A∩[(A∪B)-(A∩B)]}
先处理左边式子
{A∪[(A∪B)-(A∩B)]}
= A∪{(A∪B)∩[~(A∩B)]}
将 (A∪B) 和 [~(A∩B)]看着整体,根据分配律
= [A∪(A∪B)] ∩ {A∪[~(A∩B)]}
= (A∪B) ∩ {A∪[~(A∩B)]}
根据De.morgen定律
= (A∪B) ∩ {A∪[~A∪~B)]}
= (A∪B) ∩ {(A∪~A)∪~B}
= (A∪B) ∩ {E∪~B}
= (A∪B) ∩ E
= (A∪B)

再处理右边式子
{A∩[(A∪B)-(A∩B)]}
= A∩{(A∪B)∩[~(A∩B)]}
= A∩(A∪B)∩[~(A∩B)]
根据吸收律反推
A∩(A∪B) = A
A∩(A∪B)∩[~(A∩B)] = A∩[~(A∩B)]

合并左右式子
AΔC = (A∪B) - {A∩[~(A∩B)]}
将[~(A∩B)]看着整体,根据De.morgen定律
(A∪B) - {A∩[~(A∩B)]} = (A∪B) ∩ {~ {A∩[~(A∩B)]}}
再次根据De.morgen定律
= (A∪B) ∩ {~A∪~[~(A∩B)]}
= (A∪B) ∩ {~A∪(A∩B)}
= (A∪B) ∩ {~A∪(A∩B)}
根据分配律
= (A∪B) ∩ {(~A∪A)∩(~A∪B)}
= (A∪B) ∩ {E∩(~A∪B)}
= (A∪B) ∩ (~A∪B)
根据分配律倒推
= B∪(A∩~A)
= B∪(φ)
= B
∴AΔC = B

3.2 《离散数学及其应用》第6版P83 21 题
证明:当 AΔB = AΔC时,是否有B = C
即如果2个数和同一个常量 A 进行异或后的结果相等,那么这两个数必定相等,这是 ∪∩ 等运算没有的性质

证明:
∵AΔB = AΔC = D
根据上面证明:当 AΔB = D 时,AΔD = B(将上面证明中的C换成D,以免歧义)
同理
∵AΔC = D
∴AΔD = C = B
∴C = B

3.3 《离散数学及其应用》第6版P83 19 题
证明:若A是全集E的子集,则:
a) AΔA= Φ  b) AΔΦ = A
c) AΔE= ~A d) AΔ(~A)= E

a) 证明:
AΔA= (A-A)∪(A-A) = Φ∪Φ = Φ
b) 证明:
AΔΦ = (A∪Φ)-(A∩Φ) = A-Φ = A
c) 证明:
AΔE= (A∪E)-(A∩E) = E-A = ~A
d) 证明:
AΔ(~A)= (A∪~A)-(A∩~A) = E-Φ = E

点评:此4组证明a和b是一组,互为可逆运算,c和d是一组,互为可逆运算,这也是异或运算的重要性质
a) AΔA= Φ 即表示 A xor A = 0
这在汇编中经常用来给寄存器清0操作:xor eax, eax(因为只需要1个字节的命令,其他指令都要2个以上的字节)
c) AΔE= ~A 给出了异或和补集的转换公式,即异或和反码的转换

时间: 2024-08-10 21:25:33

集合的异或运算(对称差)的相关文章

mysql异或运算

异或是一种逻辑运算,运算法则简言之就是:两个条件相同(同真或同假)即为假(0),两个条件不同即为真(1),null与任何条件做异或运算都为null,如果从数学的角度理解就是,空集与任何集合的交集都为空. mysql里异或运算符为^ 或者 xor 两个同为真的条件做异或,结果为假 两个同为假的条件做异或,结果为假 一个条件为真,一个条件为假,结果为真 null与任何条件(真.假.null)做异或,结果都为null 说这么多有什么用呢?遇到一个异或的sql注入,就是用这种方法去判断的...

HDU 5175 Misaki's Kiss again (异或运算,公式变形)

Misaki's Kiss again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 201    Accepted Submission(s): 57 Problem Description After the Ferries Wheel, many friends hope to receive the Misaki's kiss

异或运算的性质及用途

 1.两个数的交换  利用异或运算可以实习一种简单的不使用第三个数的交换方式, 代码如下所示: void swap(int a,int b) { a = a^b; b = a^b; a = a^b; }  原因是:异或运算是它本身的逆运算,故对于两个数或是布尔变量有如下性质: (a XOR b) XOR b = a 补充,异或运算的简单性质: 1. a ⊕ a = 0 2. a ⊕ b = b ⊕ a // 异或运算满足交换律 3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕

异或运算实现加密解密

异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能. 异或运算在java中通常有两个比较常用的方法,一个是两个变量的互换(不借助第三个变量),一个便是数据的简单加密解密. 两个变量的互换 java运算中,如果要交换两变量的值,通常的做法就是借助第三个临时变量,然后完成操作. 如 public static void main(String[] args) { int[] arr =

网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.

本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 关于这个问题,网络上面有很多的解释,3种方法,我这里给比较一下各自的优缺点,然后简单分析一下汇编代码,分析代码如下: #include <stdio.h> void swap1(int &a,int &b) { int temp = a; a = b; b = temp; } void swap2(int &a,int &b) { a += b;

异或运算

将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0:否则为1.

【Luogu】P1681最大正方形2(异或运算,DP)

题目链接 不得不说attack是个天才.读入使用异或运算,令que[i][j]^=(i^j)&1,于是原题目变成了求que数组的最大相同值. 然而我还是不理解为啥,而且就算简化成这样我也不会做. ai,我太菜了. f[i][j]表示考虑到i,j为止的最大值.当que[i][j]=que[i-1][j]=que[i][j-1]=que[i-1][j-1]的时候,f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1. #include<cstdi

FEC之异或运算应用

话说为啥FEC需要异或( ^/⊕ )操作呢? 异或:xor 异或运算规则: 0 xor 0 = 0 0 xor 1 = 1 1 xor 0 = 1 1 xor 1 = 0 异或运算特性: 1). a xor a = 0 2). a xor 0 = a 3). (a xor b) xor c = a xor (b xor c) 4). IF a xor b = c THEN a xor c = b    异或的运算特性有两点很好的应用 查找 case 1: 一个数组,除了其中一个元素,其他元素都为

bzoj4103【THUSC2015】异或运算

4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 359  Solved: 188 [Submit][Status][Discuss] Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij