当前位置:文档之家› 数论

数论

断断续续的学习数论已经有一段时间了,学得也很杂,现在进行一些简单的回顾和总结。

学过的东西不能忘啊。

1、本原勾股数:概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2首先,这种本原勾股数的个数是无限的,而且构造的条件满足:a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2其中s>t>=1是任意没有公因数的奇数!由以上概念就可以导出任意一个本原勾股数组。

2、素数计数(素数定理)令π(x)为1到x中素数的个数19世纪最高的数论成就就是以下这个玩意儿:lim(x->∞){π(x)/(x/ln(x))}=1数论最高成就,最高成就!!!有木有!!!3、哥德巴赫猜想(1+1)一个大偶数(>=4)必然可以拆分为两个素数的和,虽然目前还没有人能够从理论上进行证明,不过我根据科学家们利用计算机运算的结果,如果有一个偶数不能进行拆分,那么这个偶数至少是一个上百位的数!!所以在ACM的世界中(数据量往往只有2^63以下)哥德巴赫猜想是成立的!!所以拆分程序一定能够实现的4、哥德巴赫猜想的推广任意一个>=8的整数一定能够拆分为四个素数的和证明:先来说8=2+2+2+2,(四个最小素数的和)不能再找到比2小的素数了,所以当n小于8,就一定不可能拆分为四个素数的和!那么当n大于等于8,可以分情况讨论:(1)n&1==0(n为偶数),那么n就一定可以拆分为两个偶数的和那么根据哥德巴赫猜想,偶数可以拆分为两个素数的和,于是,n一定可以拆分为四个素数的和(2)n&1==1(n为奇数),n一定可以拆分为两个偶数+1由于有一个素数又是偶数,2,那么奇数一定有如下拆分:2+3+素数+素数得证。

5、欧拉函数(欧拉公式)欧拉函数ph(n)的意思是所有小于n且与n互质的数的个数比如说ph(12)=4,[1,5,7,11与12互质]欧拉公式a^ph(m)=1(mod m)6、费马小定理费马小定理是欧拉公式的一种特殊情况由于当p为质数的时候ph(p)=p-1这是显然的那么带入欧拉公式就得到了费马小定理a^(p-1)=1(mod p)p为质数(prime)7、抽屉原理抽屉原理其实是废话,关键在于运用这句废话是说,如果现在有3个苹果,放进2个抽屉,那么至少有一个抽屉里面会有两个苹果,这个很废话。

8、抽屉原理的运用抽屉原理本身只是一句废话,不过他的运用却非常强大现在假设有一个正整数序列a1,a2,a3,a4.....an,试证明我们一定能够找到一段连续的序列和,让这个和是n的倍数,该命题的证明就用到了抽屉原理我们可以先构造一个序列si=a1+a2+...ai然后分别对于si取模,如果其中有一个sk%n==0,那么a1+a2+...+ak就一定是n的倍数(该种情况得证)下面是上一种情况的反面,即任何一个sk对于n的余数都不为0对于这种情况,我们可以如下考虑,因为si%n!=0那么si%n的范围必然在1——(n-1),所以原序列si就产生了n个范围在1——(n-1)的余数,于是抽屉原理就来了,n个数放进n-1个盒子里面,必然至少有两个余数会重复,那么这两个sk1,sk2之差必然是n的倍数,而sk1-sk2是一段连续的序列,那么原命题就得到了证明了9、判断n!是否能够被m整除计算方法是把m进行质因数分解,看下m的每一个质因数是否能够在n!中找到;n!中间包含了多少个x(x是任意的一个数,不过一般情况下我们都只讨论x为质数),这种问题的答案是:n/x+n/(x^2)+n/(x^3).....[一直加到x的乘方不超过n],这个定理的证明也非常的简单,这里就不再赘述了根据以上观点,就可以分别计算m的每一个质因数是否被完全包含,如果有一个没有被包含,那么就不能被整除!10、因子和的计算方法神马叫因子和:一个数的所以因子的和就叫因子和。

好吧,举个例子:12的因子和为:1+2+3+4+6+12计算方法是把12分解为质因数的表达形式2^2*3那么他的因子和就是:(1+2+2^2)*(1+3)证明写起来比较麻烦,大体上思路就是牛顿二项式。

11、判断组合数C(n,m)的奇偶性有一个我也不知道证明的方法当n&m==m为奇数,反之就是偶数就总结到这儿了。

以前大一也总结过一片类似的,不过那时候之总结了一点关于欧几里得算法之类的。

数论专题总结膜拜AekdyCoin!!!大多数东西都从他那里学来的。

写了好久。

慢慢读下来,涵盖的东西还是比较都多的。

写的还不完善。

同余问题:同余问题一般来说有三类:线性同余方程(这个可以用扩展GCD解决),高次剩余问题,组合数取模(阶乘取模)问题。

模方程问题:注意一下一些基本问题,对于模方程:ax=b(mod n)a.解存在的条件:gcd(a,n)|bb.解个数:gcd(a,n)c.解范围:[0,n-1]中国剩余定理考虑合并方程组 x = ai (mod mi),mi两两互质。

记Mi = M / mi. 构造方程Mipi + miqi = 1记ei = Mipi新的解等于sum[eiai]组合数取模:组合数取模根据n,m,p规模不同,分别有不同的解决方法。

