欧几里得算法(求最大公因子)及欧几里得拓展算法(求最大公因子用两数的线性表示)

本文介绍了使用NTL库的ZZ类型实现的大整数欧几里得算法,包括基本的欧几里得算法(ZZEuclid1)和拓展算法。ZZEuclid1用于计算最大公因子,而拓展算法则通过逆过程给出最大公因子的表达式。代码中详细展示了这两个算法的实现,并给出了使用示例。
摘要由CSDN通过智能技术生成

ZZ为NTL库提供的一个长整数类型,若不要求对大整数进行操作,则将ZZ替换为int或long即可

欧几里得算法:

ZZ Euclid1(Vec<ZZ>& x, Vec<ZZ>& y, Vec<ZZ>& z, Vec<ZZ>& k, long* n,ZZ p, ZZ q)  //Euclid算法,求最大公因子
                                                                            //x存被除数,y存除数,z存余数
{
    long i;
    if(p>=q)
    {
        x[0] = p;
        y[0] = q;
    }
    else
    {
        x[0] = q;
        y[0] = p;
    }

    for (i = 0;(x[i] % y[i])>0; i++)
    {
        z[i] = x[i] % y[i];
        k[i] = x[i] / y[i];
        x[i + 1] = y[i];
        y[i + 1] = z[i];
    }
    k[i] = 1;
    n[0] = i;
    return y[i];

}

欧几里得拓展算法: 

该算法本身为欧几里得算法的逆算法,通过对欧几里得步骤取逆可得

代码如下:

    void Euclid_extension(ZZ a,ZZ b,ZZ c,Vec<ZZ> k)      // k为上面Euclid1函数得到的数组k

                                                                       //a,b为两个求最大公因子的数,c为最大公因子

{

f1 = k[i];
    f2 = k[i - 1];
    for(i=n[0]-2;i>=0;i--)     
    {

        f1 = f2;
            f2 = f2 * k[i] + k[i + 2];

    }
    if (a > b)
    {
        d = f1;
        x = -f2;
    }
    else
    {
        d = -f2;
        x = f1;
    }

   cout<<a<<"*"<<d<<"+"<<b<<"*"<<x<<"="<<c<<endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值