Skip to content

Instantly share code, notes, and snippets.

@softyoda
Last active July 30, 2021 22:31
Show Gist options
  • Save softyoda/52efbf7f520cba7e56779b3271df8d68 to your computer and use it in GitHub Desktop.
Save softyoda/52efbf7f520cba7e56779b3271df8d68 to your computer and use it in GitHub Desktop.
Just a small python programm to bruteforce 421 (idea from this video https://www.youtube.com/watch?v=094y1Z2wpJg& )
import random, time, sys
def trybignumber(bignumber):
num = random.getrandbits(bignumber)
print(num)
file = open("number.txt", "w")
file.write("Current number : \n"+ str(num))
file.close
loop = 0
start = time.time()
prev_time = time.time()
while num != 1:
loop +=1
if num % 2 == 0:
num = int(num//2)
else:
num = num*3+1
dt = time.time() - prev_time
if dt > 1:
print("Size of the number : ", sys.getsizeof(num) , "Bytes. Number of steps : ", loop )
prev_time = time.time()
end = time.time()
print("The number converges in ", end-start ," seconds and ", loop , "steps.")
for i in range(100):
trybignumber(2**20)
@softyoda
Copy link
Author

This allow to detect diverging (if the number of bytes continue to increaces) and maybe loop but it can be hard to be sure it's a loop with this code. To be sure, execute this code :

import random, time, sys

def verify(theusernumber):
    num = theusernumber
    list = []
    loop = 0
    start = time.time()
    prev_time = time.time()
    while num != 1:
        loop +=1
        if num % 2 == 0:
            num = int(num//2)
            if num in list:
                print ("The even winner of the loop is : ", num)
            else:
                list.append(num)
        else:
            num = num*3+1
            if num in list:
                print ("The odd winner of the loop is : ", num)
            else:
                list.append(num)
        dt = time.time() - prev_time
        if dt > 1:
            print("Size of the number : ", sys.getsizeof(num) , "Bytes. Size of the list of number : ", sys.getsizeof(list) ,"Bytes. Number of steps : ", loop )
            prev_time = time.time() 
    end = time.time()
    print("The number converges in ", end-start ," seconds and ", loop , "steps.")

verify(PUT YOUR NUMBER HERE)

But each steps will take lot longer !

@softyoda
Copy link
Author

There is also this code that try smaller numbers but stop when the number decrease.

import random, time, sys

def trybignumber(bignumber):
    num = random.getrandbits(bignumber)
    print(num)
    file = open("number.txt", "w")
    file.write("Current number : \n"+ str(num))
    file.close
    loop = 0
    start = time.time()
    prev_time = time.time()
    startsize = sys.getsizeof(num)
    while num != 1:
        loop +=1
        if num % 2 == 0:
            num = int(num//2)
        else:
            num = num*3+1
        dt = time.time() - prev_time
        if dt > 1:
            print("Size of the number : ", sys.getsizeof(num) , "Bytes. Number of steps : ", loop )
            prev_time = time.time()
            if sys.getsizeof(num) <= startsize-startsize/80:
                break
    end = time.time()
    print("The number converges in ", end-start ," seconds and ", loop , "steps.")
    
for i in range(100):
    trybignumber(2**18)


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment