def largest_prime_factor(num):
'''returns the largest prime factor of a number'''
ans = 0
if num % 2 == 0:
ans = 2
num /= 2
while num % 2 == 0:
num /= 2
i = 3
while i <= num:
if num % i == 0:
ans = i
num /= i
while num % i == 0:
num /= i
i += 2
return ans
def largest_prime_factor2(num):
'''returns the largest prime factor of a number'''
ans = 0
if num % 2:
pass
else:
ans = 2
while True:
num //= 2
if num % 2:
break
i = 3
while i <= num:
if num % i:
pass
else:
ans = i
while True:
num //= i
if num % i:
break
i += 2
return ans
def largest_prime_factor3(num):
'''returns the largest prime factor of a number'''
def check(j):
nonlocal ans
nonlocal num
if num % j:
return
ans = j
while True:
num //= j
if num % j:
return
ans = 0
check(2)
i = 3
while i <= num:
check(i)
i += 2
return ans
def testing():
from timeit import Timer
import random
def tests(f, times):
def test1(f):
f(random.randint(1, 1000))
def test2(f):
f(random.randint(100000, 1000000))
print(f.__name__)
print(Timer(lambda: test1(f)).timeit(number = times))
print(Timer(lambda: test2(f)).timeit(number = times//10))
print()
tests(largest_prime_factor, 100)
tests(largest_prime_factor2, 100)
tests(largest_prime_factor3, 100)
if __name__ == "__main__":
testing()
ZGVmIGxhcmdlc3RfcHJpbWVfZmFjdG9yKG51bSk6CiAgICAnJydyZXR1cm5zIHRoZSBsYXJnZXN0IHByaW1lIGZhY3RvciBvZiBhIG51bWJlcicnJwogICAgYW5zID0gMAogICAgaWYgbnVtICUgMiA9PSAwOgogICAgICAgIGFucyA9IDIKICAgICAgICBudW0gLz0gMgogICAgICAgIHdoaWxlIG51bSAlIDIgPT0gMDoKICAgICAgICAgICAgbnVtIC89IDIKCiAgICBpID0gMwogICAgd2hpbGUgaSA8PSBudW06CiAgICAgICAgaWYgbnVtICUgaSA9PSAwOgogICAgICAgICAgICBhbnMgPSBpCiAgICAgICAgICAgIG51bSAvPSBpCiAgICAgICAgICAgIHdoaWxlIG51bSAlIGkgPT0gMDoKICAgICAgICAgICAgICAgIG51bSAvPSBpCgogICAgICAgIGkgKz0gMgoKICAgIHJldHVybiBhbnMKCmRlZiBsYXJnZXN0X3ByaW1lX2ZhY3RvcjIobnVtKToKICAgICcnJ3JldHVybnMgdGhlIGxhcmdlc3QgcHJpbWUgZmFjdG9yIG9mIGEgbnVtYmVyJycnICAgIAogICAgYW5zID0gMAogICAgaWYgbnVtICUgMjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIGFucyA9IDIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBudW0gLy89IDIKICAgICAgICAgICAgaWYgbnVtICUgMjoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgaSA9IDMKICAgIHdoaWxlIGkgPD0gbnVtOgogICAgICAgIGlmIG51bSAlIGk6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBhbnMgPSBpCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBudW0gLy89IGkKICAgICAgICAgICAgICAgIGlmIG51bSAlIGk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaSArPSAyCgogICAgcmV0dXJuIGFucwoKZGVmIGxhcmdlc3RfcHJpbWVfZmFjdG9yMyhudW0pOgogICAgJycncmV0dXJucyB0aGUgbGFyZ2VzdCBwcmltZSBmYWN0b3Igb2YgYSBudW1iZXInJycKICAgIGRlZiBjaGVjayhqKToKICAgICAgICBub25sb2NhbCBhbnMKICAgICAgICBub25sb2NhbCBudW0KICAgICAgICBpZiBudW0gJSBqOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBhbnMgPSBqCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbnVtIC8vPSBqCiAgICAgICAgICAgIGlmIG51bSAlIGo6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgIGFucyA9IDAKICAgIGNoZWNrKDIpCiAgICBpID0gMwogICAgd2hpbGUgaSA8PSBudW06CiAgICAgICAgY2hlY2soaSkKICAgICAgICBpICs9IDIKCiAgICByZXR1cm4gYW5zCgpkZWYgdGVzdGluZygpOgogICAgZnJvbSB0aW1laXQgaW1wb3J0IFRpbWVyCiAgICBpbXBvcnQgcmFuZG9tCgogICAgZGVmIHRlc3RzKGYsIHRpbWVzKToKICAgICAgICBkZWYgdGVzdDEoZik6CiAgICAgICAgICAgIGYocmFuZG9tLnJhbmRpbnQoMSwgMTAwMCkpCiAgICAgICAgZGVmIHRlc3QyKGYpOgogICAgICAgICAgICBmKHJhbmRvbS5yYW5kaW50KDEwMDAwMCwgMTAwMDAwMCkpCgogICAgICAgIHByaW50KGYuX19uYW1lX18pCiAgICAgICAgcHJpbnQoVGltZXIobGFtYmRhOiB0ZXN0MShmKSkudGltZWl0KG51bWJlciA9IHRpbWVzKSkKICAgICAgICBwcmludChUaW1lcihsYW1iZGE6IHRlc3QyKGYpKS50aW1laXQobnVtYmVyID0gdGltZXMvLzEwKSkKICAgICAgICBwcmludCgpCgoKICAgIHRlc3RzKGxhcmdlc3RfcHJpbWVfZmFjdG9yLCAxMDApCiAgICB0ZXN0cyhsYXJnZXN0X3ByaW1lX2ZhY3RvcjIsIDEwMCkKICAgIHRlc3RzKGxhcmdlc3RfcHJpbWVfZmFjdG9yMywgMTAwKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRlc3RpbmcoKQ==