免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: noword2k
打印 上一主题 下一主题

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

论坛徽章:
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
11 [报告]
发表于 2013-02-06 13:14 |只看该作者
用程序遍历求解:
  1. #include <stdio.h>
  2. #include <limits.h>

  3. int main()
  4. {
  5.     unsigned MinX = UINT_MAX;
  6.     for( unsigned n=0; ; ++n )
  7.     {
  8.         unsigned X = (n*0x53+0x11)^0xa9;
  9.         if( X<MinX && (X^0x56)%0x53==0x1f )
  10.             MinX = X;

  11.         if( MinX!=UINT_MAX && (X|0xFF)>(MinX|0xFF) ) // 已经找到符合条件的数,且其后因为X的高位必大于MinX的高位,,所以不需要再找了
  12.             break;
  13.     }
  14.     printf( "MinX = %x\n", MinX );

  15.     return 0;
  16. }
复制代码

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


    ............. 所以那个式子是找规律找出来的..?

论坛徽章:
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
13 [报告]
发表于 2013-02-06 13:40 |只看该作者
hbmhalley 发表于 2013-02-06 13:17
回复 11# bruceteen
............. 所以那个式子是找规律找出来的..?

嘿嘿,是的

论坛徽章:
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
14 [报告]
发表于 2013-02-06 14:16 |只看该作者
** vb,

such as fomula, it is easy to see that n <0x53 (0x53 =lcm(0x53,0x53)), and it not cost so much .
(it there are no answer below n<0x53, then the question is no solution.

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
15 [报告]
发表于 2013-02-06 14:34 |只看该作者
本帖最后由 noword2k 于 2013-02-06 14:35 编辑

这个问题是在跟踪某游戏字库时碰到的。

这个字库使用这样的结构:
字符的信息放在一个结构数组内(A),经过观察发现,该数组的个数补足到了最小的质数(total_size)。

然后用一个同样大小的,存放32位整数的数组(B),来得到字符所在的结构数组(数组A)的位置。

如想得到某字符(unichr)在数组A的位置,可用     
(B[ unichr % total_size ] ^ unichr )% total_size
来得到。

示例(用了一个比较小的字库,仅有一些数字和符号):
数组A(仅列出字符内码):
0 0034
1 0035
2 0037
3 0036
4 0038
5 0039
6 002f
7 0030
8 0031
9 0032
a 0033
b 002f
c ffff

数组B:
0 00000034
1 00000034
2 dca345ea
3 00000035
4 0000003c
5 0000003c
6 00000000
7 00000000
8 00000029
9 00000037
a 00000039
b 0000003b
c 00000039

这里的数组大小是13 (0xD)
如想得到utf16字符u"3"(0x33),则
(B[ 0x33%0xD] ^ 0x33) % 0xD = 0xA。

字符0x36和0xFFFF 与 0xD取余数后,都是指向了B[2] ==> 0xdca345ea
(0xdca345ea ^ 0x36) % 0xd = 3
(0xdca345ea ^ 0xFFFF) % 0xd = 0xC

问题是生成这个数组B时,是如何解决冲突的,这个神奇的0xdca345ea是怎么算出来的呢?

论坛徽章:
0
16 [报告]
发表于 2013-02-06 15:23 |只看该作者
回复 15# noword2k

早这么说啊,我就不花脑细胞去想了。。。
之前想到的分别求高低位,是基于你那个例子里a9/56巧合的。
#A XOR B = FF,  (X XOR A) ± (X XOR B)刚好能分别消掉高位和低位。

现在这个就完全没头绪了,
扫上两眼觉得和给我几对公私钥让我推导出RSA算法一个难度的 ╮(╯_╰)╭

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
17 [报告]
发表于 2013-02-06 15:28 |只看该作者
本帖最后由 一介村夫 于 2013-02-06 15:31 编辑

设X = a * 0x100 + b,0 <= b <= 0xff。
(X^0xa9)%0x53 = 0x11
(X^0x56)%0x53 = 0x1f
即:
( ( a * 0x100 + b ) ^ 0xa9 ) % 0x53 = 0x11
( ( a * 0x100 + b ) ^ 0x56 ) % 0x53 = 0x1f
因为:0xa9 + 0x56 = 0xff,所以两式相加并简化得:
( 2 * a * 0x100 + 0xff ) % 0x53 = 0x30
因为:0xff % 0x53 = 0x6,所以:( 2 * a * 0x7 ) % 0x53 = 0x2A,0x2A / 0x7 = 6,所以 a 的最小值为 3。3 * 0x100 % 0x53 = 0x15。
考虑:( 0x15 + b ^ 0xa9 ) % 0x53 = 0x11,即:( b ^ 0xa9 ) % 0x53 = 0x4f,得到:( b ^ 0xa9 ) = 0x4f 或 0xa2 或 0xf5,即:b = 0xe7 或 0xb 或 0x5c。
结论:X 最小值为 0x30b

论坛徽章:
0
18 [报告]
发表于 2013-02-06 16:00 |只看该作者
回复 17# 一介村夫

( ( a * 0x100 + b ) ^ 0xa9 ) % 0x53 = 0x11
( ( a * 0x100 + b ) ^ 0x56 ) % 0x53 = 0x1f
因为:0xa9 + 0x56 = 0xff,所以两式相加并简化得:
( 2 * a * 0x100 + 0xff ) % 0x53 = 0x30


这一步怎么化简的...

其实更想问第一句
设X = a * 0x100 + b,0 <= b <= 0xff。

怎么想到的?
感觉这是破题关键啊,顺着推下去很清爽。

我是不问三七二十一先模运算相加相减,
然后XOR转成十进制的Σ表示死算...

论坛徽章:
24
金牛座
日期:2013-10-18 21:35:56综合交流区版块每日发帖之星
日期:2015-08-15 06:20:00综合交流区版块每日发帖之星
日期:2015-09-30 06:20:00综合交流区版块每日发帖之星
日期:2015-10-16 06:20:03每日论坛发贴之星
日期:2015-10-16 06:20:03综合交流区版块每日发帖之星
日期:2015-10-24 06:20:00IT运维版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之天津
日期:2016-02-25 16:28:04综合交流区版块每日发帖之星
日期:2016-06-12 06:20:00每日论坛发贴之星
日期:2016-06-12 06:20:00综合交流区版块每日发帖之星
日期:2016-06-13 06:20:00综合交流区版块每日发帖之星
日期:2015-06-22 22:20:00
19 [报告]
发表于 2013-02-06 16:25 |只看该作者
sacry 发表于 2013-02-06 16:00
回复 17# 一介村夫

( b ^ 0xa9 ) + ( b ^0x56 ) = 0xff。

论坛徽章:
0
20 [报告]
发表于 2013-03-04 15:26 |只看该作者
/* only 0x00 ~ 0xFF, why not a loop ? */
for (int X=0; X <=0xFF; ++X)
    ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP