背景
如果您进行大量代码打高尔夫球,则可能会意识到按位XOR操作。给定两个整数,它给出1
两个输入不同的位中带有s的另一个整数。因此,例如1010 XOR 0011 = 1001
。
事实证明,它在博弈论中非常有用,在游戏理论中,它被称为“零和”。如果你有两场比赛的总和(也就是,你让在一场比赛中同时移动),该值的位置是在每个单独的游戏的位置值的NIM总和。
但是我们可以更进一步。使用nim加法和适当的nim乘法定义,我们可以从非负整数形成一个字段。因此,挑战在于高尔夫nim乘法。
定义
Nim乘法遵循以下规则:
Fermat 2次方n =(2 ^(2 ^ k))且任何较小数字的nim乘积为普通乘积。
费马2幂n的尼姆乘积本身为3n / 2。
尼姆乘法分布在尼姆加法上。
Nim乘法是可交换的和关联的(如nim加法)。
乘法身份为1(加性身份为0)。
可以将任何非负整数表示为2的不同幂的nim和,并且可以将2的任意幂作为不同的Fermat数的乘积,因此这足以为所有非负整数定义nim乘法。
例
那都是非常抽象的,所以让我们来看一个例子。我将+
用来表示nim加法(XOR)和*
nim乘法。
6 * 13
= (4 + 2) * (8 + 4 + 1)
= (4 + 2) * ((4 * 2) + 4 + 1)
= (4 * 4 * 2) + (4 * 2 * 2) + (4 * 4) + (4 * 2) + (4 * 1) + (2 * 1)
= (6 * 2) + (4 * 3) + 6 + 8 + 4 + 2
= ((4 + 2) * 2) + 12 + 6 + 8 + 4 + 2
= (4 * 2) + (2 * 2) + 12 + 6 + 8 + 4 + 2
= 8 + 3 + 12 + 6 + 8 + 4 + 2
= 15
其他测试用例
4, 4 -> 6
4, 3 -> 12
4, 7 -> 10
2, 4 -> 8
2, 3 -> 1
1, 42 -> 42
挑战
编写一个程序或函数,以任意方便的形式给出两个非负整数,以计算它们的nim乘积。
这是代码高尔夫球,因此最短的提交将获胜。