Algorithm 检查两个给定数字是否为互质的最快方法是什么?

Algorithm 检查两个给定数字是否为互质的最快方法是什么?,algorithm,number-theory,greatest-common-divisor,Algorithm,Number Theory,Greatest Common Divisor,一种方法是计算他们的gcd,并检查它是否为1 有更快的方法吗?欧几里德算法(计算gcd)非常快。当从[1,n]中均匀随机抽取两个数字时,计算其gcd的平均步骤数为O(logn)。每一步所需的平均计算时间在位数上是二次的 有一些替代方案的性能稍好一些(即,每一步的位数都是次二次的),但它们只对非常大的整数有效。看,例如, 如果你在一个机器上运行,其中除法/余数比移位要昂贵得多,考虑一下。我想评论一下,在不花费算术运算代价的情况下测量算术算法的复杂性有点粗糙。步骤的最坏例子是O(log n),当两个

一种方法是计算他们的gcd,并检查它是否为1

有更快的方法吗?

欧几里德算法(计算gcd)非常快。当从
[1,n]
中均匀随机抽取两个数字时,计算其
gcd
的平均步骤数为
O(logn)
。每一步所需的平均计算时间在位数上是二次的


有一些替代方案的性能稍好一些(即,每一步的位数都是次二次的),但它们只对非常大的整数有效。看,例如,

如果你在一个机器上运行,其中除法/余数比移位要昂贵得多,考虑一下。

我想评论一下,在不花费算术运算代价的情况下测量算术算法的复杂性有点粗糙。步骤的最坏例子是O(log n),当两个数字是斐波那契序列中的连续项时。@Pavel Shved:我确实考虑了成本。参见“每一步所需的平均计算时间在位数上是二次的”这句话。仅在f#中实现了这一点,其速度比传统欧几里德的GCD快2倍以上,无法给出准确的数字,因为有其他代码对我的测量结果产生了争议,但其速度却快了2倍以上。很好,杰森。更新:在隔离中做得更好:迭代次数:100000次,欧几里德耗时:27ms,二进制GCD工具:11ms(这大约是欧几里德的40%)。太棒了@gatapia想对F#?@javadba做一个
gist
,检查最后一个名为binGcd的函数