数论记录
来源:互联网 发布:泛泰主义知乎 编辑:程序博客网 时间:2024/06/05 15:34
本文主要记录数论相关的知识点
1、欧几里德算法(辗转相除法)
2、欧拉函数
10、弃九法
1、欧几里德算法(辗转相除法)
主要用于计算两个正整数的最大公约数,具体操作步骤如下:
设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=qr(0≤r1)。若r=0,则(a,b)=b;若r≠0,则再用b除以r,得b÷r=qr(0≤r).若r=0,则(a,b)=r,若r≠0,则继续用r除以r,如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。
代码:
int GCD(int a,int b){ return b==0?a:GCD(b,a%b);}
练习题目:
http://acm.nyist.net/JudgeOnline/problem.php?pid=40
http://acm.nyist.net/JudgeOnline/problem.php?pid=556
2、欧拉函数
欧拉函数是小于n的正整数中与n互质的数的数目。它又称为Euler's totient function、φ函数、欧拉商数。 例如φ(8)=4,因为1,3,5,7均和8互质。
欧拉函数的一些性质:
1.对于素数p, φ(p)=p-1,对于对两个素数p,q φ(pq)=pq-1
欧拉函数是积性函数,但不是完全积性函数.
证明:
函数的积性即:若m,n互质,则φ(mn)=φ(m)φ(n).由“m,n互质”可知m,n无公因数,所以φ(m)φ(n)=m(1-1/p1)(1-1/p2)(1-1/p3)…(1-1/pn)·n(1-1/p1')(1-1/p2')(1-1/p3')…(1-1/pn'),其中p1,p2,p3...pn为m的质因数,p1',p2',p3'...pn'为n的质因数,而m,n无公因数,所以p1,p2,p3...pn,p1',p2',p3'...pn'互不相同,所以p1,p2,p3...pn,p1',p2',p3'...pn'均为mn的质因数且为mn质因数的全集,所以φ(mn)=mn(1-1/p1)(1-1/p2)(1-1/p3)…(1-1/pn)(1-1/p1')(1-1/p2')(1-1/p3')…(1-1/pn'),所以φ(mn)=φ(m)φ(n).
即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立.
2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn.
φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn).
3.除了N=2,φ(N)都是偶数.
4.设N为正整数,∑φ(d)=N (d|N),即n的约数的欧拉函数之和等于n.
根据性质2,我们可以在O(sqrt(n))的时间内求出一个数的欧拉函数值.
如果我们要求1000000以内所有数的欧拉函数,怎么办.
上面的方法复杂度将高达O(N*sqrt(N)).
我们来看看线性筛法的程序:
//直接求解欧拉函数 int euler(int n){ //返回euler(n) int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; }练习题目:
http://poj.org/problem?id=2407
http://poj.org/problem?id=1284
http://poj.org/problem?id=2478
http://poj.org/problem?id=3090
10、弃九法
①弃九数:把一个数的各位数字相加,直到和是一个一位数(和是9,要减去9得0)。(123的弃九数是6,48的弃九数是3)
②验证加法、减法、乘法。除法就利用逆运算:乘法
加法:被加数 + 加数 = 和=>被加数的弃九数 + 加数的弃九数 = 和的弃九数
减法:被减数 - 减数 = 差 => 被减数的弃九数 - 减数的弃九数 = 差的弃九数
乘法:被乘数 * 乘数 = 积 => 被乘数的弃九数 * 乘数的弃九数 = 积的弃九数
③局限性:弃九数验证是验证四则运算的充分不必要条件。也就是说运算正确,则弃九数相同;但是弃九数相同不代表运算正确。
练习题目:
http://acm.nyist.net/JudgeOnline/problem.php?pid=485