- 论坛徽章:
- 0
|
本帖最后由 hbmhalley 于 2013-02-06 01:27 编辑
- 首先观察 #xa9 #x56
- #xa9 = #b10101001
- #x56 = #b01010110
- 即 #xa9 ^ #x56 = #xff
- 由异或运算性质,原式可写为
- (X + c7 + c5 + c3 + c0) % #x53 = #x11
- (X + c6 + c4 + c2 + c1) % #x53 = #x1f
- 其中 ci = 2^i * (-1或1)
- 原因是:
- 若 X 第 i 位为 0,则 X ^ |ci| == X + |ci| 否则
- 若 X 第 i 位为 1,则 X ^ |ci| == X - |ci|
- 下式减上式得
- (-c7 +c6 -c5 + c4 -c3 +c2 +c1 -c0) % #x53 = #x0e
- 由于 (-c7 +c6 -c5 + c4 -c3 +c2 +c1 -c0) 必为奇数且属于 (-2^8,+2^8)
- 可得只有三种可能,(#x0e + #x53) (#x0e - #x53) (#x0e - 3*#x53)
- 即 #x61 -#x45 -#xeb
- 而通过 (-c7+c6...-c0),可以唯一确定 (c7..c0) 从而唯一确定 X 后 8 位
- 以 #x61为例:
- #x61 = #b01100001
- 现在需要将此 01 二进制数转换为 (-1/1)“二进制”数
- 由 2^k - 2^(k-1) - (2^k-2) - ... - 2^0 = 1,可得如下构造方法:
- 将每段 000...001 改为 1 -1 -1 ... -1
- 即
- 0 1 1 0 0 0 0 1 =
- 1 -1 1 1 -1 -1 -1 1 ,分别对应
- -c7 c6 -c5 c4 -c3 c2 c1 -c0
- 可得 (c7..c0) = (-1,-1,-1,1,1,-1,-1,-1) ,即 X 后 8 位为 #b11100111
- ps: 由归纳法可知对应(-1/1)串的唯一性,其证明过程与构造过程类似
- 同理,-#x45 -#xeb 分别对应可能的 X 后 8 位为 #b00001011 与 #b01011100
- 即,三个可能的后 8 位为:#xe7 #x0b #x5c
- 已知后 8 位,下求前若干位
- 设 X = Y * 2^8 + Z,其中 Z = #xe7/#x0b/#x5c
- X ^ #xa9 = X + C = Y * 2^8 + Z + C
- 其中 C 为 Z 对应的 (c7,0,c5,0,c3,0,0,c0) ,例如
- Z=#xe7 时 C = (-1, 0, -1, 0, 1, 0, 0, -1) =-#x99
- Z=#x0b 时 C = (1, 0, 1, 0, -1, 0, 0, -1) = #x97
- Z=#x5c 时 C = (1, 0, 1, 0, -1, 0, 0, 1 ) = #x99
- (X ^ #xa9) % #x53 = #x11
- (Y*2^8 + Z + C) % #x53 = #x11
- (Y*2^8) % #x53 = (#x11 - Z - C) % #x53
- Y = Y % #x53 = (#x11 - Z - C) * (1/2^8) % #x53
- 其中 1/2^8 = (2^8) ^ (#x53 - 2) % #x53 = #x0c
- 将三个对应 X = Y*2^8 + Z 算出后取最小值即可
- 懒得算了 无责任无脑练手代码一份 未验证 正确率不超过 2.71828%
- (let*
- ((Z '(#x73, #x0b, #x5c))
- (C '(#x-99, #x97, #x99))
- (Y (let ((y (lambda (z c)
- (let ((t (remainder
- (* (- #x11 z c) #x0c)
- #x53)))
- (if (< t 0) (+ t #x53) t)))))
- (map y Z C))
- (X (let ((x (lambda (y z)
- (+ (* y #x100) z))))
- (map x Y Z)))
- (min X))
复制代码 |
|