███╗   ██╗ ██████╗  ██████╗ ██████╗ ██╗   ██╗██╗     ███████╗
████╗  ██║██╔═══██╗██╔═══██╗██╔══██╗██║   ██║██║     ╚══███╔╝
██╔██╗ ██║██║   ██║██║   ██║██║  ██║██║   ██║██║       ███╔╝ 
██║╚██╗██║██║   ██║██║   ██║██║  ██║██║   ██║██║      ███╔╝  
██║ ╚████║╚██████╔╝╚██████╔╝██████╔╝╚██████╔╝███████╗███████╗ 
╚═╝  ╚═══╝ ╚═════╝  ╚═════╝ ╚═════╝  ╚═════╝ ╚══════╝╚══════╝
                                                                 
    

Problem: The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

</br>

This one took a few hours of researching and figuring out. At first, I had tried a bruteforcing and direct method of trying to build a working method for the test case of 13195, which went something like this:

def prime(n):
   table = []
   for i in range(2, n):
      if(n % i == 0):
         for j in range(0, i):
            if(j / i != 0):
               table.append(i)
            elif (j / i == 0):
               break
    return table

prime(13195)

To which I got a table with the prime factors as exemplified in the problem, but also a lot of excess and leading 0’s. And it took much too long overall to calculate. It was a helluva mess for sure.
And then with some research I figured that a while-loop thrown in would definitely cut down the time and increase efficiency in calculating the factors, as for-loops would be on a one by one basis in calculating whereas while-loops just go on until a certain point.
Solution:

import math
def primeFactors(n): 
    for i in range(3,int(math.sqrt(n))+1,2): 
        while n % i== 0: 
            print(i) 
            n = n / i 
    if n > 2: 
        print(n)
primeFactors(600851475143)