1、数论基础知识,刘汝佳,基本概念,整除与约数、倍数. 注意负数可整除性的基本性质若a|b, a|c, 则a|(b+c)若a|b, 那么对所有整数c, a|bc若a|b, b|c, 则a|c整除关系具有传递性. 它是偏序关系(partial order), 是一个格,素数和合数,如果大于1的正整数p仅有的正因子是1和p, 则称p为素数(prime)大于1又不是素数的正整数称为合数(compound)如果n是合数, 则n必有一个小于或等于n1/2的素因子,算术基本定理,每个正整数都可以惟一地表示成素数的乘积,其中素数因子从小到大依次出现(这里的“乘积”可以有0个、1个或多个素因子)。换句话说, 任意
2、正整数n可以写成n=2a1*3a2*5a3*,其中a1,a2,a3等为非负整数这个定理也叫做惟一分解定理。它是一个定理而不是公理!虽然在大多人看来,它是“显然成立”的,但它的确是需要证明的定理,除法和同余,令a为整数,d为正整数,那么有惟一的整数q和r,其中0rd,使得a=dq+r可以用这个定理来定义除法:d叫除数,a叫被除数,q叫商,r叫余数。如果两个数a,b除以一个数c的余数相等,说a和b关于模c同余,记作ab(mod c),同余,为什么有同余?132412341+432435.2=24.7余数可以作为原数的一个signature(标记).如果标记下的运算错误, 一定错误如果标记下的运算正
3、确?,最大公约数和最小公倍数,令a和b是不全为0的两个整数,能使d|a和d|b的最大整数称为a和b的最大公约数,用gcd(a,b)表示,或者记为(a,b)。令a和b是不全为0的两个整数,能使a|d和b|d的最小整数称为a和b的最小公倍数,用lcm(a,b)表示,或者记为a,b 定理: ab = gcd(a,b) * lcm(a,b),定理的证明,使用惟一分解定理. 设则有:容易验证定理成立,基本问题,如何求1n的所有素数?如何判断一个数n是否为素数?如何求两个数的最大公约数?如何给一个数n分解素因数?,问题1: 1n的素数,假设要求1100的素数2是素数, 删除2*2, 2*3, 2*4, ,
4、 2*50第一个没被删除的是3, 删除3*3, 3*4, 3*5,3*33第一个没被删除的是5, 删除5*5, 5*6, 5*20得到素数p时, 需要删除p*p, p*(p+1), p*n/p, 运算量为n/p-p, 其中p不超过n1/2(想一想, 为什么),Eratosthenes的筛子,小知识 (),近似公式(Legendre常数B=-1.08366),问题2: 素数判定,枚举法: O(n1/2), 指数级别改进的枚举法: O(phi(n1/2)=O(n1/2/logn), 仍然是指数级别概率算法: Miller-Rabin测试 + Lucas-Lehmer测试,Miller-Rabin测
5、试,对于奇数n, 记n=2r*s+1, 其中s为奇数随机选a(1=a=n-1), n通过测试的条件是as1(mod n), 或者存在0=j=r-1使得a2j*s-1(mod n)素数对于所有a通过测试, 合数通过测试的概率不超过1/4只测试a=2, 3, 5, 7, 则2.5*1013以内唯一一个可以通过所有测试的数为3215031751注意: 先要判断此数本身是否为2, 3, 5, 7的约数,思考:区间内的素数,给出n, m(n=106, m=105), 求nn+m之间的素数有多少个哪种方法快? 筛还是依次素数判定?,问题3: 最大公约数,方法一: 使用惟一分解定理, 先分解素因数, 然后求
6、最大公约数方法二: (Euclid算法)利用公式gcd(a, b)=gcd(b, a mod b), 时间复杂度为O(logb)方法三: (二进制算法) 若a=b, gcd(a,b)=a, 否则A和b均为偶数, gcd(a,b)=2*gcd(a/2,b/2)A为偶数, b为奇数, gcd(a,b)=gcd(a/2,b)如果a和b均为奇数, gcd(a,b)=gcd(a-b,b)不需要除法, 适合大整数,扩展问题,一定存在整数x,y,使得ax+by=gcd(a,b)int gcd(int a, int b, int 由数学归纳法可证明ax+by=gcd(a,b)满足ax+by=d的数对(x,y)
7、不是惟一的, 因为当x增加b且y减少a时和不变。,问题4: 分解因数,分解因数可以转换为求最小素因子(找到最小素因子后递归求解)分解素因数后得到惟一分解式sumpiki, 可以求出约数个数, 即所有ki+1的乘积(由乘法原理容易证明)方法一: 试除法方法二: pollard-rho算法,欧拉定理,欧拉函数: 1n中和n互素的元素个数(n)Euler定理 若gcd(a, n)=1则a(n) 1 (mod n)意义:当b很大时ab ab mod (n)(mod n),让指数一直比较小欧拉函数是积性函数,即当(m,n)=1时f(mn)=f(m)*f(n),思考:欧拉函数的计算,给定n,需要多少时间计
8、算(n)?给定n,需要多少时间计算(1), (2), , (n)的所有值?,线性同余方程,axb(mod n)方法一:利用Euler定理a*a(n)-1 1 a(b*a(n)-1) b关键: 求abmod na, a2, a4, a8, a16, 同余方程可以做乘法,b做二进制展开选择方法二:扩展的Euclid算法存在整数y,使得ax-ny=b 记d=(a,n),a=a/d, n=n/d,必须有d|bax-ny=1*(b/d)注意:x不唯一, 所有x相差n/d的整数倍,中国剩余定理,考虑方程组xai(mod mi), mi两两互素在0i时ei0(mod mj)则e1a1+e2a2+ekak就是
9、一个解, 调整得到0,m)内的唯一解(想一想,如何调整),整理一下,一般线性方程组aixibi(mod ni)axb(mod n) xb1(mod n1)xb1(mod n1) xb1(mod p1,i)用中国剩余定理其他规则同余方程二项方程: 借助离散对数(本身?)高次方程: 分解n, 降幂单个多变元线性方程: 消元法,例1. 传球游戏,N个人围圈玩传球游戏,开始时第一个人拿着球,每个人把球传给左手的第K个人。满足1KN/2。求K的最大值,使得第一个人重新拿到球之前,每个人都拿过球。,例2. Nikifor-3 (Ural 1095),给出一个数N,含数字1、2、3、4,把N的所有数字重新排
10、列一下组成一个新数,使它是7的倍数。,分析,把数字1、2、3、4从中抽出,然后把其他数字按照原顺序排列(事实上,怎么排列都无所谓)组成自然数ww*10,000整除7取余有7种可能,即是为0、1、2、3、4、5、6。这时如果能用数字1、2、3、4排列出7个数,使它们整除7取余的值分别为0、1、2、3、4、5、6,把这个4位数接在w后面即为问题的解。,例3. Street Numbers (UVa 138),找所有的(n, k), 满足:1+2+.+(n-1)=(n+1)+(n+2)+k输出按k排序的前10个,分析,整理得: n(n-1)=(k-n)(n+k+1)化简得: k2+k-2n2=0,
11、即n2=k(k+1)/2由于k和k+1互素, 因此要么k是完全平方数要么k/2是完全平方数分别设k=m2和2m2, 枚举m,例4. 天平,有一些砝码, 重量为1, 3, 9, 27, 81形如3k, 每个重量砝码只有一个. 任意给一个重量为m的物体, 把它放在天平左边, 如何把放置砝码使得天平平衡? 放在左边或者右边都可m=10100,例5. 987654321问题,求有多少个n位数平方以后的末9位为987654321。,例6. The Archeologists Dilemma (UVa 701),给出数字串X,求出最小的E使得X恰好出现在2E的最左边,且X的长度严格小于2E总长度的一半,分
12、析,设X右边还有n位,则有不等式A=log2X+nlog210=Elog2(X+1)+nlog210=B只要A和B中间至少有一个整数E,则E符号条件。从小到大枚举n即可。陷阱:累计误差,例7. Fermat vs Pythagoras(UVa 106),给N(=100,000),考虑满足x2+y2=z2(xyz=N)的三元组求x、y、z互质的三元组的个数和不属于任何三元组(不光是互质)的k(k=N)的个数.例(输入:输出)10: 1 4 25: 4 9 100: 16 27,例8. Number Game (UVa 10164),设N=2k, k为不超过10的正整数,每个都是不超过1000的正
13、整数。选出其中N个整数,使得它们的和S是N的倍数。例如N=4,有7个整数1, 2, 3, 4, 5, 6, 7,则可以选出1, 3, 5, 7,因为S=1+3+5+7=16是4的倍数,分析,K=1,3个数必有两个同奇偶,加起来即可K=2,7个数一定可以找到三对同奇偶的数(a1,a2),(b1,b2),(c1,c2),分别加在一起可以得到3个数,且都是2的倍数。把它们除以2后,变成了k=1的情形,本原三元组一定可以写成x=uv, y=u2-v2, z=u2+v2, 其中u, v互质, 其他是本原三元组的整数倍第一步. 预处理, 保存100,000内的所有本原三元组, 以z为关键字排序, di为z
14、0表示用在分子xi次,xi0表示用在分母-xi次。由于ai=5为素数,例12. Infinite Race (UVa 10627),AB总长度为L车一从A出发,速度为u车二从B出发,速度为v走到端点立刻返回,无时间损失开车总时间tu, v, t都是正整数相遇多少次?,分析,第一种相遇: 相向t(u+v)=(2k+1)L 第二种相遇: 同向t|uv|=(2k+1)L 重复: 在端点相遇第一次同时到达端点时刻为r到达不同端点?到达同一端点A和B分别运动2k1L和(2k2+1)L 下一次到达哪里?不同端点?又同时到达此端点?同时到达另一端点?t=(2k+1)r,分析,如何求r?r是L/u的整数倍(u
15、*r = k1L)r是L/v的整数倍r是L/gcd(u,v)的整数倍u/gcd(u,v) * r/(L/gcd(u,v) = k1r是满足条件的最小正数r=L/gcd(u,v),例13. Antiprime (POI 2001),正整数n是一个Antiprime数,如果这个数的约数个数超过比n小的任何数的约数个数。例如:1,2,4,6,12和24。 给定n(n=2*109),求不超过n的最大Antiprime数m,分析,M为1N中正约数最多的数中最小的一个设M的素因数分解式为M=sumPiKi. 设有t项,则t2*109)结论一:Pi为前t个素数结论二:Ki为非递增的目标是让约数个数,即Ki+
16、1的乘积尽量大12*109内最多有1536个约数,可以从大到小枚举每种约数个数f. 对于给定的f,深搜即可,速度很快. 贪心求近似解:将f分解成m个质因数相乘,然后减1后作为指数,例14. Weaker Goldbachs Conjecture (POI 2001),输入10=n=2*109, 把n表示成若干个互不相等的奇素数之和,分析,既然Goldbach猜想成立,可以找一个素数p,让n=n-p,继续求解.问题:素数需要不重复!解决:用枚举法在n/2, n中找最大的一个奇质数,可以保证n在1, n/2中,不可能再有素数重复的情况了,分析,新问题:n/2,n中一定存在素数吗?借助Goldbac
17、h猜想n为偶数时,n可以分解成p1+p2的形式(p1p2)。故p1,p2中有一个大于n/2。n为奇数时,n+1可以分解成p1+p2的形式(p1p2)。故p1,p2中有一个大于(n+1)/2 补丁:不能让n等于1,2,4,6或9复杂度分析:素数距离O(logn),例15. 模取幂,a, p, m, n均为正整数,a, p为素数1a, p, m, n65535,且n2a, n2p。求:如a=32719, p=54323, m=99, n=65399,则结果为46184,记f(a,p,m,n)为本题所求的数n=1时,任何数模n都是0,故f(a,p,m,n)=0,否则a=1时,a的任何次幂都是1,结果
18、为1;否则m=0时,结果为=a mod n;否则n=a时,a的次幂永远是n的倍数,结果为0;否则n=2a时,因为a, p 2,如果a中有2的因子,则a的次幂永远是n的倍数,结果为0,否则为a;否则a, n互素,f(a,p,m,n)=af(p,p,m-1,(n) mod n,问题转变成求ak mod n,可以二分求解,例16. 整数序列,已知A1,An、B、P求X1,Xn使得A1X1+AnXn = B(mod P),分析,设g=(A1,A2,An,P),若g不整除B则无解,否则我们可以用递归构造解:将A1,An、P和B全部除以g,此时(A1,An),P)=1,若n=1,则直接求X1使得A1X1
19、mod P=B;否则设(A1,An-1)=D,则根据欧几里德算法一定存在x和y使得ANx + Dy = B(mod p),可以令Xn=x , 则A1X1+An-1Xn-1=B-AnX=Dy(mod p),分析,(A1,An-1)=D, 所以(A1,An-1,P) = (D,P) | (Dy mod P), 因此完全转化为n-1的情形, 令B=DY mod P即可,例17. Reverse (IOI 2003),TOM有9个寄存器a1.a9,支持以下操作S i j, ajai+1 (i可能等于 j)P i, 输出ai任务: 对于给定n=255,设计各个寄存器的初值和一个TOM程序,按顺序输出 n
20、, n-1, n-2, 0最长的“连续S操作”片段长度P应尽量小,基本思想:寄存器i(i=8)负责输出最右的非零位为第i位的数初始时设置每个寄存器为此类数的最大值,寄存器1-8依次为128, 192, 224, 240, 248, 252, 254, 255,寄存器9保持0输出248(11111000)后,应准备232(11101000)设置连续S操作个数的限制P,每次准备好一个数后如果P限制还未达到,应该继续准备后面的数,而不要急着输出对于n=255,P限制不大于4,算法一,基本思想:刚执行输出指令的寄存器马上改考虑4个寄存器的情形,下划线是输出值N, N-2, N-5, N-9N-1, N-2, N-5, N-9N-4, N-2, N-5, N-9N-4, N-3, N-5, N-9N-4, N-8, N-5, N-9N-7, N-8, N-5, N-9N-7, N-8, N-6, N-9推广到9的寄存器,对于N=44,可得到P=1的解,算法二,