Если у вас есть простой способ выяснить, каковы делители числа, вам нужно пройти через вашу последовательность только один раз:
def divisors(num):
yield 1
for i in range (2, int(num ** .5) + 1):
if num % i: # not divisible
continue
yield i
if i**2 != num:
yield num // i
Это довольно наивный метод поиска делителей числа.
Если необходимо также включить исходное число, вы можете изменить divisors
на
def divisors(num):
yield 1
if num == 1:
return
yield num
for i in range (2, int(num ** .5) + 1):
if num % i: # not divisible
continue
yield i
if i**2 != num:
yield num // i
Тогда вам понадобится структура для хранения количества времени, которое уже виден каждый делитель. collections.Counter
идеально подходит для этой цели
def previous_multiples(sequence):
counter = Counter()
for i in sequence:
yield counter[i]
counter.update(divisors(i))
Это дает для каждого числа, на сколько предыдущие числа делятся им. Затем он обновляет делители своими собственными делителями
Это можно назвать так max(previous_multiples(sequence))
Это торгует за время, которое требуется, чтобы найти делители каждого числа по сравнению со временем, которое требуется дляпроверить каждый элемент против всех предыдущих элементов.