乘法逆元学习

5 篇文章 0 订阅
3 篇文章 0 订阅

逆元

【1】定义:

逆元指在某种运算中,对一个数a进行逆运算可以等价为对一个数b进行原运算,此时称a与b互为逆元。

本文中的逆元均指模算术中的乘法逆元,即对于一个数a,如果存在b满足a*b≡1(mod p),则称a与b在模p意义下互为逆元。

由于同余的性质,我们在进行模算术除法时不能简单地除一个数,而应该乘该数的逆元。

【2】求法:

    (1)单点逆元

        a*b≡1(mod p)等价于p|a*b-1,整理得a*b-p*k=1,b,k为未知变量。此时可以用扩展欧几里得求解。时间复杂度O(log2 max(a,b))。

        特别地,如果p为质数,若p整除a,则显然无解,若p不整除a,则gcd(a,p)=1,由费马小定理,ap-1 ≡1(mod p),即a*ap-2 ≡1(mod p)。所以ap-2 与a互为逆元。可用快速幂求解。时间复杂度O(log2 p)。

    (2)区间逆元

        如果要求1~n的逆元,如果对每个值求单点逆元,复杂度将达O(nlog2 p),而存在一种逆元的递推求法,即从1~n-1的逆元可O(1)求出n的逆元。

【3】原理:

    记a的逆元为a-1 。此时我们求i的逆元。

    设p=i*q+r(0≤r<i),两边取模得i*q+r≡0(mod p),整理得r≡-i*q(mod p)。

    两边同时乘i和r的逆元,得i-1 ≡-q*r-1 又因为r-1 之前已经求出,所以可以O(1)算出。随后只需根据最小非负整数要求进行调整即可。

【4】代码:

    inv[1]=1;//1的逆元总是1
    for(int i=2;i<=n;i++) inv[i]=(p-p/i*inv[p%i]%p)%p;

【5】例题:

(1)NOIP2012 同余方程   题目链接

    题意:求一个数a在模b意义下的逆元,a,b≤2e9。

    题解:扩展欧几里得即可。

(2)Luogu P3811 【模板】乘法逆元 题目链接

    题意:求1~n在模p意义下的逆元。1n3e6,n<p<20000528

    题解:线性递推即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于仿射密码,它是一种基于模运算和线性变换的加密方法,其密钥生成、加密和解密过程如下: 1. 密钥生成 仿射密码密钥由两个参数a和b组成,其中a为密钥的乘法因子,b为密钥的加法因子。要求a与模数m互质,即gcd(a,m)=1。具体生成方法为随机选择a和b,然后检查它们是否符合上述要求,如果不符合则重新选择。最后将a和b打包成密钥。 2. 加密 对于要加密的明文P,先将每个字符转化为ASCII码,然后应用仿射变换E(x)=(ax+b) mod m,得到密文C。 例如,对于明文"network",将其转化为ASCII码,得到[110, 101, 116, 119, 111, 114, 107]。假设密钥为a=5,b=7,模数为m=26,则加密过程为: E(110) = (5 * 110 + 7) mod 26 = 15 E(101) = (5 * 101 + 7) mod 26 = 18 E(116) = (5 * 116 + 7) mod 26 = 9 E(119) = (5 * 119 + 7) mod 26 = 7 E(111) = (5 * 111 + 7) mod 26 = 12 E(114) = (5 * 114 + 7) mod 26 = 1 E(107) = (5 * 107 + 7) mod 26 = 15 因此,明文"network"加密后的密文为"PFJHMGQ"。 3. 解密 对于密文C,应用仿射变换的逆变换D(x)=a^-1(x-b) mod m,得到明文P。 其中a^-1为a关于模数m的逆元,即a * a^-1 mod m = 1。可以使用扩展欧几里得算法求得a和m的乘法逆元。具体解密过程为: D(15) = 21 D(18) = 4 D(9) = 20 D(7) = 23 D(12) = 9 D(1) = 8 D(15) = 21 因此,密文"PFJHMGQ"解密后的明文为"network"。 希望这样的解答可以帮助您更好地理解仿射密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值