非常抱歉……又让您失望了呢……
2 年过去了……我还是一点进步都没有……一次大型比赛都没打好……
真的会有那样一天……像您那样强吗?……
想写的那些东西果然还是太麻烦了……根本写不动……就写一些没什么意思的东西吧……关于优化求形式幂级数的牛顿法的常数。
虽然写得很糟糕但还算是能看的,所以就发出来了。
2020年疫情期间更新了一些东西
记号约定:
为了方便阅读,在指数部分会用
以下是废话部分,可以跳过
对于给定的精度
对于
Newton 法
对于形式幂级数
这可以通过观察
注意到
Newton 法亦可表述为,对于形式幂级数
这个表述可能更容易被初学者接受。
观察式子可以发现式中
以下讨论每种操作的优化。对每种操作,内容分为三部分
- 各种操作直接按照式子计算所需要的时间。我们认为长度为
的 FFT 计算所需时间为 ,2 个精度为 的形式幂级数的乘法需要 时间。为了方便阅读,下文操作的时间中将会省略所有 。 - 用循环卷积进行优化。注意到很多情况下,我们已经得到了结果中的一部分系数,而长度为
的 FFT 解决了循环卷积问题 ,仅用于计算卷积会非常浪费。所以可以考虑先计算循环卷积,如果必要的话就进行一些处理,最后得到需要的系数。这里的时间以 2 个序列的循环卷积为单位计算,所以即使是平方也按照 统计时间。在倒数部分,还会介绍这个技巧的一个特殊形式。 - 减少 FFT 次数。容易发现很多情况下多次计算了相同的 DFT,或是可以用线性变换的性质合并几次 IDFT,这一部分考虑减少这些额外的开销。
如果需要用到其他操作,我们不使用更高级部分的结果。
倒数
1
对于
相当于
(好像能直接得到这个式子……)
从
2
对于
考虑
3
对于
迭代中有两次和
如果允许长度为
但我们仍然需要一个改进的做法,因为并不一定支持长度为
我们使用长度为
容易发现,如果在
我们可以把
简单描述一下思路:为了算出所需结果
算出结果需要在
以上是一般情况的本质原理,实际实现可以不考虑这些,最后的推荐实现也可以这样描述。考虑将所需结果
商数或对数
1
商数:对于
显然先求
对数:对于常数项为
这和下面的指数都要求
我们有
所以
2
对于
直接求
如果不需要求
- 计算
需要 时间 - 计算
需要 时间 - 计算
需要和倒数类似的 时间
所以计算
3
对于
令
如果需要求
- 计算
和 需要 - 计算
需要 时间 - 计算
需要 时间
所以计算
这里用到的技巧可以这样描述:对于
如果不需要求
相比第 2 部分的算法,可以使用更快的计算倒数的方法。计算
- 计算
需要 时间 - 计算
需要 时间 - 计算
需要 时间 - 计算
,已知 ,需要 时间
所以计算
观察
平方根
1
对于
相当于
从
2
对于
3
对于
- 保留前一轮迭代计算倒数时的
- 计算
需要 时间 - 计算
需要 时间 - 计算
需要 1 次计算倒数的迭代,已知 ,需要 时间
所以计算
此外,最后一轮中因为不需要进行计算倒数的迭代,所以不需要计算并保留
另一个方法 是先考虑计算
仍然是考虑
- 计算
需要 时间 - 计算
需要 时间 - 计算
需要 时间 - 计算
需要 时间
所以计算
指数
1
对于常数项为
相当于
从
2
对于常数项为
首先需要改写迭代式,令
再注意到
计算
3
对于常数项为
- 保留前一轮迭代计算的
- 计算
需要 时间 - 计算
需要 时间 - 计算
需要 时间 - 计算
,已知 ,需要 时间 - 计算
需要 时间 - 计算
需要 时间 - 计算
需要 1 次计算倒数的迭代,已知 ,需要 时间
所以总时间为
因为写得比较早,所以似乎仍然可以继续进行不少优化……但就这样吧,因为还有更好的做法。
另一个方法 类似上面的改写,有
- 保留前一轮迭代计算的
- 计算
需要 时间 - 计算
需要 时间 - 计算
,已知 ,需要 时间 - 计算
需要 时间 - 计算
需要 1 次计算倒数的迭代,已知 ,需要 时间
所以总时间为
此外,最后一轮中因为不需要进行计算倒数的迭代,所以不需要计算并保留
下面是发现循环卷积优化后的较重要的文章。除了以上内容以外,还有一类基于分块的优化,可以得到一些更好的结果。如果有兴趣的话,似乎可以在这些地方找到进一步优化的方法?
Removing redundancy in high-precision Newton iteration
Newton's method and FFT trading
Faster algorithms for the square root and reciprocal of power series
Faster exponentials of power series
A simple and fast algorithm for computing exponentials of power series
Fast algorithms for elementary operations on complex power series