К основному контенту

Задача 14.Самая длинная последовательность Коллатца

Условие:
Следующая повторяющаяся последовательность определена для множества натуральных чисел:
n → n/2 (n - чётное)
n → 3n + 1 (n - нечётное)
Используя описанное выше правило и начиная с 13, сгенерируется следующая последовательность:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Получившаяся последовательность (начиная с 13 и заканчивая 1) содержит 10 элементов. Хотя это до сих пор и не доказано (проблема Коллатца (Collatz)), предполагается, что все сгенерированные таким образом последовательности оканчиваются 1.
Какой начальный элемент меньше миллиона генерирует самую длинную последовательность?

Решение
Гипотеза Коллатца сводится к тому что данная последовательность всегда оканчивается единицей. Если верить Википедии, то она не доказана и над проверкой гипотезы на больших числах сейчас трудятся миллионы видеокарт добровольцев вычислительной сети BOINC в рамках проекта Collatz Conjecture.
Мы же будем работать с не очень большими числами и банальной рекурсии нам с головой хватит. 
Функция get_collatz рекурсивно перебирает последовательность и возвращает количество итераций когда последовательность вышла на 1 

def get_collatz(n,qty):
    if n==1:
        return qty
    elif n%2==0:
        return get_collatz(int(n/2),qty+1)
    else:
        return get_collatz(3*n+1,qty+1)
n=0
a=0
for i in range(13,1000000):
    c=get_collatz(i,1)
    if c>n:
        a,n=i,c
print(a,n)

Далее в цикле перебираем числа начиная с 13-ти. Если число итераций > предыдущего записываем в переменную a само число, а в n длину его последовательности.
Вся эта конструкция работала около 2-х минут на моем скромном ноутбуке.

Популярные сообщения из этого блога

Задача №1 Сумма чисел, кратных 3 м и 5-ти

 . Задача №1 Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел - 23. Найдите сумму всех чисел меньше 1000, кратных 3 или 5. Решение

Задача 21. Дружественные числа

Пусть d( n ) определяется как сумма делителей  n  (числа меньше  n , делящие  n  нацело). Если d( a ) =  b  и d( b ) =  a , где  a  ≠  b , то  a  и  b  называются дружественной парой, а каждое из чисел  a  и  b  - дружественным числом. Например, делителями числа 220 являются 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, поэтому d(220) = 284. Делители 284 - 1, 2, 4, 71, 142, поэтому d(284) = 220. Подсчитайте сумму всех дружественных чисел меньше 10000. Решение Для начала определим функцию, которая будет возвращать сумму делителей числа: def get_sum(n):     s=0     for i in range(1,n):         if n%i==0:             s+=i     return s Думаю не требует объяснений все довольно тривиально Далее определяем функцию, возвращающую список дружественных чисел до числа n:   def gen_friendlys(n):   ...

БЛОГ ПЕРЕЕХАЛ

БЛОГ "Проект Эйлера на Python" наконец-то получил второй шанс на жизнь и переехал на новый адрес  https://pythonvsjs.valis.me/ В новом формате я не просто буду решать задачи проекта Эйлера на python но и сравнивать производительность Python, JavaScript, Lua, Dart, Scala,  Haskel и прочих языков программирования в решении задач Следите плиз за моим новым блогом Также подписывайтесь на мой Youtube канал  https://www.youtube.com/channel/UCLdyT4P8AA-8YpsAFfeLZZQ Там много интересных видео связанных с IT:  Как написать telegram бота за 15 минут, сделать управляемый по wifi чайник,  стоит ли учить Dart и многое другое. Все это на моем канале И для текстового сопровождения видео я сделал специальный блог blog.valis.me - где вы сможете полистать сопровождающий видео текстовый материал И чтобы не пропустить все это подписывайтесь на мой Twitter  @Denis22019055 Все спасибо! Пока!