仅使用位移加法和减法的对数时间整数除法

Posted

技术标签:

【中文标题】仅使用位移加法和减法的对数时间整数除法【英文标题】:Logarithmic time integer division using bit shift addition and subtraction only 【发布时间】:2017-09-20 15:34:36 【问题描述】:

我被要求仅使用位移、加法和减法来实现具有对数时间复杂度的整数除法。

我可以看到如何处理 2 的幂的除数,但如何处理奇数除数,以使时间保持对数?

有可能吗?

编辑:一种在非对数但仍优于线性的时间复杂度内的方法也将受到欢迎。

谢谢

【问题讨论】:

据我所知,一般情况下不可能。除法最多可以像乘法一样有效,即 O(M(n)) 的时间复杂度,而基于 Schönhage-Strassen 的乘法的复杂度为 O(n log n log log n)。常数很大,所以这种方法通常只对数千位的操作数有意义。你的问题是理论上的吗?如果是这样,我建议在Computer Science Stackexchange 上提问。如果你有一个实际的应用程序(用例),你的操作数有多大? 嗨,这是一个装配练习。我认为下面建议的方式有对数时间。 以下答案中概述的方法的时间复杂度为 O(n)。 这取决于你选择的 n - 如果 n 是被除数,它是对数的(例如,40 亿需要 32 次移位),如果 n 是被除数中的位数,它是线性的,但是您已经记录了股息的日志以获取位数。 @Tony Lee 这不是传统的算术函数复杂性衡量方式。 【参考方案1】:

这就像在纸上做长除法,但是是二进制的。您将除数中的位移入累加器,直到它至少与除数一样大,然后从累加器中减去除数并继续,直到您一直处理所有位,同时为每个移位记录一个 0,不带减法和每次减去 1。

15/5 (1111/101)
dividend accumulator result
1111      0000       0  - can't subtract, shift
1110      0001       0  - can't subtract, shift
1100      0011       0  - can't subtract, shift
1000      0111       0  - can subtract, set 1
1000      0010       1  - can't subtract, shift
0000      0101       10 - can subtract, set 1
0000      0000       11 - we're done since we shifted 4 times

答案是 3 (11)。

被除数的最高位移动到累加器的底部。 每次移动被除数/累加器时,结果都会移动。

被除数的值是时间的对数,而不是被除数的位数。

【讨论】:

太棒了。我设法在汇编中实现了它,它似乎有效。谢谢!【参考方案2】:

我不知道为什么答案是“不可能的”。也许我不明白这个问题。理论上它是可能的,但是在支持并行计算的硬件上。在“普通”计算机中,创建和管理线程的成本很高。 假设我们有除法:

a/b = x

我们希望仅使用位移、加法和减法以对数时间计算 x。 所以我们正在寻找满足这一点的 x:

a = bx

可以通过二分查找找到它。 在二分查找的每一步中,我们必须进行一次乘法和一次比较。 乘法可以在对数时间内完成,因为我们可以做多项式的和。可以使用多项式线程数。 通过实现加法器电路(https://en.wikipedia.org/wiki/Adder_(electronics)),可以在对数时间内完成求和。 当然比较也可以在对数时间内完成。 因此,您可以使用多项式线程数进行对数时间除法。

【讨论】:

但是二进制搜索需要多项式的步数,不能并行:(.

以上是关于仅使用位移加法和减法的对数时间整数除法的主要内容,如果未能解决你的问题,请参考以下文章

MIPS计算器用减法和加法实现除法,避免DIV和REM指令

高精度加法,减法,乘法,除法

请问怎样用加法-移位实现定点乘除法?

加法 减法 乘法 除法计算

模2加法,模2减法,模2除法

如何使用位移来代替整数除法?