【发布时间】:2016-01-01 17:56:24
【问题描述】:
我将大整数编码到size_t 的数组中。我已经进行了其他操作(加、减、乘);以及除以一位数。但如果可能的话,我想匹配我的乘法算法的时间复杂度(目前是 Toom-Cook)。
我收集了一些线性时间算法来获取我的股息乘法逆的各种概念。这意味着理论上我可以在与乘法相同的时间复杂度下实现除法,因为无论如何线性时间运算相比之下都是“微不足道的”。
我的问题是,我该怎么做呢?哪种类型的乘法逆在实践中最好?取模64^digitcount?当我将乘法逆元乘以除数时,我可以避免计算由于整数截断而被丢弃的数据部分吗?任何人都可以提供 C 或 C++ 伪代码或准确解释应该如何完成吗?
或者有没有比基于逆的方法更好的专用除法算法?
编辑:我挖掘了上面提到的“逆”方法。在“计算机编程艺术,第 2 卷:半数值算法”的第 312 页上,Knuth 提供了“算法 R”,它是一种高精度倒数。他说它的时间复杂度低于乘法。然而,将其转换为 C 并对其进行测试并非易事,并且在我编写代码之前不清楚将消耗多少开销内存等,这需要一段时间。如果没有人超过我,我会发布它。
【问题讨论】:
-
你知道这些方法的渐近复杂度吗?就传递给函数的位数而言?与桌面乘法等的 O(n^2) 进行比较。
-
O(n*log(n))听起来太快了,比最快的乘法还要快。我怀疑由于某种原因它变得有点慢,但如果我能找出原因,我会回复你。 -
移动 cmets 来回答,添加带有一些信息的二进制长除法示例 ...
标签: c++ c algorithm biginteger division