数论之欧几里德算法(三)

简介:
这一篇讨论一种欧几里德算法的经典应用。模线性方程,指形如:ax ≡ b(mod n) 的方程,在现实中有若干应用,例如在RSA公钥加密系统中的密钥查找。该方程可用扩展欧几里德算法求解,解的大小范围为[ 0 , n )。

算法:
运用扩展欧几里德算法解模线性方程其实是基于群论的,在这里不再赘述,如果把解的区间限制在整数范围内,那么方程有无穷解或者无解。因为无穷解在实际中并没有太大作用,所以我们一般考虑区间[ 0 , n )。
为了求解方程ax ≡ b(mod n),我们需要把方程转化成下面形式:
ax + ny = d , d = gcd(a , n)
如果d整除b,那么存在方程存在d个解;否则无解。
方程ax + ny = d , d = gcd(a , n)可以使用扩展欧几里德算法求解,通过使用扩展欧几里德算法,我们可以求得最大公约数d以及方程的一组解(x , y),若d整除b,我们可以通过这组解求得区间[ 0 , n )内的d个解。
首先我们需要求出最小解x0:

x%=n,x+=n,x%=n;
ans[0]=x*(b/d)%(n/d);

之后在x0的基础上不断增加n/d并取模即可。

代码:

vector<long long> modular_linear_equation(long long a,long long b,long long n)
{
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    vector<long long> ans;
    ans.clear();
    if(b%d==0)
    {
        x%=n,x+=n,x%=n;
        ans.push_back(x*(b/d)%(n/d));
        for(long long i=1;i<d;i++)
            ans.push_back((ans[0]+i*n/d)%n);
    }
    return ans;
}

extend_gcd函数的接口在这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值