首页
社区
课程
招聘
如何编程实现如下算法
2006-6-21 09:00 5349

如何编程实现如下算法

2006-6-21 09:00
5349
在C++中如何编程实现如下算法,求出X
(X-0xFFFFFFFF)*X的低8位+X.and.0xFF23301+(X*0xBA2E8BA3的高8位)/8=0xA68E1838

请指教,多谢。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2006-6-21 20:11
2
0
var
  longint x,J;
begin
x:=0;
j:=0;
while (j<>$A68E1838) do
begin
  j:=(x-$FFFFFFFF) * (x and $FFFF);  //是否可以优化成(X+1)*(x and $FFFF)
  j:=j+(X and $FF23301);
  j:=j+(X * (($BA2E8BA3 and $FFFF0000)shr 16)) div 8;
  inc(X);
end;

  edit1.text:=inttoStr(X-1);
end;

用汇编写速度或许更快些.

假如能搜索值就不会出现死循环,否则会死循环的.
雪    币: 342
活跃值: (21)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
月中人 18 2006-6-21 22:19
3
0
分析如下:
原式(X-0xFFFFFFFF)*X的低8位+X.and.0xFF23301+(X*0xBA2E8BA3的高8位)/8=0xA68E1838
先做公式化简
令b=0xBA2E8BA3的高8位/8,c=0xA68E1838,p=2的24次方的倒数,原式变
得(X+1)*(X*p)+X&0xFF23301+(X*b)=c
因为X&0xFF23301的结果只有不多的可能性,暂作为一个常数M移到右边
得(X+1)*(X*p)+(X*b)=c-M
展开(X*X*p)+(X*p)+(X*b)=c-M
令t=p+b
得(X*X*p)+X*t=c-M
如果M是一常数,上式就是一个一元二次方程。

由于设M=X&0xFF23301,因为高8位全1因此需要穷举256种可能,而低24位23301(即00100011001100000001)仅6位1只需要穷举64种组合,因此M要穷举256*64=16384种可能的值代入方程。
穷举16384个不同M值,程序求解一元二次方程应该很快。
以上分析没经过验证,不知可不可行?
雪    币: 226
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhy_qie 1 2006-6-22 10:09
4
0
原式中的“8位”是指8位16进制数,是否准确的应写为:
((X-0xFFFFFFFF)*X)&0xFFFFFFFF+X&0xFF23301+((X*0xBA2E8BA3)>>8)/8=0xA68E1838
本式涉及大整数乘法。是否只能用穷举法求X?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
memxie 2006-6-22 16:34
5
0
最初由 zhy_qie 发布
原式中的“8位”是指8位16进制数,是否准确的应写为:
((X-0xFFFFFFFF)*X)&0xFFFFFFFF+X&0xFF23301+((X*0xBA2E8BA3)>>8)/8=0xA68E1838
本式涉及大整数乘法。是否只能用穷举法求X?


你似乎始剿?有很精催的定出呃?式子
如果你的"八位"的意思是相同的
那?,(X*0xBA2E8BA3)>> 8 是否??是 (X*0xBA2E8BA3)>> 32
而 X 本身又是什?大小?
32 bits or 64 bits ?
signed or unsigned ?
雪    币: 226
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhy_qie 1 2006-6-23 16:40
6
0
最初由 memxie 发布
你似乎始剿?有很精催的定出呃?式子
如果你的"八位"的意思是相同的
那?,(X*0xBA2E8BA3)>> 8 是否??是 (X*0xBA2E8BA3)>> 32
而 X 本身又是什?大小?
32 bits or 64 bits ?
........


不好意思,8位意思相同,正确的式子应为:((X-0xFFFFFFFF)*X)&0xFFFFFFFF+X&0xFF23301+((X*0xBA2E8BA3)>>32)/8=0xA68E1838

X是一软件的注册算法的注册码,是32bits。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
skierhood 2006-6-23 22:44
7
0
在64bite 下可以运行吗?
游客
登录 | 注册 方可回帖
返回