Python: Collatz Sequence
Python: Longest Collatz Sequence
Problem No.14 in ProjectEuler
Definition Wikipedia: Start with any positive integer n. Then each term is obtained from the previous term as follows: if the previous term is even, the next term is one half the previous term. If the previous term is odd, the next term is 3 times the previous term plus 1. The conjecture is that no matter what value of n, the sequence will always reach 1.
So the formula is: Starting with n, the next n will be:
n/2 (if n is even)
3n + 1 (if n is odd)
If we start with 13, we generate the following sequence:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1.
A walk through:
n=13, 13 is odd, then n = 13 * 3 + 1 , n= 40
n=40, 40 is even, then n= 40/2, n=20
n=20, 20 is even, then n=20/2, n=10
n=10, 10 is even, then n=10/2, n=5
n=5, 5 is odd, then n=5*3+1 , n=16
n=16, 16 is even, then n=16/2, n=8
n=8, 8 is even, then n=8/2, n=4
n=4, 4 is even, then n=4/2, n=2
n=2, 2 is even, then n=2/2, n=1
n=1 then end of sequence
The Task: The task in ProjectEuler is to searching for a the Number N, under one million, that produces the longest chain.
Overview to my python cases: In my company, we are not allowed to download any software, so i don’t have any Python platform. To solve this i am using an online python interpreter, some time it’s become slow. So in this code (and others) i am spiting the range in 10 each with 100,000 then running the code to get the longest chain in each range. So the Number N, under one million, that produces the longest chain is:
The Answer: In my previous codes or math solving challenges in pybites or ProjectEuler I am solving the problems, writing the code, but not posting my answer to ProjectEuler platform. Today, and with Problem No.14 i decide to post the answer in the ProjectEuler platform for the first time just to see what will happen. The answer was 837799, and I get this page.
In the code bellow, i set the range from 1 to 50000.
The Code:
chain2=[]
longest=[0,0]
def collatz_Seq(num):
t= num
chain=[num]
while t !=1 :
if t%2==0:
t=t/2
chain.append(int(t))
else:
t=3*t+1
chain.append(int(t))
return chain
for num in range (1,50000):
chain2 = collatz_Seq(num)
if len(chain2) > longest[0]:
longest[0] = len(chain2)
longest[1] = num
chain2=[]
print(‘num:’,longest[1],’ has a longest chain: ‘,longest[0])