#!/usr/bin/env python # coding: utf-8 # We'll use [memoization](https://en.wikipedia.org/wiki/Memoization) to cache results for odd numbers. We don't cache even numbers since there's a separate loop that divides even numbers by 2 until we have an odd number. By storing only half of the numbers we also halve the amount of memory needed. # In[29]: cache = {} def total_stopping_time(n): t = n c = 0 while True: while t % 2 == 0: t //= 2 c += 1 if t == 1: break if cache.get(t): c += cache.get(t) break t = (3*t + 1) c += 1 if n % 2 != 0: cache[n] = c return c max_n = 0 max_length = 0 for n in range(1, 1_000_000): length = total_stopping_time(n) if length > max_length: max_length = length max_n = n max_n