Временная сложность алгоритма Евклида

Опубликовано: 23 Сентября, 2022

В этой статье мы обсудим временную сложность алгоритма Евклида, которая составляет O (log (min (a, b)) и достигается.

Алгоритм Евклида : это эффективный метод нахождения НОД (наибольшего общего делителя) двух целых чисел. Временная сложность этого алгоритма O(log(min(a, b)) , Рекурсивно это может быть выражено как:

gcd(a, b) = gcd(b, a%b)
where, a and b are two integers.

Доказательство. Предположим, что a и b — два целых числа, такие что a > b , тогда в соответствии с алгоритмом Евклида:

gcd(a, b) = gcd(b, a%b)

Используйте приведенную выше формулу несколько раз, пока не достигнете шага, на котором b равно 0 . На этом шаге результатом будет НОД двух целых чисел , который будет равен a . Таким образом, после тщательного наблюдения можно сказать, что временная сложность этого алгоритма будет пропорциональна количеству шагов, необходимых для уменьшения b до 0 .

Предположим, что количество шагов, необходимых для уменьшения b до 0 с помощью этого алгоритма, равно N .

gcd(a, b) ------> N steps

Теперь, если алгоритм Евклида для двух чисел a и b сокращается за N шагов, тогда a должно быть не менее f (N + 2) , а b должно быть не менее f (N + 1) .

gcd(a, b) ——> N steps
Then, a >= f(N + 2) and b >= f(N + 1)
where, fN is the Nth term in the Fibonacci series(0, 1, 1, 2, 3, …) and N >= 0.

Чтобы доказать приведенное выше утверждение, используя принцип математической индукции (PMI):

  • Базовый вариант:
    • Предположим, что a = 2 и b = 1 . Тогда gcd(2, 1) уменьшится до gcd(1, 0) за 1 шаг, т. е. N = 1 .
    • Это означает, что 2 должно быть как минимум f 3 и 1 должно быть как минимум f 2 и f 3 = 2 и f 2 = 1 .
    • Это означает, что a по крайней мере f (N + 2) и b по крайней мере f (N + 1) .
    • Можно сделать вывод, что утверждение верно для базового случая.
  • Индуктивный шаг: Предположим, что утверждение верно для (N – 1) -го шага . Итак, ниже приведены шаги, чтобы доказать это для N -го шага :

gcd(b, a%b) ——> (N – 1) steps
Then,  
b >= f(N – 1 + 2) i.e., b >= f(N + 1)
a%b >= f(N – 1 + 1) i.e., a%b >= fN

  • Это также может быть записано как:

a = floor(a/b)*b + a%b

floor(a/b)*b означает наибольшее число, ближайшее к b.

пример - пол (5/2) * 2 = 4. Если мы затем добавим 5% 2 = 1, мы получим (= 5) обратно.

  • Теперь (a/b) всегда будет больше 1 (так как a >= b). Итак, из приведенного выше результата следует, что:

a >= b + (a%b)
This implies, a >= f(N + 1) + fN

  • Известно, что каждое число является суммой двух предыдущих членов ряда Фибоначчи. Отсюда следует, что f (N + 2) = f (N + 1) + f N .

a >= f(N + 2) and b >= f(N + 1)

  • Поскольку приведенное выше утверждение справедливо и для индукционного шага. Это доказывает правильность утверждения.
  • Прежде чем продолжить, посмотрите на формулу Бине :

Формула Бине:

fN = {((1 + √5)/2)N – ((1 – √5)/2)N}/√5
          or
fN ≈ ∅N

  • где известно как золотое сечение (∅≈1,618) , а f N — N-е число Фибоначчи.
  • Теперь уже установлено, что временная сложность будет пропорциональна N, т. е. количеству шагов, необходимых для уменьшения b до 0 .
  • Итак, для доказательства временной сложности известно, что:

fN ≈ ∅N
N ≈ log(fN)

Теперь из приведенного выше утверждения доказано, что, используя принцип математической индукции, можно сказать, что если алгоритм Евклида для двух чисел a и b сокращается за N шагов , то a должно быть не менее f (N + 2) и b должно быть не менее f (N + 1) .

Из двух приведенных выше результатов можно сделать вывод, что:

=> fN+1 ≈ min(a, b)
=> N+1 ≈ logmin(a, b)

=> O(N) = O(N+1) =  log(min(a, b))