Во-первых, этот метод не очень эффективен, чтобы найти lcm. Поскольку есть хороший и чистый алгоритм для поиска gcd, проще получить lcm a и b на lcm = a * b / gcd(a,b)
(*).
Во-вторых, никогда использовать pow с целочисленными значениями. Известно, что арифметика с плавающей запятой ломаная не точна.
Теперь на ваш вопрос. Операция обновления на 2 счетчиках не то, что вы хотите: вы теряете одно из значений, когда ключ присутствует в обоих диктовках. Вместо этого следует использовать объединение наборов ключей, а затем использовать максимум обоих значений (несуществующий ключ рассматривается как значение 0 для показателя степени):
...
# use a true dict to be able to later use the get method with a default
c = dict(Counter(fa)) #variables to save counter for a
d = dict(Counter(fb)) #variables to save counter for b
result = []
for key in sorted(set(c.keys()).union(set(d.keys()))):
exp = max(c.get(key, 0), d.get(key, 0))
for i in range(exp):
result.append(key)
return result
(*) Хитрость в том, что когда a> b, GCD (a, b) является GCD (b, mod (a, b)). В Python это дает сразу:
def gcd(a, b):
if b > a:
return gcd(b, a)
if b == 1:
return b
m = a % b
return b if m == 0 else gcd(b, m)
def lcm(a,b):
return a * b / gcd(a,b)