- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数论应用选讲
李学武
数论是研究数的性质的学科,是一门古老而充满现代魅力的数学学科。 数论基本上可分为初等数论、解析数论、代数数论等几个较大的分支。在古代,我国对数论的研究曾有过有辉煌的成就, 如孙子定理(国外文献一般称为中国剩余定理)、商高定理(勾股数)、圆周率的计算等等。在现代,我国一些著名的数学家,如华罗庚、王元、陈景润、潘承洞、丁夏畦等都在数论领域做出了一些举世公认的重要成果。
过去,人们把数论归类为纯粹数学,但现在在许多领域,数论的原理和定理都得到了广泛的应用。例如计算机的计算模型、硬件体系结构和软件的设计与实现、代数编码、计算机通信安全与密码学等方面, 都有着数论知识的广泛应用。近年来发展起来的一门新兴学科“算法数论”就是用计算机算法来研究和深化数论的理论。一个高层次的计算机专业人员,应该掌握数论的一些基础知识。
1.求解二元一次不定方程
我们的任务是解二元一次不定方程
ax+by=c ①
其中a,b,c都是整数,所求的解(x,y)也是整数。
方程①如果有解,则解不是唯一确定的,所以我们称①为不定方程。二元一次不定方程是一类重要的方程,应用很广。关于方程①的可解性,有下面的两个重要的结论:
(1)设gcd(a,b)表示整数a,b的最大公约数。方程①有解的充分必要条件是gcd(a,b)|c。(记号“x|y”表示x能整除y,即存在整数k,使y=kx)。
(2)如果(x0,y0)是方程①的一组解,则对任何整数t,(x0+bt,y0-at)也都是方程①的解。
许多讲数论的书都对这两个结论做了严格的论证。
下面我们讨论具体求解的方法。
为了避免计算中对负数和0的讨论,我们假定a0,b0,并且a=b。
假定方程①有解,即系数满足:gcd(a,b)|c,这时,c’=c/gcd(a,b)一定是个整数。我们先讨论下面的方程:
ax+by=f ②
其中f=gcd(a,b),右端项恰好是左边两系数的最大公因子。
显然,如果(x0,y0)是方程②的一组解,则(c’x0,c’y0)也是方程①的一组解,即
a(c’x0)+b(c’y0)=(c’f)=c。
在方程②中,取a=107,b=73,c=1,显然满足gcd(107,73)=1,方程
107x+73y=1 ③
有解。我们用类似于求最大公约数的辗转相除的方法求这个解。利用辗转相除,可以得到:
107=73*1+34, (1)
73=34*2+5, (2)
34=5*6+4, (3)
5=4*1+1, (4)
4=1*4。 (5)
为了消去(3)中的”4”,令 (3)*1-(4): 34=5*7-1 (6)
为了消去(2)中的”5”,令 (2)*7-(6): 73*7=34*15+1 (7)
为了消去(1)中的”34”,令(1)*15-(7): 107*15=73*22-1,
即:107*(-15)+73*22=1,于是,③的一组解为(-15,22)。
下面归纳一般的算法:
将(1)-(5)写成一般的形式:si=ti*qi+ri,
qi=si/ti,ri=si%ti,si+1=ti,ti+1=ri。
认真分析上面的规律,可以归纳出具体的求解方法。我们先用下面的表格列出相应的关系:
在下表中,i为辗转计算的次数。q[i]=s[i]/t[i]为相除得到的商。我们看到r[i]等于后面一列的t[i]。
i 0 1 2 3 4(end) 5 s[i] 107 73 34 5 4 t[i] 73 34 5 4 1 0 q[i] 1 2 6 1 4 r[i] 34 5 4 1 0 x[i] 0 1 2 13 15 y[i] 1 q[0]=1 3 19 22 表14-1
关键算法是x[k],y[k]的递推计算公式:
x[0]=0,x[1]=1; x[i+1]=x[i]*q[i]+x[i-1],当i1时。
y[0]=1,y[1]=q[0]; y[i+1]=y[i]*q[i]+y[i-1],当i1时。
当t[k]≠0且r[k]=s[k]%t[k]=0时,k就是最后一轮计算,这时,
x[k]=15,y[k]=22就是所要的结果,但要加上适当的符号后,才能得到原方程的解(x,y):
x=(-1)k-1x[k],y=(-1)ky[k]。
关于x[i]、y[i]的递推公式的推导较烦琐,就不在这里介绍了。
对于方程③,用这种方法可以求得x=-15,y=22。
程序:
#include stdio.h
void result_one(int a,int b
文档评论(0)