我々は計算することができます


11

私は問題の効率的なアルゴリズムを探しています:

入力:正の整数いくつかの整数のために(ビットとして格納されている)のn ≥ 0。3nn≥0

出力:数。n

質問:私たちは計算することができますのビットから3 のnにO (N )時間?n3nO(n)


これは、math.SEの質問への私の答えに動機付けられた理論的な質問です。この全単射の公式を見つける方法は?。この質問では、著者は、全単射から見つけたいと自然数N = { 1 、2 、... }。私が提案さ2 m個3 N ↦ 2 mで(2 N + 1 )

{2n3m:n≥0 and m≥0}
N={1,2,…}
2m3n↦2m(2n+1)
ソリューションとして。そこにある別の答えは「単純な公式はない」と断言しており、提案された解決策が(計算上)どれほど単純であるのか疑問に思う。

我々が知っていれば私の提案された解決策で、及びMは、我々は簡単に計算することができる2 M(2 のn + 1 )(のバイナリ桁書き込みnが続く1続くM個のゼロを)。これにはO (n + m )時間かかります。nm2m(2n+1)n1mO(n+m)

m2m3n3nO(m)

ただし、を見つける必要もありますが、これはもっと難しいかもしれません。繰り返し3で割ることでnを見つけることは可能ですが、これは無駄に思えます。これにはn回の除算が必要で、それぞれにO (n )時間かかるため、合計でO (n 2)時間になります。[実際、各反復の後、桁数は直線的に減少しますが、これによりO (n 2)時間になります。]nn3nO(n)O(n2)O(n2)

入力がべき乗であることを利用できるようになっているようです。3


2
計算の正確なモデルは何ですか?時間内に許可される操作は何ですか?(log 2 3などの数値を使用して算術演算を行うことができれば、非常に便利です...)O(1)log2⁡3
— ユヴァルフィルマス

3
downvoterはdownvoteを説明できますか?些細な質問ではないようです。合理的な計算モデルの下での最適な実行時間はどれくらいですか?
— ユヴァルフィルマス

1
0、1、および空のセル(無限のテープ)を持つテープを想像しています。時間で実行するシングルビットトグルおよび左/右シフト操作が必要です。(マーカーが無限テープの0番目のビットにある場合、マーカーをシフトすることで左右のシフトが実現されます)。チューリングマシンとは異なり、ポインターを移動するのに時間がかかるのは望ましくありません。したがって、「0番目のビットの切り替え」は「124126番目のビットの切り替え」と同じ時間がかかります。O(1)
— レベッカJ.ストーンズ

それは何らかの形でこれに関連するかもしれない質問
— J.-E.

Ω(n)

回答:


9

明らかなアプローチは次のとおりです。

log2⁡(3n)ϵO(log⁡1ϵ)ϵ1/2

log2⁡(3)O(log⁡n)

(3)(1)への回答を(2)への回答で除算し、最も近い整数に丸めます。

そのため、最初のステップには線形時間がかかり(ほとんどの計算モデルでは、シングルヘッドチューリングマシンのようなパワー不足のモデルではないかもしれません)、残りのステップは多対数である必要があります。


3
log2⁡(3)tO(M(t)log⁡t)M(t)≤O(tlog⁡t2log∗⁡t)t

参照してくれてありがとう。怠けすぎて自分で調べられなかったことをおaびします。
— デビッドエップシュタイン

9

n>03nL=⌈log2⁡(3n)+1⌉

L−2log2⁡3≤n≤L−1log2⁡3.
L≥13L
n=⌊L−1log2⁡3⌋.

4

k3n3nmod10k3nmod5k35k3φ(5k)=5k−1×4

したがって、離散ログとヘンセルリフティングを使用すると、下位桁からを非常に効率的に計算できるはずです。つまり、下位桁から計算し、の離散対数を基数に法として計算することから始めます。これは明らかにし、時間で実行できます。次に、あなたがの離散対数を見つけるのベースに、モジュロ、これは明らかにし、で行うことができますnmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1)時間(知識を利用して、試す必要がある可能性はしかありません)。繰り返します。各ステップでは、の知識を使用あなたは効率の離散対数計算を助けるためにのみが存在するという事実を利用して、可能な値。nmod45nmodφ(5k−1)3nmod5kN MOD φ (5 K)5nmodφ(5k)

ここで、十分に大きくすると、が明らかになります。nkn

実行時間がであるかどうかを判断する必要がありますが、実際にはそうであるように見えます。にするだけで十分だと思うし、時間で各反復を行うことができ、合計で時間になると思う。k = O (n )O (1 )O (n )O(n)k=O(n)O(1)O(n)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.