Skip to content

Instantly share code, notes, and snippets.

@softyoda
Last active July 30, 2021 22:31
Show Gist options
  • Select an option

  • Save softyoda/52efbf7f520cba7e56779b3271df8d68 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown
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
Copy Markdown
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