免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3562 | 回复: 19
打印 上一主题 下一主题

[算法] 数学问题紧急求助!!!!(新的问题在15楼) [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-05 20:56 |只看该作者 |倒序浏览
本帖最后由 noword2k 于 2013-02-06 14:35 编辑

已知

  1. (X^0xa9)%0x53 = 0x11
  2. (X^0x56)%0x53 = 0x1f
复制代码
怎么快速求出X的最小值(^为异或, %为取余数)。

论坛徽章:
0
2 [报告]
发表于 2013-02-06 01:10 |只看该作者
本帖最后由 hbmhalley 于 2013-02-06 01:27 编辑
  1. 首先观察 #xa9 #x56
  2. #xa9 = #b10101001
  3. #x56 = #b01010110
  4. 即 #xa9 ^ #x56 = #xff

  5. 由异或运算性质,原式可写为
  6. (X + c7 + c5 + c3 + c0) % #x53 = #x11
  7. (X + c6 + c4 + c2 + c1) % #x53 = #x1f
  8. 其中 ci = 2^i * (-1或1)
  9. 原因是:
  10. 若 X 第 i 位为 0,则 X ^ |ci| == X + |ci| 否则
  11. 若 X 第 i 位为 1,则 X ^ |ci| == X - |ci|

  12. 下式减上式得

  13. (-c7 +c6 -c5 + c4 -c3 +c2 +c1 -c0) % #x53 = #x0e

  14. 由于 (-c7 +c6 -c5 + c4 -c3 +c2 +c1 -c0) 必为奇数且属于 (-2^8,+2^8)
  15. 可得只有三种可能,(#x0e + #x53) (#x0e - #x53) (#x0e - 3*#x53)
  16. 即 #x61 -#x45 -#xeb
  17. 而通过 (-c7+c6...-c0),可以唯一确定 (c7..c0) 从而唯一确定 X 后 8 位

  18. 以 #x61为例:
  19. #x61 = #b01100001
  20. 现在需要将此 01 二进制数转换为 (-1/1)“二进制”数
  21. 由 2^k - 2^(k-1) - (2^k-2) - ... - 2^0 = 1,可得如下构造方法:
  22. 将每段 000...001 改为 1 -1 -1 ... -1

  23. 0    1    1    0    0    0    0    1 =
  24. 1    -1   1    1    -1   -1   -1   1        ,分别对应
  25. -c7  c6   -c5  c4   -c3  c2   c1   -c0

  26. 可得 (c7..c0) = (-1,-1,-1,1,1,-1,-1,-1) ,即 X 后 8 位为 #b11100111
  27. ps: 由归纳法可知对应(-1/1)串的唯一性,其证明过程与构造过程类似
  28. 同理,-#x45 -#xeb 分别对应可能的 X 后 8 位为 #b00001011 与 #b01011100
  29. 即,三个可能的后 8 位为:#xe7 #x0b #x5c

  30. 已知后 8 位,下求前若干位
  31. 设 X = Y * 2^8 + Z,其中 Z = #xe7/#x0b/#x5c

  32. X ^ #xa9 = X + C = Y * 2^8 + Z + C
  33. 其中 C 为 Z 对应的 (c7,0,c5,0,c3,0,0,c0) ,例如
  34. Z=#xe7 时 C = (-1, 0,  -1, 0,  1,  0,  0,  -1) =-#x99
  35. Z=#x0b 时 C = (1,  0,  1,  0,  -1, 0,  0,  -1) = #x97
  36. Z=#x5c 时 C = (1,  0,  1,  0,  -1, 0,  0,  1 ) = #x99

  37.      (X ^ #xa9) % #x53 = #x11
  38. (Y*2^8 + Z + C) % #x53 = #x11
  39.         (Y*2^8) % #x53 = (#x11 - Z - C) % #x53
  40.           Y = Y % #x53 = (#x11 - Z - C) * (1/2^8) % #x53

  41. 其中 1/2^8 = (2^8) ^ (#x53 - 2) % #x53 = #x0c

  42. 将三个对应 X = Y*2^8 + Z 算出后取最小值即可

  43. 懒得算了 无责任无脑练手代码一份 未验证 正确率不超过 2.71828%
  44. (let*
  45.   ((Z '(#x73, #x0b, #x5c))
  46.    (C '(#x-99, #x97, #x99))
  47.    (Y (let ((y (lambda (z c)
  48.                  (let ((t (remainder
  49.                             (* (- #x11 z c) #x0c)
  50.                             #x53)))
  51.                       (if (< t 0) (+ t #x53) t)))))
  52.            (map y Z C))
  53.    (X (let ((x (lambda (y z)
  54.                  (+ (* y #x100) z))))
  55.            (map x Y Z)))
  56.   (min X))
复制代码

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2013-02-06 07:36 |只看该作者
@hbmhalley
so complex?

i just think it will be
(n *0x53 + 0x11) ^0xa9, n=0,1,2, ...

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
4 [报告]
发表于 2013-02-06 08:42 |只看该作者
folklore 发表于 2013-02-06 07:36
(n *0x53 + 0x11) ^0xa9, n=0,1,2, ...


你的意思是
由 (X^0xa9)%0x53 = 0x11 推导出 X = (n*0x53+0x11)^0xa9
然后遍历出一切X,再代入到 X = (y*0x53+0x1f)^0x56 中验证

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2013-02-06 10:09 |只看该作者
X = (0x300 + n*0x5300) + ( 0xe6 或 0x0b 或 0x5c ), n = 0, 1, 2, 3, ……
最小的X是 0x30b

论坛徽章:
0
6 [报告]
发表于 2013-02-06 12:04 |只看该作者
回复 3# folklore


    没错
    但 lz 不是说快速么
    这样不好估计 n 有多大
    但利用 #xa9 和 #x56 的特点可以把计算量控制在有限个

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
7 [报告]
发表于 2013-02-06 12:14 |只看该作者
hbmhalley 发表于 2013-02-06 12:04
回复 3# folklore
这样不好估计 n 有多大

可以的,因为 (n *0x53 + 0x11) ^0xa9 中 ^0xa9 只影响到最后一个字节,所以对于 m?? 和 n??,如果m大于n,则m??^0xa9一样大于n??^0xa9

论坛徽章:
0
8 [报告]
发表于 2013-02-06 12:47 |只看该作者
回复 7# bruceteen


    不懂 ...
bruceteen 发表于 2013-02-06 08:42
你的意思是
由 (X^0xa9)%0x53 = 0x11 推导出 X = (n*0x53+0x11)^0xa9
然后遍历出一切X,再代入到 X = (y*0x53+0x1f)^0x56 中验证

    这个 n 该怎么找?

    & 你的后1byte是怎么找的?

论坛徽章:
0
9 [报告]
发表于 2013-02-06 13:00 |只看该作者
同问

想到的方法和2楼差不多,
利用余运算,先减了求低8位(有限几个),再加了求高8位,
看5楼答案的结构也是这样的啊,

但是想不通3楼怎么到5楼的...
3楼看起来像完全穷举。

论坛徽章:
0
10 [报告]
发表于 2013-02-06 13:12 |只看该作者
回复 9# sacry


    有一个问题
    0xe6 ^ 0xa9  ==  0x0b ^ 0xa9 == 0x5c ^ 0xa9 (mod 0x53)
    0xe6 ^ 0x56  ==  0x0b ^ 0x56 == 0x5c ^ 0x56 (mod 0x53)
    这是偶然吗? 如果不是,那就是我想错了 ..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP