【笔记】Binary Extended Euclidean Algorithm

本文详细介绍了扩展欧几里得算法,包括除法版本、二进制版本以及无符号和有符号版本。该算法用于求解非负整数a和b的线性组合,得到最大公约数gcd(a, b)。文章通过代码示例和逻辑分析阐述了算法的实现过程,并特别讨论了在二进制移位操作中如何处理偶数和奇数的情况。" 5772579,895694,Windows环境下Xapian搜索引擎的编译与配置教程,"['Windows开发', 'C++', '搜索引擎', 'Xapian', '编译工具']
摘要由CSDN通过智能技术生成

扩展欧几里得算法

给定非负整数a, b,求解向量(u1, u2, u3),使得au1 + bu2 = u3 = gcd(a, b)。

扩展欧几里得算法的除法版本

引入辅助向量(v1, v2, v3),使得av1 + bv2 = v3 代码如下:

/// <summary>
/// 返回{x, y, gcd}, 使得<paramref name="a"/>x + <paramref name="b"/>y = gcd(<paramref name="a"/>, <paramref name="b"/>)
/// </summary>
public static int[] ExtendedEuclid(int a, int b)
{
    if (a < 0 || b < 0)
        throw new ArgumentOutOfRangeException("a and b should all be nonegative");

    if (a == 0) return new int[] { 0, 1, b };
    if (b == 0) return new int[] { 1, 0, a };

    var aZeros = a.NumberOfTrailingZeros();
    var bZeros = b.NumberOfTrailingZeros();
    var k = Math.Min(aZeros, bZeros);
    a >>= k; b >>= k;

    var u = new int[] { 1, 0, a };
    var v = new int[] { 0, 1, b };
    var t = new int[3];
    while(v[2] != 0)
    {
        var q = u[2] / v[2];
        t[0] = u[0] - v[0] * q;
        t[1] = u[1] - v[1] * q;
        t[2] = u[2] - v[2] * q;

        u[0] = v[0]; u[1] = v[1]; u[2] = v[2];

        v[0] = t[0]; v[1] = t[1]; v[2] = t[2];
    }

    u[2] <<= k;

    return u;
}

扩展欧几里得算法二进制版本

参考上述除法版本及二进制版本欧几里得算法。引入辅助向量(v1, v2, v3)。使得

av1 + bv2 = v3 

在v3右移1位过程中,当v1和v2同时为偶数时,可以直接移位,否则则需要将其调整为偶数后再移位。

a(v1 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值