Tight time complexity for GCD

Revision en2, by Noam527, 2018-12-11 23:40:12

(prologue) Some time ago this crossed my mind, but I only recalled it now and I think it could be worth a small blog post. This is nothing big and rarely useful but nevertheless, I found it interesting so hopefully you will too (don't expect to find this enriching).

It is widely known that the time complexity to compute the GCD (greatest common divisor) of two integers a, b, using the euclidean algorithm, is .

Short proof

This bound is nice and all, but we can provide a slightly tighter bound to the algorithm:

We show this bound by adding a few sentences to the above proof: once the smaller element becomes 0, we know that the larger element becomes the resulting gcd. Therefor we can first bound by , and lastly notice that we can change the maximum to minimum, since after one step of the algorithm the current maximum is the previous minimum; min(a, b) = max(b, a % b) when a ≥ b.

This bound is of course negligible... for a single gcd computation. It turns out to be somewhat useful when used multiple times in a row. I'll explain with an example "problem":

(1) Given an array A of n integers in range [1, M], compute their greatest common divisor.

The solution is of course, we start with the initial answer G = A0, and iterate over all the remaining elements, assigning to G the value . The known time complexity analysis gives us the bound of , for computing gcd n times over values of order M. The tighter analysis actually gives a bound that is asymptotically better: (for practical values of M, you can refer to this as ). Why is that so? again, we can determine the time complexity more carefully:

The iteration over the array gives us the factor of n. Notice

Tags gcd

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en5 English Noam527 2018-12-12 00:22:53 0 (published)
en4 English Noam527 2018-12-12 00:22:15 946
en3 English Noam527 2018-12-11 23:58:39 835 Tiny change: ' \log(G_i)$' -> ' \log(G_i) = \log(G_0) - \log(G_{n-1}) < \log(G_0) \leq \log M$.'
en2 English Noam527 2018-12-11 23:40:12 1221 Tiny change: '\min(a, b)' -> '\min(a, b) = \max(b, a \, % \, b)$ when $a \geq b$.'
en1 English Noam527 2018-12-11 23:21:21 1653 Initial revision (saved to drafts)