收藏 分享(赏)

数论入门教程v0.0.doc

上传人:kpmy5893 文档编号:7748025 上传时间:2019-05-25 格式:DOC 页数:3 大小:42KB
下载 相关 举报
数论入门教程v0.0.doc_第1页
第1页 / 共3页
数论入门教程v0.0.doc_第2页
第2页 / 共3页
数论入门教程v0.0.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

1、ACM 数论入门前言数论就像一杯毒酒,美,却令人蛋碎。俺, 2011一般来说,数论书上的证明都又屎又长,其实数论的很多东西我认为有着更直接的理解方式,特别是引入群论这个强大的工具之后,很多需要繁琐证明的结论都成了“显然” ,这也是我写这篇文章的动因。当然那些教程自有其存在的原因不是所有人都搞 ACM(能深刻理解递归),也不是所有人都懂群论。所以我还是介绍一下其他的经典教材:数论概论:简单实用。给非数学专业学生上课用的,可以说是扫盲级别的教材但是,就是这本书吃透了前半部分,ACM 的数论题绰绰有余了。初等数论及其应用:上一本的扩充版,作者 Rosen 讲问题非常清晰,节后的习题不仅非常丰富全面,

2、还会对该章节的主题进行扩展,让读者自己去研究探索。另外很注重对数论的应用。哈代数论:您看懂了?求交往UESTC_TeamZ1 最大公约数开始讨论这个话题之前我们还是来定义一些以后会用到的符号,比如说“|” 。这个根竖线呢,不是分隔符,而是表示整除。a|b 意味着 b=a*k (k 是一个整数)。比如说有3|6,4|12。注意任意整数 a,有 a|0。有了这个简洁的符号,就开始讨论公约数这个话题。两整数 a,b 公约数的定义是 k|a并且 k|b,则 k 就是 a,b 的一个公约数。1.1 算术基本定理与最大公约数如何求最大的公约数呢?一个思路是利用算术基本定理。算术基本定理听上去很神(装逼适用

3、) ,其实就是说一个数能被唯一分解成若干质因子的乘积。这不是显然的么?嗯,在群众喜闻乐见的整数集上确实成立,但是在另外一些奇怪的集合上就未必了。不过,ACM题一般也不会涉及到那些(当然你学好了数论可以去出这种题坑人 XD) 。一个数 a 能成为另一个数 b 的因子则意味着 a 的质因子集合是 b 质因子集合的子集,当 a 的质因子集合与 b 的质因子集合相等的时候,即 a=b 的时候,得到最大的因子。那么a,b 的公因子就是a 的质因子b 的质因子的子集,其中最大的,当然就是该集合本身了。如何求a 的质因子b 的质因子(也就是最大公约数)呢?显然有: )econvicfr .(5*32*0.

4、,. ),mi()2,mi()1,in(21bnababana ppgbp(注意:Pi 表示自然数集上的第 i 个质数,而不是 a 或 b 的第 i 个质因数(参考 0 的质因数分解定义)在 ACM 界,有一个万用的证明结论的简单方法,它的名字叫“显然” 。在这个地方我也用“显然”就这么混过去算了。于是我们得到了一个求最大公约数的方法,分解质因数,然后求交集。不过分解大数的质因数非常困难,在 RSA 分解挑战上可以看到,截止 2007 年,一些两百位的整数都还没有被人分解。1.2 欧几里得算法当然,还有一个更好的方法求最大公约数,那就是有名的欧几里得算法。设 gcd(a,b)表示 a,b 的最

5、大公约数。假设 ab1,我们有: ),gcd(),gcd(baba这个当然是要证明的(也很简单):d 表示 a,b 的公约数d|a 并且 d|ba=k1*d 并且 b=k2*da-b=(k1-k2)*d这意味 a 和 b 的公约数同 a 和 a-b 的公约数完全相同!这有啥用?搞 ACM 的都懂递归吧?这意味着我们可以把求 gcd(a,b)转化为求 gcd(a-b,b),并且我们每次都是拿其中大数减去小数,整个问题的规模会不断缩小!递归当然要研究递归的边界是啥。首先吧,如果较小数是 0,那就开始循环了(gcd(a-0,0)=gcd(a,0)。gcd(0,a)是个啥呢?根据我们的对 0 分解质因

6、数的定义,那当然就是 a。如果没有 0 呢?可以看到我们的减法过程保证了不会出现负数,并且每搞一下两数的和的不断减小。和不断减小,且没有负数,这就保证了一定会搞出 0。这里还有几个问题:1 尼玛那啥我艹的 0 的什么定义啊?太流氓了有木有?gcd(0,a)居然是 a!特么我觉得该是 0 啊!这确实是一个问题。先证明 gcd(a,b)=gcd(a+b,a)。令 a-b=c,代入我们之前的公式可以得到 gcd(c+b,b)=gcd(c,b)。证明完毕。gcd(0,a)=gcd(0+a,a)=gcd(a,a)=a。这下你没话说了吧。2 那好吧,如果搞成 gcd(0,0)了肿么办?除非一开始 a=b=

7、0,否则不会出现这种情况。gcd(a,b)-gcd(a-b,b)这样搞一把:两个正数的情况:最多把一个正数搞成 0。一个正数一个 0 的情况:已经搞不动了。证明完毕。3 那我想知道 gcd(0,0)的值是啥我说了怕你不懂。好吧,如果你一定要知道的话,答案就是:gcd(0,0)=1/0。当然在程序实现中一个更常用的形式是 gcd(a,b)=gcd(b,a%b)。设 a=q*b+a%b,则a%b=a-q*b。其实就是一次性在 a 上减了 q 次 b,减到 a 比 b 小,然后交换大小顺序罢了。就是:gcd(a,b)=gcd(a-b,b)=gcd(a-2*b,b)=gcd(a-q*b,b)=gcd(

8、a%b,b)=gcd(b,a%b)。好了,这就是最大公约数了,请务必认真理解,因为这是后面许多问题的基础。我就讲这么多,这东西越讲越伤心 21 ab 则交换 a,b,并且显然有 gcd(a,b)=gcd(b,a),这么假设完全没问题2每次想到几千年前欧几里得就发明了这么神的算法,我这种只会喷汁的 90 后就不禁悲从中来不可断2 线性方程这次我们要来讨论线性方程:a 1x1+a2x2+anxn=c。ai,c 均为常数哦,变元是 xi 哦亲。并且,ai,xi,c 统统都是整数哦(非常重要的条件)!看上去很困难的样子呢?对于不懂数论的人来说确实让我们先从最简单的开始吧。2.1 一个变元的情况: ax

9、=c这个够简单了吧如果 a|c,那么 x=c/a。否则无解(注意整数的限制条件)。2.2 两个变元的情况:ax+by=c首先证明(a-b)x+by 等价于 ax+by。如果 ax0+by0能够等于某个数 p,那么(a-b)x+by也有一组对应的 x1=x0,y1=y0+x0使之等于 p。反过来也容易证明如果(a-b)x+by 能够等于某个数 p,那么 ax+by 也有一组对应的解等于 p。令 l(a,b)=ax+by,我们有 l(a,b)=l(a-b,b)=l(0,gcd(a,b)=gcd(a,b)x。也就是ax+by=gcd(a,b)*x。现在就转化为了一个变元的情况了哦亲。2.3 多个变元

10、的情况:a 1x1+a2x2+anxn=c这还不会?逐项合并就好了a1x1+a2x2+anxn=gcd(a1,a2)x+a3x3+anxn=gcd(a1,a2,a3)x+a4x4+anxn=gcd(a1,a2an)*x还是一个变元的情况哦亲。2.4 求一组两个变元方程的解我们刚才利用等价性,把多变元的方程转化成了单变元的方程,但如果要让你给出原多变元方程的一组解肿么办?就是让你给出一组 x,y,满足 ax+by=c。我们先来考虑两个变元的情况。最简单的思路就是随着 gcd 的递归直接构造这样的一组解,即假设已知 l(b,a%b)的一组解 x,y,求递归的上一层 l(a,b)的一组解。bx+(a

11、%b)y=c=bx+(a-qb)y=bx+ay-qby=ay+b(x-qy)。这样就求出上一层的解。也就是说 bx0+(a%b)y0=c 则推出 ax1+by1=c 其中 x1=y0,y1=x0-qy0。其中 b*q+(a%b)=a。然后我们又知道递归的开始 gcd(a,b)*x=c 的解为 c/gcd(a,b)。所以,这个问题就解决了。2.5 求一组多个变元方程的解一开始我们知道 gcd(a1,a2an)*x=c 的解,然后就可以求出 gcd(a1,a2an-1)*x+anxn=c 的一组解。移项得到 gcd(a1,a2an-1)*x=c-anxn,然后又知道了 gcd(a1,a2an-1)*x=c-anxn的解这样重复下去,就可以得到整个方程的一组初始解了。绝

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报