仔细想来转专业到计算机学院还没发过博客,就把上学期刚做过的小作业分享一下
内容关键词:信息安全数学基础,求a模p*q的指数,python实现
- 问题描述
原题如下:
(题目源自陈恭亮老师的《信息安全数学基础》)
即已知两个不同的奇素数p和q,也已知一个整数a(a不是q或p的倍数,否则无解),在已知三个数的情况下,求出a模p*q的指数.
- 数学基础
要认识问题,首先要清楚以下概念与定理。
欧拉函数:
设p是一个正整数,则p个整数1,2,……,p-1,p中与p互素的整数个数,记作φ(p),即欧拉函数。若p为素数,那么显然φ(p)=p-1.
指数定义:
设p>1是整数,a是与p互素的正整数,则使得a^e≡1(mod p) 成立的最小正整数e叫做a模p的指数,记作ordp(a).
(显然,在本题中,由于p和q都为奇素数,所以a与p互素且a与q互素。则存在ordp(a)与ordq(a)。)
欧拉定理:
设p>1是整数,a是与p互素的正整数,则 a^φ(p) ≡ 1 (mod p).
要分析问题,还要清楚以下性质。
指数的基本性质:
设p>1是整数,a是与p互素的整数,则整数d使得 a^d ≡ 1 (mod p)的充分必要条件为 ordp(a) | d .
若(m,n)=1, ordmn(a)=[ordm(a),ordn(a)]
推论:
设p>1是整数,a是与p互素的整数,则 ordp(a) | φ(p).
同余式的基本性质:
设m 是一个正整数,设a ≡ b(mod m),如果d | m, 则a≡b(mod d)。
- 算法描述
数学层面分析问题:不妨设 e = ordp*q(a) , m=ordp(a), n=ordq(a).
则有下面如下等式:
a^e≡1 (mod p*q)
a^m≡1(mod p)
a^n≡1 (mod q)
(且e,m,n分别为a模p*q,p,q的指数)
再由上文性质,因为p|p*q,q|p*q, 不难得到:
a^e≡a^m≡1(mod p), a^e≡a^n≡1(mod q)
又因为m和n分别是满足对应等式的最小正整数,e也是满足对应等式的最小正整数,所以e应该等于m和n的最小公倍数。
算法层面描述:
- 首先应设计一个函数用于求解任意整数x模奇素数y的指数:令i从1开始遍历直至y-1,当i可以整除y-1时,计算(x^i)模y是否为1,若结果为1,则此时i即为x模y的指数,return i。通过该函数,即可求出上文的m和n。
- 在求出m和n之后,应设计一个算法用于计算m和n的最小公倍数e,显然e的大于或等于max(m,n),小于或等于m*n。所以设计如下算法:令i从max(m,n)遍历至m*n,当i既能被m整除,也能被n整除时,return i。此时将i值赋给e,则求出了a模p*q的指数e。
- 最后可以额外设计一个函数进行输入检验,当输入的p或q不是奇素数时进行报错,并令使用者重新输入。
四、算法实现
1.求x模y指数的函数代码:
#求出x模y的指数并返回 def index(x,y): for i in range(1,y): if (y-1)%i==0: if (x**i)%y==1: return i |
2.求x和y最小公倍数的函数代码:
#求出x和y的最小公倍数并返回 def common(x,y): f=x*y if x>=y: for i in range(x,f+1): if i%x==0 and i%y==0: return i if x<y: for i in range(y,f+1): if i%x==0 and i%y==0: return i |
3.检验输入数字x是否为奇素数的函数代码:
#检验x是否为奇素数 def check(x): if x%2==0: return False for i in range(2,x): if x%i==0: return False return True |
4.主函数部分:
#主函数部分 k=1 while k: a=int(input("请输入正整数a:")) p=int(input("请输入奇素数p:")) q=int(input("请输入另一个奇素数q:")) if check(q) and check(p):#当q和p全是奇素数时进行运算 m=index(a,p) n=index(a,q) e=common(m,n) print("a模pq的指数为:",e) else: print("p或q并不全是奇素数") k=int(input("输入1继续,输入0退出:")) |
#求出x模y的指数并返回
def index(x,y):
for i in range(1,y):
if (y-1)%i==0:
if (x**i)%y==1:
return i
#求出x和y的最小公倍数并返回
def common(x,y):
f=x*y
if x>=y:
for i in range(x,f+1):
if i%x==0 and i%y==0:
return i
if x<y:
for i in range(y,f+1):
if i%x==0 and i%y==0:
return i
#检验x是否为奇素数
def check(x):
if x%2==0:
return False
for i in range(2,x):
if x%i==0:
return False
return True
#主函数部分
k=1
while k:
a=int(input("请输入正整数a:"))
p=int(input("请输入奇素数p:"))
q=int(input("请输入另一个奇素数q:"))
if check(q) and check(p):#当q和p全是奇素数时进行运算
m=index(a,p)
n=index(a,q)
e=common(m,n)
print("a模p*q的指数为:",e)
else:
print("p或q并不全是奇素数")
k=int(input("输入1继续,输入0退出:"))
把之前写的复制了一下,估计问题不大
代码就是照着数学证明流程来的,没什么技巧
嗯,差不多就这样