能力值:
( LV9,RANK:170 )
2 楼
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;
用汇编写速度或许更快些. 假如能搜索值就不会出现死循环,否则会死循环的.
能力值:
( LV12,RANK:730 )
3 楼
分析如下:
原式(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值,程序求解一元二次方程应该很快。
以上分析没经过验证,不知可不可行?
能力值:
( LV4,RANK:50 )
4 楼
原式中的“8位”是指8位16进制数,是否准确的应写为:
((X-0xFFFFFFFF)*X)&0xFFFFFFFF+X&0xFF23301+((X*0xBA2E8BA3)>>8)/8=0xA68E1838
本式涉及大整数乘法。是否只能用穷举法求X?
能力值:
( LV2,RANK:10 )
5 楼
最初由 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 ?
能力值:
( LV4,RANK:50 )
6 楼
最初由 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。
能力值:
( LV2,RANK:10 )
7 楼
在64bite 下可以运行吗?