[Python] Maximizing Efficiency of Collatz Conjecture Program Python

Discussão em 'Python' iniciado por Stack, Dezembro 21, 2024.

  1. Stack

    Stack Membro Participativo

    My question is very simple.

    I wrote this program for pure entertainment. It takes a numerical input and finds the length of every Collatz Sequence up to and including that number.

    I want to make it faster algorithmically or mathematically (i.e. I know I could make it faster by running multiple versions parallel or by writing it in C++, but where's the fun in that?).

    Any and all help is welcome, thanks!

    EDIT: Code further optimized with the help of dankal444

    from matplotlib import pyplot as plt
    import numpy as np
    import numba as nb

    # Get Range to Check
    top_range = int(input('Top Range: '))

    @nb.njit('int64[:](int_)')
    def collatz(top_range):
    # Initialize mem
    mem = np.zeros(top_range + 1, dtype = np.int64)
    for start in range(2, top_range + 1):
    # If mod4 == 1: (3x + 1)/4
    if start % 4 == 1:
    mem[start] = mem[(start + (start >> 1) + 1) // 2] + 3

    # If 4mod == 3: 3(3x + 1) + 1 and continue
    elif start % 4 == 3:
    num = start + (start >> 1) + 1
    num += (num >> 1) + 1
    count = 4

    while num >= start:
    if num % 2:
    num += (num >> 1) + 1
    count += 2
    else:
    num //= 2
    count += 1
    mem[start] = mem[num] + count

    # If 4mod == 2 or 0: x/2
    else:
    mem[start] = mem[(start // 2)] + 1

    return mem

    mem = collatz(top_range)

    # Plot each starting number with the length of it's sequence
    plt.scatter([*range(1, len(mem) + 1)], mem, color = 'black', s = 1)
    plt.show()

    Continue reading...

Compartilhe esta Página