Один из способов вычислить их НОД и проверить, если он равен 1.Каков самый быстрый способ проверить, являются ли два заданных числа взаимно простыми?
Есть ли более быстрый способ?
Один из способов вычислить их НОД и проверить, если он равен 1.Каков самый быстрый способ проверить, являются ли два заданных числа взаимно простыми?
Есть ли более быстрый способ?
Евклидский алгоритм (вычисления gcd
) очень быстрый. Когда два числа рисуются равномерно случайным образом от [1, n]
, среднее число шагов для вычисления их gcd
составляет O(log n)
. Среднее время вычисления, необходимое для каждого шага, является квадратичным по числу цифр.
Существуют альтернативы, которые выполняют несколько лучше (то есть каждый шаг является субквадратичным по количеству цифр), но они эффективны только для очень больших целых чисел. См., Например, On Schönhage's algorithm and subquadratic integer gcd computation.
Если вы работаете на машине, для которой разделение/остаток значительно дороже, чем сдвиги, рассмотрите binary GCD.
Спасибо, интересно прочитано –
да, очень хорошая статья. – Lazer
Только что реализовано это в f # и его более чем в 2 раза быстрее, чем традиционный GCD Euclid, не может дать точные числа, так как есть другой код, который меняет мои измерения, однако его> 2x быстрее. Хорошо найти Джейсона. – gatapia
Я хотел бы прокомментировать, что это немного грубо, чтобы измерить сложность арифметических алгоритмов, не принимая во внимание арифметические операции. –
В худшем случае количество шагов равно O (log n), когда два числа являются последовательными записями в последовательности Фибоначчи. –
@Pavel Shved: Я принял во внимание стоимость. ср предложение «Среднее время вычисления, необходимое для каждого шага, квадратично по числу цифр». – jason