inputs = [(4,8), (1536,78360), (51478, 5536), (46410, 119340), (7673, 4729), (4096, 1024)]
def findFirstDivisor(number):
for i in range(2, number):
if number % i == 0:
return i
return number
def tree(number):
fact_tree = {}
while findFirstDivisor(number):
div = findFirstDivisor(number)
fact_tree[div] = 1 if div not in fact_tree.keys() else fact_tree[div] + 1
number = int(number / div)
if number == 1:
return fact_tree
def recombine(num_tree, dem_tree):
num, dem = 1, 1
for key, value in num_tree.items():
num *= key ** value
for key, value in dem_tree.items():
dem *= key ** value
return [num, dem]
def simplify(inputset):
num_tree = tree(inputset[0])
dem_tree = tree(inputset[1])
for key in num_tree.keys():
if key in dem_tree.keys():
num_amount, dem_amount = num_tree[key], dem_tree[key]
num_tree[key] = num_amount-dem_amount if num_amount>dem_amount else 0
dem_tree[key] = dem_amount-num_amount if dem_amount>num_amount else 0
return recombine(num_tree, dem_tree)
for inputset in inputs:
print(simplify(inputset))
aW5wdXRzID0gWyg0LDgpLCAoMTUzNiw3ODM2MCksICg1MTQ3OCwgNTUzNiksICg0NjQxMCwgMTE5MzQwKSwgKDc2NzMsIDQ3MjkpLCAoNDA5NiwgMTAyNCldCgpkZWYgZmluZEZpcnN0RGl2aXNvcihudW1iZXIpOgogICAgZm9yIGkgaW4gcmFuZ2UoMiwgbnVtYmVyKToKICAgICAgICBpZiBudW1iZXIgJSBpID09IDA6CiAgICAgICAgICAgIHJldHVybiBpCiAgICByZXR1cm4gbnVtYmVyCgpkZWYgdHJlZShudW1iZXIpOgogICAgZmFjdF90cmVlID0ge30KICAgIHdoaWxlIGZpbmRGaXJzdERpdmlzb3IobnVtYmVyKToKICAgICAgICBkaXYgPSBmaW5kRmlyc3REaXZpc29yKG51bWJlcikKICAgICAgICBmYWN0X3RyZWVbZGl2XSA9IDEgaWYgZGl2IG5vdCBpbiBmYWN0X3RyZWUua2V5cygpIGVsc2UgZmFjdF90cmVlW2Rpdl0gKyAxCiAgICAgICAgbnVtYmVyID0gaW50KG51bWJlciAvIGRpdikKICAgICAgICBpZiBudW1iZXIgPT0gMToKICAgICAgICAgICAgcmV0dXJuIGZhY3RfdHJlZQoKZGVmIHJlY29tYmluZShudW1fdHJlZSwgZGVtX3RyZWUpOgogICAgbnVtLCBkZW0gPSAxLCAxCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBudW1fdHJlZS5pdGVtcygpOgogICAgICAgIG51bSAqPSBrZXkgKiogdmFsdWUKICAgIGZvciBrZXksIHZhbHVlIGluIGRlbV90cmVlLml0ZW1zKCk6CiAgICAgICAgZGVtICo9IGtleSAqKiB2YWx1ZQogICAgcmV0dXJuIFtudW0sIGRlbV0KCmRlZiBzaW1wbGlmeShpbnB1dHNldCk6CiAgICBudW1fdHJlZSA9IHRyZWUoaW5wdXRzZXRbMF0pCiAgICBkZW1fdHJlZSA9IHRyZWUoaW5wdXRzZXRbMV0pCgogICAgZm9yIGtleSBpbiBudW1fdHJlZS5rZXlzKCk6CiAgICAgICAgaWYga2V5IGluIGRlbV90cmVlLmtleXMoKToKICAgICAgICAgICAgbnVtX2Ftb3VudCwgZGVtX2Ftb3VudCA9IG51bV90cmVlW2tleV0sIGRlbV90cmVlW2tleV0KICAgICAgICAgICAgbnVtX3RyZWVba2V5XSA9IG51bV9hbW91bnQtZGVtX2Ftb3VudCBpZiBudW1fYW1vdW50PmRlbV9hbW91bnQgZWxzZSAwCiAgICAgICAgICAgIGRlbV90cmVlW2tleV0gPSBkZW1fYW1vdW50LW51bV9hbW91bnQgaWYgZGVtX2Ftb3VudD5udW1fYW1vdW50IGVsc2UgMAoKICAgIHJldHVybiByZWNvbWJpbmUobnVtX3RyZWUsIGRlbV90cmVlKQoKCmZvciBpbnB1dHNldCBpbiBpbnB1dHM6CiAgICBwcmludChzaW1wbGlmeShpbnB1dHNldCkp