XD现代密码学大作业-欧几里德及其扩展算法的实现

一、实验名称:欧几里德及其扩展算法的实现

二、实验原理:学习及其扩展算法。

三、实验目的:

1、掌握欧几里德算法求解最大公因子;
2、掌握欧几里德扩展算法求解乘法逆元。

四、实验内容:

1.编程实现:输入两个整数a和b,利用欧几里德算法计算两个整数的最大公因子gcd(a,b)。
2. 编程实现欧几里德扩展算法,计算gcd(a,b)=ax+by中的x和y。其中一个整数a是你的学号,另一个整数为素数p= f4f47f05794b256174bba6e9b396a7707e563c5b,求整数a在模p下的逆元。

五、实验器材(设备、元器件):

一台PC,安装Windows 10操作系统及VC++\Python开发环境等。

六、实验思路,代码及运行结果:

1.解题思路或方法:

欧几里德算法
众所周知,欧几里得算法gcd是用来求两个整数的最大公因子。其中gcd(a,0)或gcd(0,b)分别等于a和b。对于任意两个整数a,b(对其大小没有要求,不妨设a>=b),有gcd(a,b)=gcd(b,a mod b),这是欧几里德算法基本内容。只需a mod b等于0时,此时式子中的a自然是a和b的最大公因子。
欧几里德拓展算法
欧几里得拓展算法是用来计算乘法逆元的,并且两个数字最大公约数为1。我的学号是:XXXXXXXXXX(我的学号是7位,就不拿出来展示了,就用X表示了),素数p转为十进制后结果为:1398446195032410252040217410173702390108694920283。
既然已知p是素数,a又比p小,故a与p是互质的,符合欧几里德拓展算法的要求。给出正整数a和p,扩展的欧几里得算法可以计算a和p的最大公约数d,同时得到两个整数x和y满足:d=gcd(a, b) = ax+by。
根据扩展的欧几里得算法求乘法逆元:简单说,如果有:ab mod p = 1成立,则称a和b互为模p意义下的乘法逆元(a与b均与q互质)。若a与p互质,那么d=gcd(a, p)=1, 即 ax + py = 1, 于是 py = (-x)a+1
也即:ax(mod p)=1,于是x即为a在模p意义下的乘法逆元。
在欧几里得算法中,可以把过程写的更清晰一些:
(仍以d=gcd(a,p)=ax+py为例)
a = q1p + p1, p1=ax1+by1;
p = q2
p1 + p2, p2=ax2+by2;
p1 = q3p2 + p3, p3=ax3+by3;
… … … …
p(n-2) = q(n)p(n-1)+p(n), p(n)=ax(n)+b
y(n)
p(n-1) = q(n+1)p(n)+0
则:p(i-2) = q(i)p(i-1)+p(i)或 p(i) = p(i-2) - p(i-1)q(i)
又p(i-1) = ax(i-1)+by(i-1)且p(i-2) = ax(i-2)+by(i-2)
带入得:
x(i) = x(i-2)-q
x(i-2)
y(i) = y(i-2)-q
y(i-2)
求出x(i)(i为最大)的值,即为a在模p意义下的乘法逆元。
正常来说完成上述代码,实验到这里应该结束了,但是由于实验所涉及的a和p数字太大,c语言的代码并不能
直接运算,故在这里我们选择使用Python进行计算。

2.代码

欧几里得算法(c语言)


#include <stdio.h>
int gcd(int a, int b)
{	
	if (b == 0) return a;
	else
	{
		return gcd(b, a % b);
	}
}
int main()
{
	int a, b,temp;
	scanf_s("%d %d", &a, &b);
	if (a < b)
	{
		temp = a;
		a = b;
		b = temp;
	}
	temp=gcd(a, b);
	printf("%d和%d的最大公约数是%d", a, b, temp);
	return 0;
}

根据扩展的欧几里得算法求乘法逆元

#include<iostream>
using namespace std;

int exgcd(int a, int b, int& x, int& y) {
    if (b == 0)
    {   //最里面ax+0=a的情况,注意此时a经过多次递归已经不是刚开始的啊
        x = 1;
        y = 0;
        return a;
    }
    //要先调用ngcd来进到最里层确定x,y的值,从逐步到外层计算出x,y
    int ngcd = exgcd(b, a % b, x, y);
    //根据相关理论有如下的逆公式 x==y1,y==x1-a/b*y1
    int temp = x; 
    x = y;
    y = temp - a / b * y;
    return ngcd;
}
int inverse(int a, int p) {
    int x, y, gcd;
    gcd = exgcd(a, p, x, y);
    if (gcd == 1) {
        x = (x % p + p) % p;//保证x为正数;
        return x;
    }
    else {
        cout << "a,p不互质";
        return 0;
    }
}
int main() {
    //实际上是求ax + py = gcd(a,p) = 1  /a,p互质
    int a, p;
    cout << "请输入 a p" << endl;
    cin >> a >> p;
    cout << "a mod p的乘法逆元是" << inverse(a, p);

    return 0;
}

将以上的所有c语言代码转换为Python代码如下

