Как долго длится рекурсия Коллатца?

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 ) = 1  для  n 1 T ( n ) = T ( n / 2 )  для  n  четных T ( n ) = T ( 3 n + 1 )  для  n  нечетныхT(n)collatz(n)

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

Я думаю, что будет если четное, но как рассчитать повторение в целом?lg n nT(n)lgnn

9bi7
источник
4
Это должно быть и так далее. +1 очень важен, в противном случае у вас для всех для которых последовательность заканчивается. T(n)=1nT(n)=T(n2)+1T(n)=1n
user253751
2
54 чётно, T (54) = 112! = Lg (54)
Темыр
Предполагается, что пользователь будет вводить только целое число?
Дин МакГрегор
@DeanMacGregor Да. На самом деле положительное целое число предполагается.
сумерки
было бы полезно больше подробностей BKG. откуда вы взяли код, как его познакомили? это полуизвестная открытая проблема в теории чисел, нерешенная в течение столетия, для которой была написана целая книга Лагариаса. из CS pov доказывает, что в любой момент времени или пространства класс сложности эквивалентен доказательству. много других ссылок здесь . также отличная тема для информатики Чат для всех, кто заинтересован. есть также collatzтег на MathOverflow и т. д. последние исследования показывают, что проблема имеет внутренние фрактальные качества, что усложняет задачу.
vzn

Ответы:

29

Это гипотеза Коллатца - все еще открытая проблема.
Гипотеза о доказательстве того, что эта последовательность останавливается для любого ввода, поскольку это не разрешено, мы не знаем, как решить это отношение повторения во время выполнения, более того, оно может вообще не останавливаться - поэтому, пока не доказано, время выполнения неизвестно и может быть .

Зло
источник
Благодарю. Но моя рекурсия верна, верно? Если так, то мы все еще не можем найти решение для этой рекурсии?
9bi7
Что ты имеешь в виду под словом «возвращение есть истина»? Вы не можете найти время выполнения, но для большого числа чисел это сделает некоторое количество переходов и достигнет 1. обозначает не время выполнения, а саму функцию. T(n)
Зло
Под правильным я имел в виду, например, как в сортировке слиянием, мы можем получить . Поскольку код рекурсивный, мы можем написать рекуррентность для него, верно? T(n)=2T(n/2)+O(n)
9bi7
7
«поскольку это не решено, верхней границы нет» - мы должны быть осторожны с языком здесь. Мы не знаем решение этого повторения, конец истории.
Рафаэль
7
15

Вы правильно перевели код . Есть много методов для решения рецидивов .

Тем не менее, в настоящее время неизвестно, collatzостановится ли вообще для всех 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

M,1nHaltnn

Гипотеза Коллатца - очень известная гипотеза, предложенная Коллатцем в 1937 году. Многие выдающиеся математики потратили (читай впустую) бесчисленные часы, пытаясь разгадать эту гипотезу, но безрезультатно. Даже Пол Эрдос сказал о гипотезе Коллатца: «Математика еще не готова к таким проблемам».

Shreesh
источник
1
«впустую» является субъективным суждением. см. экспертный анализ Lagarias о причинах, по которым результаты работы / частичные результаты по гипотезе могут рассматриваться как не «потраченные впустую». также цитате Эрдоса, вероятно, несколько десятилетий, и с тех пор математика значительно продвинулась и продолжает ... и, вероятно, не все новые математические методы были предприняты для решения этой проблемы.
vzn
Это был язык в щеке. (Чтобы быть справедливым, я заключил это в скобки, не так ли). Пока проблема не будет решена, все усилия кажутся бесполезными, но как только она решена, вы увидите, как даже неудачи привели к решению. И я не согласен с вами, что математика существенно продвинулась; технология значительно продвинулась, но физика, математика и даже информатика развиваются медленно, и это так и должно быть (я могу сказать это, потому что я, изучивший свои веревки 30 лет назад, все еще не чувствую себя устаревшим).
Shreesh
3x+1
Лагариас написал / скомпилировал / отредактировал целую книгу на эту тему, и это звучит "извиняющимся" по поводу изучения проблемы? лол! совсем наоборот . однако согласился / признал, что он занимает оборонительную позицию, потому что многие другие математики не считают эту проблему существенной или заслуживающей серьезного нападения / усилия (и обратите внимание, что Гаусс чувствовал то же самое в отношении Ферма «Последний удар»!). но есть множество других случаев, когда ведущие математики воспринимали это всерьез, например, Тао, например .
ВЗН
2

noddn3n+1

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

3n+1

Sorrop
источник
0

У вас есть T (n) = T (n / 2) + 1, если n четно. Но тогда n / 2, скорее всего, даже не очень, так что вы застряли там.

Происходит то, что милые маленькие правила, которые вы выучили, сталкиваются с реальной проблемой, и они не работают. Они бьют по кирпичной стене лицом в первую очередь, и это больно. Сделайте себе одолжение и выполните рекурсию для T (7) вручную, и тогда вы скажете, все еще ли вы считаете, что это связано с lg n.

Если вы думаете, что это не связано с исходным вопросом, потому что 7 не четное: всякий раз, когда n нечетно, T (n) = T (3n + 1), а 3n + 1 четно, поэтому, если T (n) были записаны n, если n четное, то будет log (3n + 1) + 1 всякий раз, когда n> 1 нечетно.

gnasher729
источник