【问题标题】:GCD algorithms for a large integers大整数的 GCD 算法
【发布时间】:2012-05-28 09:51:17
【问题描述】:

我正在寻找有关快速 GCD 计算算法的信息。 特别是,我想看看它的实现。

对我来说最有趣的: - 莱默 GCD 算法, - 加速 GCD 算法, - k-ary算法, - Knuth-Schonhage 与 FFT。 我完全没有关于加速 GCD 算法的信息,我只看过几篇文章,其中提到它是在中等输入(~1000 位)上最有效和最快速的 gcd 计算方法

从理论的角度来看,它们看起来对我来说很难理解。 任何人都可以分享代码(最好在 c++ 上)实现列表中的任何算法\部分或分享任何这样做的经验。我也将不胜感激任何信息、cmets、建议和地方调查。我有一个处理大整数的类,但我没有使用它的方法。当然,除了欧几里得和二进制 gcd 算法,我现在看起来很清楚;没有问题。 最后我想得到的主要内容:实现 lehmer gcd 的代码。 (从列表中更容易)

【问题讨论】:

  • 哇,第一个问题真的很好。不幸的是,我认为我们大多数人都不知道答案。知道的人可能需要一点时间才能看到这一点。对不起! :(

标签: algorithm complexity-theory double-precision greatest-common-divisor computation


【解决方案1】:

Knuth 在计算机编程的艺术第 2 卷第 4.5.2 节中详细探讨了 GCD。 Knuth 给出了算法 E 为欧几里得的原始方法,算法 A 为欧几里得算法的现代版本,算法 B 为二进制方法,算法 L 为 Lehmer 方法,以及算法 X 中的扩展欧几里得算法。我描述(附代码) original Euclidean algorithmmodern Euclidean algorithmbinary algorithmextended Euclidean algorithm 在我的博客上。

This paper 很好地描述了 Schönhage 算法的几个版本,包括代码。

【讨论】:

    【解决方案2】:

    非常感谢您的回答 user448810。那个二进制算法对我来说是完美的,而且速度很快。我将其转换为非递归形式以节省内存和递归调用。 这是我的 longnum 库的实现,为与标准运算符/函数不同的行添加了一些 rems

    longnum gcd(longnum x,longnum y)
        {
        x.sig=+1; x.integer(); // x=abs(int(x))
        y.sig=+1; y.integer(); // y=abs(int(y))
        longnum z; int x0,y0,sh=0;
        for (;;)
            {
            if (x.iszero()) { z=y; break; } // if (!x) ...
            if (y.iszero()) { z=x; break; } // if (!y) ...
            x0=x.a[_longnum_a1]&1; // x0=x&1
            y0=y.a[_longnum_a1]&1; // y0=y&1
            if ((!x0)&&(!y0)) { x>>=1; y>>=1; sh++; continue; }
            if (!x0) { x>>=1; continue; }
            if (!y0) { y>>=1; continue; }
            if (x<y) y-=x;
            else     x-=y;
            }
        return (z<<sh);
        }
    

    【讨论】:

    • 这是什么语言?
    • @vy32 C++longnum 类是我的定点大数,因此任何非标准操作都会被注释
    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多