![](/img/trans.png)
[英]How to solve this linear equation? I have the OpenSolver logic, but can't transpose it in code (Javascript)
[英]bitxor, solve equation, boolean logic
我有等式:
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^b = A^b^b + (2*A)^b^b + (4*A)^b^b = A + 2*A + 4*A
然后
C^C^b = b = C^(A + 2*A + 4*A)
編輯只是為了確保:這個答案是不正確的 。 真可惜 我將不得不考慮更多。
我采用相同的假設: +
和*
是加法和乘法,而忽略了溢出。
這可能是最快的解決方案:預計算結果,並將其存儲在查找表中。 這將需要2 16個字節的內存,即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
的XOR(如果這條語句有點跳躍,我鼓勵您繪制一個真值表,而不僅僅是相信我!)。
之所以起作用,是因為更改某個位只會影響該位的結果,而影響更高的位卻不會影響較低的位(因為當您用筆和紙相加時,進位可能會傳播到左側)。 因此,在最壞的情況下,算法需要進行2次猜測才能獲得最低有效位的正確性,對於第二個lsb進行另一個猜測,對於第三個lsb進行另一個猜測,依此類推,在給定a
和c
任意組合的情況下最多進行9個猜測 。
這是我的測試程序的示例跟蹤:
a: 00001100
c: 01100111
Guess: 01100111
Result: 01000001
Guess: 01000001
Result: 00010111
Guess: 00110001
Result: 01100111
b: 00110001
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.