【问题标题】:What is the fastest way to check if two given numbers are coprime?检查两个给定数字是否互质的最快方法是什么?
【发布时间】:2009-09-27 11:39:18
【问题描述】:

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

有更快的方法吗?

【问题讨论】:

    标签: algorithm number-theory greatest-common-divisor


    【解决方案1】:

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

    有一些替代方案的性能稍好一些(即,每个步骤的位数都是次二次的),但它们仅对非常大的整数有效。例如,请参阅On Schönhage's algorithm and subquadratic integer gcd computation

    【讨论】:

    • 我想评论一下,在不考虑算术运算成本的情况下衡量算术算法的复杂性有点粗略。
    • 当两个数字是斐波那契数列中的连续条目时,最坏情况的步数也是 O(log n)。
    • @Pavel Shved:我确实考虑了成本。参看。句子“每一步所需的平均计算时间是位数的二次方。”
    【解决方案2】:

    如果您在一台机器上运行除法/余数比轮班贵得多的机器,请考虑binary GCD

    【讨论】:

    • 刚刚在 f# 中实现了这个,它比传统的 Euclid 的 GCD 快 2 倍以上,不能给出确切的数字,因为有其他代码污染了我的测量,但是它的速度 > 2 倍。很高兴找到杰森。
    • 更新:单独做更好的数字:迭代:100000,Euclid Take:27ms,Binary GCD Tool:11ms(大约是 Euclid 的 40%)。太棒了!
    • @gatapia 关心你的 F# 的gist 吗?
    • @javadba 签出here最后一个名为 binGcd 的函数
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多