首页
社区
课程
招聘
[旧帖] [原创]大整数除法新算法(吐血发布) 0.00雪花
发表于: 2011-12-21 01:04 1943

[旧帖] [原创]大整数除法新算法(吐血发布) 0.00雪花

2011-12-21 01:04
1943
摘自:越快越密网站中的《时间复杂度取决于大整数乘法的大整数除法》一个片断

下面用近似C++语言的伪码将这种方法写出来:
BigDivision(A, B, C )           //调用时A, B,都是大整数对象,分别对应被除数、除
{        //数、应在A前面至少预留1位空间,如果会出现A.Length==1,则A后面至
//少预留1位空间,如果会出现B.Length==1,则B后面也至少预留1位空间,
//并将预留空间归0,计算完成之后,结束时模余在A中,商数的整数部分在C中,//当然应用时这些参数可能就是一个整数类型或字符串类型的数组或指针,
i=A.Length;     //得到A长度
if(B.Length<=0||i<=0) return 0  //非法返回0         
pCWorkFinger=C.pfinger+i- B.Length;     
A2.pA2finger=A.pfinger+i-2;
AC.pfinger = A.pfinger+i-B.Length;  //AC就是指当前A中处于工作状态的数据
while(AC.pfinger>= A.pfinger)      
{     
   C1=*(( unsigned CPUInteger *)A2.pfinger)/B1 ;   
//其中unsigned CPUInteger *表示在计算机中CPU带宽无符号整数类型的数据,
//如在64比特计算机用*(unsigned _int64*(A2.pfinger))获取(A1*h+A2)
Y=*(( unsigned CPUInteger *)A2.pfinger)- C1*B1 ;   
Y=<<(U/2) ;// U 为CPU带宽值,如在64比特计算机中U==64
Y+= *( A2.pfinger-1) ;   // 即 Y+= A3 ;
       X= B2*C1
if(X> Y)  //这是由于C1大于正确值
{
      X= X-Y;//此时 X==C1 (B1h+B2)- (A1h2+A2h1+A3)
      C1= C1- X/(B1h+B2);//这行和下面一行扣除C1超出部分,
      if(X%(B1*h+B2))  C1= C1-1;
}
AC=AC -B*C1 ;  //计算A=A-B*C1hk-1 ;
   if(AC <0)       //即if(A<0)
{         
AC = AC+B ;   //计算A=A+Bhk-1 ;
C1=C1-1;   
}  
*pCWorkFinger=C1 ;
pCWorkFinger-=1;//每循环一次pCWorkFinger就在C上向低端滑动一个基数位
A2.pfinger -=1;    //每循环一次A2就就在A上向低端滑动一个基数位
AC.pfinger -=1;    //每循环一次AC就在A上向低端滑动一个基数位
}
}        
当将上述BigDivision单独作为一个大整数除法时已经比现有大整数除法更有效率,因此上面SuperDivision_Core函数(指SuperDivision_Core_0和SuperDivision_Core_1)中的MinDivision函数最好使用BigDivision函数中的算法,即使用BigDivision函数中的算法来计算高位商数,当然不排除MinDivision函数使用其他常规大整数除法的算法。

其他算法涉及繁琐的推理过程,导致文件达到342KB,因此这里实在放不下,如果你要了解另一个大整数除法就自己到越快越密网站去下载吧

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 87
活跃值: (25)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
先抢个沙发 留着以后看
2011-12-21 09:27
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哪个说除法是现有除法的30倍。而我知道现有除法只是乘法的2-3倍,你这个算法是不是比乘法快10倍?
2011-12-21 15:37
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来你不知道在现有大整数除法运算的现状(不含本人的算法):现有的大整数除法比大整数除法的算法落后很多,现在有很多快速运算的大整数乘法,但却没有一个能摆脱时间复杂度为:T(n) = O(n^2)的大整数的除法。为说明情况这里首先设定一个大整数乘法为L X L的大数运算,即被乘数和乘数都是L个4字节,一个大整数除法为2L / L的大数运算,即被除数是2L个4字节和除数是L个4字节,当L<=64个4字节是,现有大整数除法所耗费的时间约是大整数乘法的2倍以上,不会出现10倍以上的情况,但随着L的变大,由于大整数除法没有快速运算方法,导致大整数除法所耗费的时间与大整数乘法所耗费的时间的比值变得很大,例如 L=2097152个四字节时,大整数除法所耗费的时间与大整数乘法所耗费的时间的比值达到上百倍,本人文中一共提供了两个新的大整数除法,一个是适用范围是L<=64,另一个是适用L〉64超大的整数除法运算,在L〉64超大的整数除法运算中充分利用现有的大整数乘法,使他的时间复杂度也降低为T(n) = O(nlog2   3),这就使该算法的运算效率大幅提高,因此文中所言,并无不妥。
2011-12-22 03:20
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个大整数除法确实是大整数除法运算上的突破,从逻辑分析上来讲,是一个不错的算法,有人测试没有?
2011-12-22 20:28
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
如 L=2097152个四字节时, L*四个字节=大约需要25毫秒,那么L*L=2097152*25/3600000=大约需要14个小时才能完成,请问你试过了吗?
2011-12-23 02:56
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我已用另个大整数除法(这里没公开,这里公开的只是一个适合64四字节除以32四字节的大整数除法) 测试过,只需要,20几分钟.
2011-12-24 11:54
0
游客
登录 | 注册 方可回帖
返回
//