最快的开方算法(中值定理法)

http://nc965.bokee.com/viewdiary.14299837.html

关键词:最快 开平方根 算法 中值定理 开方

 

整数平方数中值定理

abc为顺序排列间距为P3个整数,ABC是它们的平方

则有:b2=(a 2c2)/2R,即:B=(AC)/2R

其中:修正值RP2

特别地,如果间隔P12 4 8 16…2 n (Pn=2Pn-1)时

则:        修正值R141664256…22n (Rn4Rn-1

 

证明

已知:abPcbP

有:a 2=(bP2b22PbP2c2=(bP2b22PbP2

则:a2c22b22P2

即:b2=(a2c2)/2P2

特别地

当:间隔      P2 n2*2 n -12 Pn-1时(n为自然数)

则:修正值 RP222n=(2 Pn-124P n-124Rn-1

(证明完)

 

根据以上定理,可以实现整数快速开平方根计算:

先构建一个长度为N的数组1

——————————————————————

数组长 N=Ni+1   1    2    3     4      5  …
       间隔 P=2Pi   2    4    8    16     32  …
     修正值 R=4Ri   4   16   64   256   1024  …

——————————————————————

以及一个对应2PN(这里N=42PN=32)的典型数和它的平方数组2

  ———————————————————————————————————

  按P=16间隔

  排列的数d=di+2PN   32    64    96    128   160    192    224    256

  该数的平方  D=d2 1024  4096  9216  16384  5600  36864  50176  65536

 

  显然,N值越大则数组2越小、程序代码效率越高、耗时(插值次数)越多。

 

2字节整数开方为例的计算流程如下:

其中,被开方数D(范围0~65536),其平方根d(范围0~256

1、查表可以从任何位置开始,对计算速度影响不大。

2、此算法完全没有乘法试算,其1/21/4除法运算可由二进制移位简单实现,且为完全补偿后的精确插值,所以递归速度非常快(这里最多4次),机器时间应不超过一个软件实现的典型乘法周期(开方比乘法快!?)。

3、最后运算已经包括了小数部分的精确45入算法。

4、此算法略加改动,即可实现更长字节整数或定长浮点数平方根精确解,其逆运算也可以实现乘方运算。

 

进一步研究表明,由于循环内所有运算都是加、减、位移、比较等简单运算,所花费的时间很少,可以适当加大循环次数。

特别地,如果把间隔P加大到128,对应修正值R=13684,则循环次数N=7,对应数组2就简化到:

———————————————————————————

P=128间隔排列的数  d=di+Pn    0    256        512

———————————————————————————

该数的平方            Di=d2     0   65536     262144

 

这时,对于两字节数被开方数D来讲,查表环节也可省去,程序代码大幅减少,计算流程如下:

 

注:程序里利用了两字节无符号整数的机器算法的标准进位和负数表达,既:65536=00-1=65535(对单字节是:256=00-1=255)。

 

程序里只用了一个特别的数128(及其它的平方数16384),就能够把两字节数0~65280范围内的任意整数的整数平方根精确(小数部分严格45入)求解!

上述程序还可以基本不加修改地适用于无符号带进位两字节整数的开方运算,从而把被开方数范围再扩大一倍(0~131071,对应根的范围0~362)。这只须在程序开始前增加一段关于边界和进位运算的如下内容:

其中:D’为D的进位字,d’为d的进位字。

 

程序思想还可以继续延伸到更长字节(带进位)无符号整数的开方,只需要修改对应的初始值就行了:

5~10位十进制数开方所需要的计算参数:

————————————————————————————————

       P             128          512        2048          4096            16384            65536

       R         16384    262144   4194304   16777216     268435456   4294967296

       N                7             9            11              12                 14                  16

d字节长           1             2              2                                  2                   3

D字节长           2             3              3                4                   4                    5

十进制位          5             6              7                8                   9                  10

D最大值 131071  1048575  16777215  134217727  1073741823  17179869183

————————————————————————————————

 

 

结论

本文首先提出并证明了整数平方数中值定理,进而提出一种基于此定理的的快速开方算法,并给出了具体的计算流程。由于全部运算不使用乘法运算或幂运算,只使用加、减、移位、逻辑等简单运算,只引入极少的初始变量,在经过有限次循环后即可迅速逼近整数的整数平方根的精确解(小数部分严格45入),从而把整数开方运算的机器时间减少极限。其运算速度较之目前最快的牛顿迭代法提高了一个数量级,达到与乘法运算相当的水平。

(全文完)

  其中,红色表示的数据组是需要带进位运算的。   ———————————————————————————————————

你可能感兴趣的:(J2ME,游戏开发)