1. N,m <= 10^100,p <= 10^5且p是素数不要被n,m的规模吓到…实际上看到p <= 10^5且P是素数的时候,就会发现算法规模只与p 有关,所以…废话不多说,这个规模直接lucas定理就好了啦Lucas定理:c(n,m) % p = c(n % p,m % p) * c(n / p,m / p)% p这里会存在一个问题哦,算的过程中出现n % p < m % p怎么办,答案直接return 0另外,边界条件:c(n,0) = 1相关题目:Bzoj 1951 /JudgeOnline/problem.php?id=1951降幂大法+lucas定理N,m <= 10^100,p <= 10^9,p是素数这个时候……貌似跟上面差不多。

但是……需注意一个问题, c(n % p,m % p)我们在做lucas 定理的时候需要预处理,此时P也很大, 预处理不出来。

方法:分块打表。

只保存sqrt(p)个n!的值,c(n,m) = n! / (m! * (n – m)!),P是素数,可以直接乘法 逆元。

所以时间就是logP * sqrt(P)相关题目:无,本题纯属YY = =从以上问题我们可以发现,不论n,m多大。

只要P是个素数,Lucas定理是相当好用的。

N,m <= 10^9,p <= 10^6,p不是素数,注意此时P虽然不是素数,但不是很大介绍这个之前。

我们先来介绍一下n! / m!。

N,m <= 10^10,p <= 10^6且P是素数怎么做。

(此时算的就是阶乘/阶乘,不能再套用Lucas定理)这个我们转化成乘法逆元来做 令n! = (p^a) * u, m! = (p^b) * w显然a >= b。

若a > b 此时n! / m!是p的倍数。

那么余数为0若a == b,此时我们只需要算u / w。

由于w与p互质,u / w可以直接算u*w的逆元。

好吧,现在开始讨论如何计算u/wN! = 1 * 2 * … * (p – 1) * 1p *(p + 1) * (p + 2) * … (2p – 1) * 2p * …(kp + 1) * (kp + 2) * .. (kp – 1) * kp * …((k +1)p + 1) * ((k + 1)p + 2) * .. ((k +1)p + t)K = n / p,t = n % p注意到 1和(p + 1),2和(p+2)…都是同余的。

所以我们的式子可以化成:((p – 1)!)^k * t! * k! * p^k,k!哪里出现的?注意到1p,2p..kpP^k我们提取出来,(p – 1)!和t!可以预处理,现在需要处理的是k!即(n/p)!,所以我们现在问题转化成计算k!,那么递归下去即可。

好吧。

现在讲讲n,m <= 10^9,p <= 10^6,p不是素数怎么做首先,我们应该把p分解成pi^ci的形式。

直奔主题,讨论如何把n!分解掉。

首先,我们把1..n中p的倍数提取出来,那么由于mod p^c.所以提取后会有若干段循环:1 * 2 * … * (p – 1) * (p + 1) * (p + 2) *… *(p^c – 1)令k = n / (p^c), t = n % (p^c),kk = n / pN!= P[p^c – 1]^k * P[t] * p^kk * kk!注意这里的P[p^c-1]是没有把p的倍数乘进来。

同上,只要递归计算kk!相关题目:spoj sequence高次剩余问题a^x = b(mod c)看起来十分平常可爱的方程其实蕴藏了无限的奥秘……1.知道a,x,c求b(100%有解)2.知道a,b,c,求x (有可能无解)3.知道x,b,c,求a(依然有可能无解)4.知道a,x,c,求某区间范围内的c(持续有可能无解)5.对2,3类问题我们还可以分别进行升级,求解的个数…)从1到4,求解的难度是越来越大的.1.知道a,x,c求b,100%有解我们可以快速幂。

说到快速幂,另外说一下,如果那个底数也很大,那么注意要使用快速乘,不然可能会爆掉……何为快速乘?计算a*b%c可以用一个类似于快速幂的东西S = 1;While (b) {If (b & 1) s = s + a;B >>= 1;A = a + a;}当然,如果x很大的时候。

求幂大法:A^x = a^(x mod phi(c) + phi(c)) x >= phi(c)这里我们要加深对这个东西的理解。

注意使用条件 x >= phi(c)这个东西一般可以用来计算一类看似碉堡的超级幂问题。

f(N) = a^f(n-1) ,f(1) = a。

这个幂次是飞上去的。

(注意与f(n) = f(n-1)^a区分,这个幂次可不会飞哦,一个是上次结果做幂,一个是把上次结果做底数)其实如果使用降幂大法。

瞬间就变成了大水题。

f(n) = a^[f(n – 1) % phi(c) + phi(c)]然后我们现在要计算的变成了f(n-1)%phi(c)那么f(n-1)%phi(c) = a^[f(n-2)%phi(phi(c)) + Phi(phi(c))]然后我们迭代logC层下去以后,phi(c)就变成了1,此时不用计算下去,问题得到解决。

这里要讲的是x >= phi(c)这个问题。

我们在递归回来的时候,要判断一下f(n-1)是否大于等于phi(c).if (b >= phi) b %= phi,flag = true;if (flag) b = b + phi;(当b < phi的时候,b是不能加上phi的)。

相关主题