学习笔记——数论基础
前置知识:a|b代表b是a的倍数
1.最大公约数:当a|b时,a|c,且没有一个比a大的数满足这个条件,则称a为b,c的最大公约数,记作a=gcd(b,c)
最小公倍数:当b|a时,c|a,且没有一个比a小的数满足这个条件,则称a为b,c的最小公倍数,记作a=lcm(b,c)
可以将其看成一个表达式,满足表达式的一切性质
2.求解最大公约数:
若有两个数a,b,欲求两者的最大公约数
设a>b
我们发现如果b是a的约数,那么b就是a,b的最大公约数
可是如果a|b不成立呢?
下面对这种情况进行讨论:
…………
算了免了吧
反正证明过程不会考的,下面是结论:
gcd(a,b)=gcd(b,a mod b)
则得出递归公式
int gcd(int a,int b) { if(b==0) return a return gcb(b,a%b); }
这种算法叫做欧几里得算法,又叫辗转相除法,
复杂度为O(log n)
3.求解最小公倍数:
一组整数的公倍数,是指这组数中每一个数的倍数,0是任意一组数的公倍数
一组整数的公倍数,是指所有正的公倍数里面,最小的一个数
……
老规矩,略去推导过程,直接上结论:
gcd(a,b)*lcm(a,b)=a*b
所以lcm(a,b)=a*b/gcd*(a,b)
因此,若求lcm,求出gcd即可
4.算数基本引理:设p是素数,若p|a1*a2,则p至少能被a1,a2整除
5.模运算
又称mod ,取余,符号是%,代表取这个数的余数
性质:(a+b)%p=((a%p)+(b%p))%p
(a*b)%p=((a%p)*(b%p))%p
6.快速幂
用于求a^k之类的题目
实现过程难以描述,直接写代码
int ksm(int n,int k,int p) { int ans=1; while(k) { if(k&1) { ans=(ans*n)%p; } n=(n*n)%p; k>>=1; } return ans; }
7.唯一分解定理:
每一个正整数都可以拆分成形如p1^e1*p2^e2……pk^ek的形式
其中pi都是质数,ei都是指数
8.扩展欧几里得算法:
想要求ax+by=gcd(a,b)的一组解x,y
那么我们可以先求出(b)x'+(a%b)y'=gcd(b,a%b)
再由x'和y'推导出x,y
那么x',y'还可以用类似的手法求出
也就是说运用递归的方法
int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1,y=0; return a; } int h=exgcd(b,a%b,x,y) int xx=x,yy=y; x=yy,y=xx-a/b*yy; return h; }
9.逆元:
给定一个整数a和模数p,求一个整数x,满足a*x=1 mod p
则x就是在mod p概念下的逆元
别问,问就是不会

浙公网安备 33010602011771号