Collat​​z再帰の実行時間


19

次のPythonコードがあります。

def collatz(n):
    if n <= 1:
        return True
    elif (n%2==0):
        return collatz(n/2)
    else:
        return collatz(3*n+1)

このアルゴリズムの実行時間は?

試してください:

場合関数の実行時間を示します。そして、私は T(n)collatz(n)

{T(n)=1 for n1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd

が偶数の場合、はなると思いますが、一般的に再発を計算する方法は?T(n)lgnn


4
それは、などです。+1が重要です。そうでない場合、シーケンスが終了するすべてのに対してになります。Tn=1nT(n)=T(n2)+1T(n)=1n
user253751

2
54は偶数、T(54)= 112!= lg(54)
Taemyr

ユーザーは整数のみを入力すると想定されていますか?
ディーンマックレガー

@DeanMacGregorはい。実際、正の整数が想定されています。
ダスクワフ

より多くのbkgの詳細が役立つでしょう。どこでコードを入手しましたか、どのように導入しましたか?これは、ラガリアスによる本全体が書かれた、約3世紀に渡って解決されなかった数論の半有名な未解決の問題です。CS povから、それが任意の時間または空間の複雑さのクラスであることを証明することは証明と同等です。ここにもっと多くの参照。また、興味のある方のためのコンピューターサイエンスチャットの素晴らしいトピックです。MathOverflowなどにもcollatzタグがあります。最新の研究では、問題には固有のフラクタル特性があり、困難になっています。
vzn

回答:


29

これはCollat​​zの予想です-未解決の問題です。
予想は、このシーケンスは、任意の入力を停止し、これが未解決であることから、我々はさらにそれがすべてでは停止しない場合があり、このランタイム漸化式を解決する方法がわからない、ということの証明についてです-そう証明されるまで、実行中の時間が不明であってもよい


ありがとう。しかし、私の再帰は本当ですか?もしそうなら、その再帰の解決策はまだ見つかりませんか?
9bi7

「再帰は正しい」とはどういう意味ですか?実行時間を見つけることはできませんが、多くの場合、これはいくつかのジャンプをして1になりますはランタイムではなく、関数自体を示します。T(n)

たとえば、マージソートのように、を取得できます。コードは再帰的であるため、繰り返しを記述できますか?T(n)=2T(n/2)+O(n)
9bi7

7
「これは未解決であるため、上限はありません」-ここで言語に注意する必要があります。この再発の解決策はわかりませんが、話は終わりです。
ラファエル

7
はい。しかし、「わからない」は「上限がない」と同じではありません。基本的に、私は数学的な「ある」()と普通の人が「ある」(「私は1つ持っている」)で髪を分けています。ただし、これはTCSで行うべき重要な区別だと思います。
ラファエル

15

あなたはコードを正しく翻訳しました再発を解決する多くの方法があります。

ただし、collatzすべてが停止するかどうかは現在不明ですn。それがする主張は、コラッツ予想として知られています。そのため、この繰り返しに対応する既知の方法はありません。

nが偶数の場合、lg nになると思いますT(n)lgnn

どうして?あなたはあなたの主張が正しい考えていると思います。これは、この再発が指数関数的に少数のポイントを調査することでΘまで解決できるものではないことを示しています(こちらも参照)。n=2kΘ


13

時間複雑度関数は

{T(n)=O(1) for n1T(n)=T(n/2)+O(1) for n evenT(n)=T(3n+1)+O(1) for n odd

漸近的な時間の複雑さに関心がある場合は、次のように書き換えることができます。

{T(n)=1 for n1T(n)=T(n/2)+1 for n evenT(n)=T(3n+1)+1 for n odd

それも知られていないこと、得られたTM (参照停止問題すべてについて)、N。したがって、nごとに停止するかどうかさえ知らなければ、当然、停止にかかる時間を測定することはできません。/math/2694/what-is-the-importance-of-the-collat​​z-conjectureも参照してくださいM,1nHaltnn

Collat​​z予想は、1937年にCollat​​zが提案した非常に有名な予想です。多くの著名な数学者が、この予想を解決しようとするが、ほとんど役に立たないために数え切れないほどの時間を費やしました。PaulErdősでさえCollat​​zの予想について、「数学はまだそのような問題に対して準備ができていない」と言った。


1
「無駄」は主観的な判断です。推測に関する作業/部分的な結果が「無駄」ではないとみなされる理由については、ラガリアスによる専門家の分析を参照してください。また、Erdosによる引用はおそらく数十年前のものであり、それ以来数学は大幅に進歩し続けています...そしておそらくすべての新しい数学的手法が問題に対して試みられているわけではありません。
vzn

それは頬のコメントの舌だった。(公平を期すために、括弧内に入れていますよね)。問題が解決するまで、すべての努力は無駄に思えますが、一度解決すれば、失敗でさえ解決につながったことがわかります。そして、数学が大幅に進歩したことには同意しません。テクノロジーは大幅に進歩しましたが、物理学、数学、さらにはコンピューターサイエンスもゆっくりと進歩しています。それはそうあるべきです(30年前に自分のロープを学んだ私はまだ時代遅れに感じていないからです)。
シュリーシュ

@vzn、私は行って、「究極の挑戦:問題」でラガリアスの紹介を読みました。セクション10で、ラガリアスは努力が十分に費やされたという本当の信念を持っているのではなく、彼の立場を正当化しようとしているように見えると思いました。私には謝罪のように見えます。繰り返しになりますが、これは私の主観的な感覚だと思います。もちろん、人を知らずにそのような主張をすることはできないからです。3x+1
シュリーシュ

ラガリアスは、主題に関する本全体を書いて、編集して、編集しました、そして、それは問題を研究することに関して黙認的」に聞こえますか?笑!まったくです。しかし、他の多くの数学者はこの問題を重要または大きな攻撃/努力の価値があるとは考えていないので、彼は守備的な立場にあることに同意/認めている(そしてガウスはFermats Last Thmについてまったく同じように感じていた!)。しかし、トップの数学者がそれを完全に真剣に受け止めている他の大規模な例、たとえばタオもいます。
vzn

2

noddn3n+1

T(n)=2T(n/2)+nT(0)T(1)

3n+1


0

nが偶数の場合、T(n)= T(n / 2)+ 1になります。ただし、n / 2は偶数ではない可能性が高いため、そこに留まっています。

起こることは、あなたが学んだ素敵な小さなルールが実際の問題に直面していて、それらが機能しないということです。彼らはレンガの壁にぶつかり、最初に顔を合わせると痛い。自分自身に賛成し、T(7)の再帰を手動でたどると、これがまだlg nに関連していると信じているかどうかがわかります。

7が偶数ではないため、これが元の質問に関連していないと思う場合:nが奇数の場合、T(n)= T(3n + 1)、3n + 1が偶数であるため、T(n)が対数nが偶数の場合、n> 1が奇数の場合は常にlog(3n + 1)+ 1になります。

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