线性推逆元

inv[i]inv[i]inv[i]表示iiimmm的逆元
t=m/i,k=m%it=m/i,k=m\%it=m/i,k=m%i
t∗i+k=0(modm)t*i+k=0(mod m)ti+k=0(modm)
−t∗i=k(modm)-t*i=k(mod m)ti=k(modm)
同除以i∗ki*kik
−t∗inv[k]=inv[i](modm)-t*inv[k]=inv[i](mod m)tinv[k]=inv[i](modm)
inv[i]=(m−m/i)∗(inv[m%i])%minv[i]=(m-m/i)*(inv[m\%i])\%minv[i]=(mm/i)(inv[m%i])%m

任务描述 仿射密码为单表加密的一种,字母系统中所有字母都利用一个简单数学方程加密,对应至数值或转回字母。 本关任务:用 c++ 实现仿射密码,然后对输入的密文字符串进行仿射解密后打印输出。 相关知识 为了完成本关任务,你需要掌握: 1.同余方程; 2.欧拉函数; 3.逆元; 4.仿射密码的密码体制; 5.费马小定理; 在仿射密码中,加密函数定义成为: e(x)=(ax+b)(mod 26) 我们知道,密码体制需要满足单射性,在当前密码体制下,一个明文只能对应一个密文,所以为了保证上面加密的式子的单射性,我们需要加一些限制条件,这些限制条件由一些定理来支撑,下面给出这些定理。 同余方程 定义 设a∈Z m ​ ,对任意的b∈Z m ​ ,同余方程ax≡b(mod m)有唯一解x∈Z m ​ 的充分必要条件是gcd(a,m)=1(这里的gcd的意思是最大公约数的意思)。 下面我们会看到只有a和m互质,a才会有关于m的逆元,才会有唯一解。 假设m=26,因为26=2×13,故所有的与26互质的数为a=1,3,5,7,9,11,15,17,19,21,23,25。 b的取值可以是Z 26 ​ 中的任何数。因此仿射密码的密钥空间为12×26=312。 下面是代码实现: constexpr int m=26; // 模数 mod 取值为26 cout<<"a="; for(int i=1; i<m; i++) if(m%i!=0) //判断m是否可以整除i cout<<i<<' '; //输出与m互质的数 输出结果: a=1 3 5 7 9 11 15 17 19 21 23 25 欧拉函数 定义 设a≥1,m≥2且均为整数。如果gcd(a,m)=1,则称a与 m 互质。Z m ​ 中所有的与 m互质的个数使用ϕ(m)来表示(这个函数称为欧拉函数)。 定义 假定 m=∏ i=1 n ​ p i e i ​ ​ 这里的p i ​ 均为素数且互不相同,且e i ​ >0,1≤i≤n。则 ϕ(m)=∏ i=1 n ​ (p i e i ​ ​ −p i e i−1 ​ ​ ) 根据上面关于欧拉函数ϕ(m)的公式,可出来在仿射密码中密钥空间的大小为m∗ϕ(
04-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值