Math 位异或,解方程,布尔逻辑

Math 位异或,解方程,布尔逻辑,math,logic,bit-manipulation,equation,Math,Logic,Bit Manipulation,Equation,我有一个等式: C = A^b + (2*A)^b + (4*A)^b. 其中C和A已知,但b未知。如何找到b? 所有数字都是8位字节。有没有比暴力更快的方法?符号+是否表示字节加法和*多重处理,溢出位被丢弃?如果是的话,我想答案是 b = C ^ (A + 2 * A + 4* A) 如何得出这一结论: C = A^b + (2*A)^b + (4*A)^b 因此 然后 编辑以确保:此答案不正确。我真丢脸。我得多考虑一下 我采用相同的假设:+和*是忽略溢出的加法和乘法 查表 这可能是

我有一个等式:

C = A^b + (2*A)^b + (4*A)^b.  
其中C和A已知,但b未知。如何找到b?
所有数字都是8位字节。有没有比暴力更快的方法?

符号+是否表示字节加法和*多重处理,溢出位被丢弃?如果是的话,我想答案是

b = C ^ (A + 2 * A + 4* A)
如何得出这一结论:

C = A^b + (2*A)^b + (4*A)^b
因此

然后

编辑以确保:此答案不正确。我真丢脸。我得多考虑一下

我采用相同的假设:
+
*
是忽略溢出的加法和乘法

查表 这可能是最快的解决方案:预计算结果,并将其存储在查找表中。它需要216字节的内存,即64 kB

猜测、检查、改进方法 以类C族伪代码表示:

byte Solve(byte a, byte c){
    byte guess = lastGuess = result = lastResult = 0;

    do {
        guess = lastGuess ^ lastResult ^ c;            //see explanation below
        result = a^guess + (2*a)^guess + (4*a)^guess; 
        lastGuess = guess;
        lastResult = result;
    } while (result != c);

    return guess;
}
该算法的思想是,它猜测
b
是什么,然后将其插入公式中以获得一个暂定结果,并将其与
c
进行对比检查。猜测中导致结果与
c
不同的任何位都将更改。这对应于最后一个猜测、最后一个结果和
c
的异或(如果这个语句有点跳跃,我建议您绘制一个真值表,而不仅仅是相信我的话!)

解释 这是因为更改位只会影响该位的结果,以及更重要的位,而不会影响较低的位(因为当您使用笔和纸进行加法时,进位可能会传播到左侧)。因此,在最坏的情况下,算法需要两次猜测以获得最低有效位正确,第二个lsb需要另一次猜测,第三个lsb需要另一次猜测,等等。如果
a
c
的任意组合,则最多需要9次猜测

下面是我的测试程序中的跟踪示例:

a: 00001100
c: 01100111

Guess:  01100111
Result: 01000001
Guess:  01000001
Result: 00010111
Guess:  00110001
Result: 01100111

b: 00110001

那么“*”应该是什么?整数乘法?第一步是不正确的,XOR不分布在二进制加法上。例如,以A=0x00,C=0x01为例,实际答案是b=0xAB。@DPenner:你说得对。胡扯!我想我已经检查过了,但显然还不够好。
byte Solve(byte a, byte c){
    byte guess = lastGuess = result = lastResult = 0;

    do {
        guess = lastGuess ^ lastResult ^ c;            //see explanation below
        result = a^guess + (2*a)^guess + (4*a)^guess; 
        lastGuess = guess;
        lastResult = result;
    } while (result != c);

    return guess;
}
a: 00001100
c: 01100111

Guess:  01100111
Result: 01000001
Guess:  01000001
Result: 00010111
Guess:  00110001
Result: 01100111

b: 00110001