Archive

Archive for April 24, 2019

Python: Collatz Sequence

April 24, 2019 Leave a comment



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])









Follow me on Twitter..



Advertisements