我们可以根据时间中的位计算吗?


11

我正在寻找一个有效的算法来解决这个问题:

输入:某个整数的正整数(存储为位)。3nn0

输出:数字。n

问题:我们可以根据时间中的位计算吗?n3nO(n)


这是一个理论问题,是由对数学的回答引起的。SE问题如何找到该双射的公式?。在这个问题中,作者想从和自然数找到一个双射。我提出了作为解决方案。那里的另一个答案是“没有简单的公式”,这使我想知道我提出的解决方案有多简单(计算上)。

{2n3m:n0 and m0}
N={1,2,}
2m3n2m(2n+1)

使用我提出的解决方案,如果我们知道和,我们可以轻松地计算(写出的二进制数字,后跟后跟零)。这需要时间。nm2m(2n+1)n1mO(n+m)

从的位中找到等于找到最低有效位(可以通过计算右移来计算,将留在内存中)。这需要时间。2 m 3 n 3 n O m m2m3n3nO(m)

但是,我们还需要找到,这可能会更困难。通过重复除以可以找到,但这似乎很浪费。它需要除法运算,每个除法运算都需要时间,因此总共是时间。[实际上,在每次迭代之后,位数将线性减少,但这仍然会导致时间。]n 3 n O n O n 2O n 2nn3nO(n)O(n2)O(n2)

知道输入为的幂,似乎我们应该可以利用。3


2
您的精确计算模型是什么?在时间内可以进行哪些操作?(如果我们可以使用这样的数字进行算术,那将非常有用...)日志2 3O(1)log23
Yuval

3
下降投票者可以解释下降投票吗?这似乎根本不是一个琐碎的问题。在某种合理的计算模型下,最佳运行时间是多少?
Yuval Filmus 2013年

1
我正在想象带0、1和空单元格的磁带(具有无限数量的磁带)。我希望在时间内运行一次切换和向左/向右移位操作。(如果我们在无限长的磁带上有一个标记的第0位,则通过移动标记可以实现向左/向右移动)。与图灵机不同,我不希望它花费任何时间来移动指针。因此,“切换第0位”与“切换第124126位”花费的时间相同。O(1)
Rebecca J. Stones

它可能以某种方式与此相关的问题
J.-E.

的下限是否明显?Ω(n)
鲍里斯·布赫

Answers:


9

显而易见的方法是:

(1)计算出对的近似值。你可以把它的1的添加剂误差范围内通过在给定的二进制表示的比特的数量进行计数,并以的添加剂误差范围内接近于ε通过额外地看着顶部Ô 日志1log2(3n)ϵ位输入的。它应该足以选择的恒定值ε,使得添加剂误差范围内的最终结果的端部向上(与步骤(2)的误差组合之后)1/2的正确的。O(log1ϵ)ϵ1/2

(2)计算对的近似值。我对此算法不熟悉,但是我希望它们在所需的精度位数上采用时间多项式,并且只需要O log n 位精度即可。log2(3)O(logn)

(3)将(1)的答案除以(2)的答案,并四舍五入到最接近的整数。

因此,第一步需要线性时间(在大多数计算模型中,尽管对于某些功率不足的模型(例如单头Turing机器)可能不是),其余步骤应该是多对数的。


3
我相信,计算,以位精度需要时间ø 中号日志,其中,中号Ô 日志2 日志*是时间到乘法位数字。参见布伦特-齐默尔曼(Brent--Zimmermann),loria.fr /〜zimmerma / mca / pub226.htmllog2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
瑞安·奥唐奈

感谢您提供参考,也很抱歉自己懒于查找。
David Eppstein

9

对于任何整数,写入3 Ñ二进制需要准确大号= 日志23 Ñ+ 1 比特。一些基本代数暗示 L 2n>03nL=log2(3n)+1 对于任何位长大号1,有在此范围内大多数一个整数。因此,给定的一个整体功率3大号整数位长,指数必须 Ñ=大号-1

L2log23nL1log23.
L13L
n=L1log23.

4

这是另一种方法。给定3 n的低位,您可以学习3 n mod 10 k,从而学习3 n mod 5 k。它看起来像3是发电机模5 ķ(即,3具有为了φ 5 ķ= 5 ķ - 1 × 4)。k3n3nmod10k3nmod5k35k3φ(5k)=5k1×4

因此,通过使用离散对数和亨泽尔的提升,我想你应该能够计算从低ķ数字3 ñ非常有效。换句话说,可以通过计算开始Ñ 4从低位3 Ñ,通过采取的离散对数3 Ñ5在基座3,模5 ; 这揭示了n mod 4,并且可以在O 1 )中完成nmodφ(5k)k3nnmod43n3nmod535nmod4O(1)时间。然后,您将的离散对数找到以e为底的模25。这揭示了n mod 20,并且可以在O 1 时间内完成(利用n mod 4的知识,您只有5种可能的尝试)。重复。在每个步骤中,您使用的知识ñ MOD φ 5 ķ - 1,以帮助您有效地计算离散对数的3 ñ国防部53nmod25e25nmod20O(1)nmod45nmodφ(5k1),利用的事实,即只有 5中可能的值 Ñ MOD φ 5 ķ3nmod5k5nmodφ(5k)

现在,让足够大,这表明nkn

您需要确定运行时间是否为,但是在我看来,运行时间可能是这样。我怀疑足以让k = O n 足够了,而且我怀疑您可以在O 1 时间内进行每次迭代,总共需要O n 时间。O(n)k=O(n)O(1)O(n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.