您的位置:首页 > 其它

数论记录

2017-12-10 23:26 80 查看
本文主要记录数论相关的知识点

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 ACM