euclidean algorithm gcd time complexity