Как быстрее всего проверить, являются ли два заданных числа взаимно простыми?
-
18-09-2019 - |
Вопрос
Один из способов — вычислить их НОД и проверьте, равен ли он 1.
Есть ли более быстрый способ?
Решение
Алгоритм Евклида (вычисляет gcd
) очень быстро.Когда два числа случайно выбираются равномерно из [1, n]
, среднее количество шагов для вычисления их gcd
является O(log n)
.Среднее время вычислений, необходимое для каждого шага, квадратично по числу цифр.
Существуют альтернативы, которые работают несколько лучше (т. е. каждый шаг субквадратичен по количеству цифр), но они эффективны только для очень больших целых чисел.См., например, Об алгоритме Шенхаге и субквадратичном целочисленном НОД.
Другие советы
если вы работаете на машине, для которой деление/остаток значительно дороже, чем смены, подумайте двоичный НОД.
Не связан с StackOverflow