a=int(input("请输入数字a:\n"))
p=str(input("请输入数字p:\n"))
p1=int(p,16)
#print(a,p1) 测试程序是否正确
x=1
y=0
def exgcd(a,b):
    global x
    global y
    if(b==0):
        x=1
        y=0
        return a
    ngcd=exgcd(b,a%b)
    temp=x
    x=y
    y=temp-a//b*y
    return ngcd
def inverse(a,p):
    global x
    gcd=exgcd(a,p)
    if(gcd==1):
        x=(x%p+p)%p
        return x
    else:
        print("a,p不互质")
c=inverse(a,p1)
print("a mod p的乘法逆元是:",c)
运行结果:

欧几里得算法
欧几里得算法
在Python的基础上使用扩展的欧几里得算法求乘法逆元
欧几里得拓展算法

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 西安电子科技大学(Xidian University)是中国一所具有悠久历史和优秀声誉的高等学府,以优秀的教学与研究水平闻名于国内外。在该校的学习与研究中,LaTeX被广泛应用于学术论文和科研工作中。 LaTeX是一种排版系统,以其专业、高效以及对数学公式的强大支持而受到广泛的喜爱。在西安电子科技大学,学生和研究人员常常使用LaTeX来撰写和排版学位论文、科研论文、报告以及其他学术文章。 LaTeX相比于传统的文字处理软件,具有更好的排版效果和稳定性。通过LaTeX的使用,学生们可以更好地控制文档的格式、结构和样式。LaTeX提供了丰富的模板和命令,使得学术论文的写作更加规范和标准化。 此外,LaTeX对于数学公式的支持非常强大。西安电子科技大学作为一所具有优势学科的大学,LaTeX在数学、电子信息科学等领域具有广泛的应用。使用LaTeX可以方便地插入和编辑各种复杂的数学符号和公式,使得科研工作更加准确和专业。 总结而言,西安电子科技大学非常重视学术研究和科学创新。在学校的教学和研究活动中,LaTeX作为一种强大的排版工具,被广泛应用于学术论文和科研工作中。学生和研究人员通过使用LaTeX,可以提升自己的写作和排版水平,更好地展示自己的研究成果,促进学术交流和合作。 ### 回答2: 西安电子科技大学是中国一所著名的综合性大学,其教育理念注重培养学生的创新精神和科研能力。为了方便学生进行学术写作和论文撰写,学校推荐学生使用LaTeX进行排版和编辑。 LaTeX是一种强大的排版系统,可以帮助用户创建高质量的科技论文、学术文章、书籍等。相比于传统的字处理软件,LaTeX具有更为精确的排版能力,尤其适用于数学公式、物理公式、化学方程式等科技类文档的编辑。 西安电子科技大学提供了一些LaTeX使用的指南和模板,帮助学生更加方便地使用LaTeX。这些指南包括基本编辑方法、数学公式的输入、参考文献引用等等。通过这些指南,学生可以更加快速地掌握LaTeX的使用技巧,提高论文的质量。 在西安电子科技大学,许多学生喜欢使用LaTeX来排版他们的学术论文。这是因为LaTeX提供了丰富的模板和宏包,使得学生可以轻松地实现文档的各种要求。同时,LaTeX的排版效果也更加美观、专业,提升了学术论文的质量和水平。 总之,西安电子科技大学推荐学生使用LaTeX进行论文写作,旨在培养学生的科研能力和创新意识。LaTeX的强大功能和方便使用的指南,将为学生在撰写高质量学术论文方面提供帮助。 ### 回答3: 西安电子科技大学是一所位于中国西安的高等学府,以其丰富的学科专业和优秀的师资队伍而闻名。在学院中,LaTeX是一种广泛使用的排版系统,被广泛应用于学术论文写作、出版和科研工作中。 首先,LaTeX具有丰富的功能和灵活的排版方式,可以帮助学生和教师们高效地书写和排版文档。由于其专业化和稳定性,LaTeX在学术界具有很高的信任度。西安电子科技大学的学生和教师们可以使用LaTeX来撰写各种论文、报告和演示文稿,并通过丰富的插件和宏包满足各种需要。 其次,西安电子科技大学也重视科研工作,LaTeX在科研领域中有着广泛应用。LaTeX可以帮助研究人员撰写复杂的科技论文、期刊文章,生成高质量的数学公式和图表,并支持文献引用和交叉引用等复杂的排版需求。通过使用LaTeX,研究人员可以更加专注于研究工作本身,提高科研工作的效率和质量。 最后,在西安电子科技大学,LaTeX也被广泛用于教学。教师们可以使用LaTeX来制作教学资料、课件和实验报告,达到更好的排版效果。学生们也可以通过学习和使用LaTeX,提升自己的文档排版技能,并在将来的学习和工作中受益。 总之,西安电子科技大学推崇和使用LaTeX,是因为LaTeX具有强大的排版功能和广泛的应用领域。LaTeX能够提高学术论文的质量,提升科研工作的效率,同时也为教学过程提供了良好的排版工具。在西安电子科技大学的教学和科研活动中,LaTeX发挥着重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值