`

异或运算与尼姆博奕

阅读更多

异或运算

异或运算定义:异或运算方法是一个二进制逻辑运算,设其运算符合为^,a,b为二进制数,则a,b的异或为a^b。

其运算满足如下:1^1=0,0^0=0,1^0=1,0^1=1,即 相同的为0,不相同为1。

a、b按低位到高位进行1位的二进制运算(高位没有则补0)即得a^b的值。

public class Xor {
	public static void main(String[] args) {
		System.out.println(Integer.toBinaryString(34));
		System.out.println(Integer.toBinaryString(23));
		System.out.println(Integer.toBinaryString(34^23));
	}
}

 输出:

100010
  10111
110101

 

异或运算的一些基本性质:

1、交换律:a^b=b^a    (根据定义显然可得)  

2、结合律:a^b^c=a^(b^c)   (根据定义显然可得)  

3、对于任何数a,都有a^a=0,a^0=a(根据定义显然可得)  

3、自反性:  a^b^b=a         (a^b^b=a^(b^b)=a^0=a)

 

 

 

 尼姆博奕(Nim Game):有三堆各若干个物品(显然每堆的物品数大于0),两人轮流从某一堆取任意多的物品,每次最少取一个,不设上限,最后取光者获胜。

(一般谈论这个博弈时,都会先谈到 巴什博奕、威佐夫博弈

设(a,b,c)为三堆石子的个数(a>=0;b>=0;c>=0),先手为 甲;后手为乙。

 

必败局势,一般称为奇异局势,显然(0,0,0)是一个奇异局势(因为谁面对这种局势,都无法做到游戏给出的条件:每次最少取一个)

讨论局势是必败还是必胜,都是相对于首先面对此局势者来说。因此站在甲的角度来讨论。甲面对(0,0,0)必输。

当甲面对(a,a,0),甲每次拿x,乙随后也跟着拿x,因此甲面对的局势始终是(a-x,a-x,0)。因此转化为甲最终都会面对(0,0,0),因此甲必输。

因为游戏是两个人交替进行。由此可得,如果局势(a,b,c)是必胜局势,那么甲就有策略,使得拿走某堆中的x个物品后,一般地设为(a-x,b,c)=(a',b,c)。此时

(a',b,c)就是一个必败的局面。反之,必败的局面可以变为必胜的局面。由此,我们寻找一个函数F,当

F(a,b,c)=1时,称(a,b,c)为必胜局面,F(a,b,c)=0时,称(a,b,c)为必败局面(奇异局势)。

 

更一般地,考虑N>=2堆物品的情况。每堆数量为(a1,a2,...,aN)   (1,2,..,N一般在数学中用下标表示)

定理:(a1,a2,...,aN)为奇异局势当且仅当a1^a2^...^aN=0    

证明:(a1,a2,...,aN)=(0,0,...,0)时显然成立。

            当(a1,a2,...,aN)不为(0,0,...,0)时,若a1^a2^...^aN=k<>0,显然k的最高位为1。

           则一定存在一个ai(1<=i<=N),它在k的最高位的值为1。(若a1,a2,...,aN在k的最高位处都为0,那么异或运算规则,不可能得到k的最高位为1)

            因此,ai^k<ai(因为最高位变为0了)

            设ai'=ai^k,则a1^a2^...^ai'^...^aN=a1^a2^...^ai^...^aN^k (代入ai'=ai^k,并由异或的交换律得到)

                                                              =k^k=0

           因此当a1^a2^...ai^...^aN=k<>0时,存在移动ai->ai' (即移动ai-ai'>0)使得a1^a2^...ai^...^aN=0

 

           若a1^a2^...ai^...^aN=0,则不存在合法移动,使得a1^a2^...ai‘^...^aN=0。

              因为若a1^a2^...ai^...^aN=a1^a2^...ai’^...^aN=0,则两边同时异或a1,可得a2^...ai^...^aN=a2^...ai’^...^aN,

             继续两边异或a3...aN(除了共有的ai,ai'),由此可推出ai=ai'。显然这不是合法的移动。

             由以上证明得出

              1) a1^a2^...ai^...^aN=k<>0,一定存在一步特定移动使得a1^a2^...ai^...^aN=0;

              2) a1^a2^...ai^...^aN=0,不存在一步合法移动使得a1^a2^...ai‘^...^aN再次为0,

                  即当 a1^a2^...ai^...^aN=0时,任意移动一步后都会变为 a1^a2^...ai’^...^aN<>0。

             由1)、2)可得

               3)当a1^a2^...ai^...^aN=0时,下一步必然为a1^a2^...ai’^...^aN<>0,再下一步可以变为a1^a2^...ai’’^...^aN=0。

            必要性:(a1,a2,...,aN)为奇异局势(必败局势),考虑甲先乙后。

              假设a1^a2^...ai^...^aN<>0,那么甲通过移动,可使a1^a2^...ai‘^...^aN=0。如此一直下去,每次乙都只能面对a1^a2^...ai^...^aN=0的局势。

             由于游戏的结束点必然为(0,0,...,0),因此乙最终将面对(0,0,...,0)。在乙面对(0,0,...,0)的上一步,设为(b1,...,bN),此时b1^...^bN<>0。

            但乙最终先面对了(0,0,...,0),显然是甲胜,这与(a1,a2,...,aN)为奇异局势(必败局势,甲必败)矛盾。

            因此必有a1^a2^...ai^...^aN=0。

            充分性:a1^a2^...^aN=0,由3)乙始终有办法让甲面对的局势始终是x1^x2^...^xN=0。因此甲最终面对的必然是(0,0,...,0)的局势,

            而(0,0,...,0)就是个奇异局势。

             证毕。

        

 

 

 

 

 

 

分享到:
评论

相关推荐

    十六进制字符串按位异或运算工具和java位异或运算

    在计算机科学中,十六进制(Hexadecimal)是一种逢16进1的进位制,通常用于表示二进制数据,因为每个十六进制数字可以代表4...通过理解其原理并掌握在Java中的实现方式,我们可以更有效地解决各种与位运算相关的问题。

    在线异或运算.docx

    在线异或运算,也称为BCC(Block Check Character)或息组校验码,是一种简单而有效的错误检测方法,常用于通信和数据存储领域。它通过计算数据块中所有字节的异或值来生成一个校验码,该校验码能够反映出数据中的...

    C/C++十六进制异或运算

    比如简单的凯撒密码,通过一个固定的偏移量与明文异或,可以得到密文,解密时再用相同的偏移量与密文异或,就能恢复原始信息。异或运算是可逆的,这是它在加密中常用的特性。 此外,异或运算也常用于数据校验,如...

    异或运算 进行加密 delphi编写

    异或运算 进行加密 delphi编写异或运算 进行加密 delphi编写异或运算 进行加密 delphi编写异或运算 进行加密 delphi编写异或运算 进行加密 delphi编写异或运算 进行加密 delphi编写异或运算 进行加密 delphi编写异或...

    异或运算小工具

    通过对数据块进行异或运算生成一个校验码,如果接收的数据与发送的数据经过异或后得到的校验码相同,则认为数据传输无误。 “XORTest”可能是这个工具的测试文件,可能包含了一些用于验证工具功能的例子或测试用例...

    异或运算的真值表,例子展示异或运算

    异或运算,也被称为XOR(Exclusive OR)运算,是计算机科学中的一种基本逻辑运算,它在二进制系统中有着广泛的应用。异或运算的基本性质是:如果两个输入位相同,结果为0;如果两个输入位不同,结果为1。这种特性...

    加密解密 (利用异或运算)

    加密解密 (利用异或运算) 进行异或加密解密运算

    m127.rar_位异或_图像异或运算_图像运算_异或_异或运算

    "图像运算"是一个广泛的领域,包含位与、位或、位非以及位异或等多种操作。这些运算在图像处理软件、游戏开发、计算机视觉技术中都有广泛应用。例如,位与运算常用于创建掩码或选择图像的特定区域,位或则用于合并...

    Java异或运算(简单的加密,解密)

    异或运算的一个性质是:任何数与0进行异或运算,结果保持不变;相同的数进行异或运算,结果为0。因此,可以这样交换两个变量`a`和`b`的值: ```java a = a ^ b; // 现在 a 是两者的异或 b = a ^ b; // 现在 b 是 a ...

    XOR.rar_52xor25计算结果_XOR_XOR 8bit 算法_异或运算

    这里的"52xor25计算结果"可能是描述了一个具体的异或操作,即数字52与25进行异或运算的结果。异或两个数字时,会将它们的二进制表示逐位比较并应用异或规则。例如,52(十进制)是00110100(二进制),25(十进制)...

    最新单片机仿真 用P0口显示按位异或运算结果

    最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或运算结果最新单片机仿真 用P0口显示按位异或...

    异或运算与卡诺图的应用

    异或运算在卡诺图中的表示方法,将他们紧密的联系在一起。

    什么是异或运算,异或运算的作用.pdf

    异或运算,也称为XOR,是计算机科学和逻辑运算中的基本操作之一。它在二进制系统中尤其重要,因为它具有独特的性质和多种应用场景。异或运算符通常表示为"^",并且遵循一系列特定的规则。 首先,异或运算的基本定义...

    异或运算加密

    2. **解密过程**:由于异或运算是可逆的,解密过程只需将密文与相同的密钥再次进行异或操作,即可恢复原始明文。公式为:`plaintext = ciphertext XOR key`。 在C#中,可以使用`^`运算符来执行异或操作。例如,如果...

    按位异或校验和计算器.rar_异或_异或在线计算_异或在线运算_按位异或_校验和计算器

    异或(XOR)是一种基本的逻辑运算符,在...总的来说,“按位异或校验和计算器”是一个实用的工具,通过异或运算来检测和验证数据的完整性。在处理大量数据、确保数据传输准确无误的环境中,这样的工具是非常有价值的。

    基于BP网络的异或运算多阈值神经元的实现

    #### BP网络与异或运算 BP网络是一种多层前馈神经网络,它通过反向传播算法来调整网络中的权重,从而最小化网络输出与期望输出之间的误差。异或运算是一个经典的二进制布尔函数,其特点是当两个输入不同时结果为真...

    异或运算加密(Delphi)

    异或运算加密(Delphi) 一个Delphi写的异或加密解密工具

    奇偶效验方法,奇偶校验的基本运算是异或运算。

    奇偶校验的基本运算是异或运算(XOR)。利用这个原理,可以设计出奇偶校验电路。 **函数F的逻辑功能:** 设有n个输入变量\( X_1,X_2,\ldots,X_n \),则函数\( F=X_1\oplus X_2\oplus\ldots\oplus X_n \)的逻辑功能...

    什么是异或运算,异或运算的作用参考.doc

    异或运算,也称为XOR(Exclusive OR),是计算机科学中的基本逻辑运算之一。它具有以下特点:当两个输入位相同,结果为0;当两个输入位不同,结果为1。这种运算在数字电路和编程中都有广泛的应用。 在描述中提到的...

    C++异或运算的介绍及使用

    例如,二进制数101(5)和011(3)进行异或运算,其结果为110(6),因为1与0异或得1,0与1异或得1,而0与0异或得0。 2. **基本性质**: - **零的异或特性**:任何数与0进行异或运算,结果都等于这个数本身。例如...

Global site tag (gtag.js) - Google Analytics