常见运算(比如加法,三角函数)的复杂度
加减的复杂度是最低的,乘除运算次之。那求平方根(sqrt)呢?三角函数(比如sin,tan)呢?反三角函数呢?指数呢(power)?
有没有人给这些运算的复杂度来个定量的分析,或者排个序呢?
[解决办法]
除了浮点算数之外的常用函数,所谓的“transcendental函数”几乎包括了大部分常用函数。
(当然除了取模,位用算等,这些不是。)
三角函数,指数对数函数,幂函数,等都在此列。
大部分语言的编译系统,就专门包括了对这些函数的“标准的逼近”算法。
可以从逼近的角度从理论上分析这些函数算法的复杂度。
也可以用“脚手架”的办法直接测试得到。
对于不同的语言或编译系统,后者是不一样的。
[解决办法]
如果要求精度为double,一般使用cpu中现成浮点指令。
如果要求的精度为任意精度,就需要
1.实现任意精度的加,减、乘、除。运算。
加减法是基础,乘法是关键。加和减的复杂度正比于数的长度。依赖于不同的算法(硬乘法,Karatsuba法,Toom-Cook算法,FFT算法),乘法运算的复杂度也不同,通常,随着乘数的增加,最有效的算法从基本的硬乘法逐渐变换到FFT算法。
基本上,除法的实现依赖乘法,和乘法的复杂度同阶。
超越函数的算法则复杂的多,超越函数需要在四则运算的基础上进行。Richard P.Brent 在 1976年,写的题为《 Fast Multiple precision Evaluation of Elementary Function》(详情见超越函数的高精度计算)的论文中证明,若M(n)表示 2个长为n的大数进行乘法运算的复杂度,则初等函数(exp,log,artan,sin,cosh等)精确到n位数的复杂度为O(M(n)log(n))。