补充2次:

你可以进行挨个验证,或者说只能这么做,用计算机辅助会好一些,程序如下。(不知道为什么缩进有问题,范围确实是2-12)

g = 2
for i in range(1,13):
print(g**i%13)

确实没用到,而且我确实没有看到教程限制k的取值的,u的取值是有限制的。

3^12319896 mod 13你可以自己算几个,3 mod 13=3 ,9 mod 13=9 ,27 mod 13=1 ,然后再往后四次五次方六次方的结果就又是这样3 9 1的循环,而k=12319896是正好可以整除3的,所以虽然12319896很吓人,但结果就是1。而且正因为这种巧合的存在,我们也觉得求解是正确的。

在本题中逆元运算的公式就是 x*(x的逆) mod 13 = 1,而1的逆元恰好就是1*1 mod 13 = 1 mod 13 =1,也就是1本身,并没有一个很好的写法。国内教程多把逆元记作x的负一次方,并没有看到什么很好的写法。感觉你那个答法可以。

 

补充:

对于a题除了按规则对2-p之间的数字进行暴力尝试以外没有什么更好的方法,所以我选择用python替我进行遍历,但我可以把python代码给你。

如果你想尝试的更快,可以先看x^(p-1)modp=1是否成立,再去检查之前的数值。

希望这个回答你能满意。

# 用辗转相除求最大公因子
def gcd(a, b):
r = a % b
while r != 0:
a = b
b = r
r = a % b
return b

# 欧拉函数
def euler(a):
cnt = 0
for i in range(1, a):
if gcd(a, i) == 1:
cnt += 1
return cnt

# 阶
def order(a, n, b):
# 输出b在mod(a)中的阶
# n是mod(a)群的阶
p = 1
while p <= n and b ** p % a != 1:
p += 1
if p <= n:
return p
else:
return -1

# 求本原元
def primitive_root(a):
n = euler(a)
for b in range(2, a):
if order(a, n, b) == n:
print(b)

p=13
primitive_root(p)

只要答案的话就在这里了,手写解答过程见附件,还额外附上了我总结的该加密方法的一般流程思路。

a. all possible generators: 2, 6, 7, 11

b. public key: p=13, g=2, y=3     secret key: p=13, g=2, u=4

c. ciphertext is (1, 7), a=1, b=7

d. m=b*(a^u)^(-1) mod 13=7=M

e. 因为该编码符合one-way trap door function的特点:

单向性:已知公钥,根据待发送信息计算出密文很容易

不可逆性:不知道私钥,很难从密文中还原出原始信息M

\"\" \"\"

Reminder
OK
作业代写,代写作业,作业辅导,辅导作业,作业问答,美国作业代写,留学生作业,留学生作业代写,数学作业,数学作业代写,统计作业代写,物理作业代写,金融作业代写,大学作业辅导 Keywords: 作业代写 代写作业 作业辅导 辅导作业 作业问答 美国作业代写 留学生作业 留学生作业代写 数学作业 数学作业代写 统计作业代写 物理作业代写 金融作业代写 大学作业辅导