Если все числа должны быть положительными, то я считаю, что есть гораздо более быстрое решение.
Пытаясь найти, можем ли мы получить от (a, b)
до, скажем (14, 31)
, мы можем заметить, чтоединственный способ с положительными числами достичь (14, 31)
- применить второе правило к (14, 17)
.Единственный способ добраться до (14, 17)
- применить второе правило к (14, 3)
.Единственный способ добраться до (14, 3)
- применить первое правило к (11, 3)
.Единственный способ (11, 3)
- применить первое правило к (8, 3)
и так далее.Таким образом, единственные значения, которые могут достигать (14, 31)
, это
(14, 31) # Final
(14, 17) # Rule 2
(14, 3) # Rule 2
(11, 3) # Rule 1
(8, 3) # Rule 1
(5, 3) # Rule 1
(2, 3) # Rule 1
(2, 1) # Rule 2
(1, 1) # Rule 1
Так что алгоритм довольно прост.Цикл на (c, d)
, заменяя его на (c - d, d)
, если c > d
и (c, d - c)
, если c < d
, останавливается, когда вы нажимаете на матч, когда c == d
, когда c < a
или d < b
.
Вариант этого, описанный в комментарии Пола Ханкина, - O(log n)
, хотя я не собираюсь пытаться это доказать.Эта версия O(n)
, где n
больше c
и d
.Последовательные числа Фибоначчи, вероятно, сделают большинство шагов.
Конечно, все это бессмысленно, если вы можете иметь отрицательные числа, поскольку первое правило, примененное к (-17, 31)
, также даст (14, 31)
, и вы вернетесь кэкспоненциальный.