基础数论讲解(详细)
数论
质数问题
定义:
一个正整数只有除1外和自身之外的任何自然数整除,则这个数称为质数,负责称为合数。
判定:
是为了判定n是不是质数;
根据定义可以知道只要找2~ n \sqrt{n} n 之间有没有可以和n整除的就可以啦;
筛选
是为了找到1~N之间的所有质数;
任意的一个数,如x,它的倍数一点不是质数,所有从小到大扫,扫到一个数,把它的倍数标记为合数,就这样把所有的合数一点点的标记出来,而当扫到一个数未标记时,这个数就是质数;
memset(v,0,sizeof(v));//标记合数;
for(int i=2;i<=n;i++)
{if(v[i]) continue;cout<<i<<endl; // i是质数for(int j=i;i<=n/i;j++) v[i*j]=1;
}
这个算法是Eratosthenes筛法,而时间复杂度=O(NloglogN);
- 质因数分解
定理:任何一个大于1的正整数都能唯一的分解为有限个质数的乘积,N= p 1 c 1 p 2 c 2 . . . p m c m p1^{c1}p2^{c2}...pm^{cm} p1c1p2c2...pmcm;
其中。ci都是正整数,pi都是质数。
约数
- 定义:
若整数n除以整数d的余数为0,即d能整除n,则称d是n的约数,n是d的倍数,记为d|n。
这是约数的推论;
- 约数集合
∵ \because ∵ d|n;
∴ \therefore ∴ d n ∣ \frac{d}{n}| nd∣n;
∴ \therefore ∴ d|n × \times ×n;
所以,只要扫描 1~ n \sqrt n n 就可以找到n的所有约数。
int factor[N] , tot = 0;
for( int i = 1 ; i * i <= n ; i ++ )
{ if( n % i ) continue; factor[ ++ tot] = i; if( i != n / i ) factor[ ++ tot ] = n / i;
}
最小公约数 最大公倍数
谈到最小公约数,就可以想到最大公倍数,所有我们就可以一起来写(因为有一些定理是有关二者的)
- 最大公约数
就是两个数的公共约数中最大的那个数;
int gcd(int a,int b)
{if(a%b==0)return b;elsereturn gcd(a%b,b);
}
这是求两个数的gcd,(gcd是最大公约数),
九章 .更相减损术
a,b ∈ \in ∈N,a ≥ \ge ≥b, gcd(a,b)=gcd(b,a-b)=gcd(a,a-b);
a,b ∈ \in ∈N,有gcd(2a,2b)=2gcd(a,b);
最小公因数中,欧几里得算法;
:a,b ∈ \in ∈N,b ≠ \neq = 0, gcd(a,b)=gcd(b,a modb)
证明:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数。
因(a,b)和(b,a mod b)的公约数相等,则其最大公约数也相等,得证。
因为欧几里得算法我们才得以得出求解gcd的代码思想;
扩展欧几里得算法
定义: 对于任意整数a , b ,存在一对整数x , y ,满足a x + b y = g c d ( a , b ) ax+by=gcd(a,b)ax+by=gcd(a,b)
证明:
通过不断地应用公式 r k = r k − 2 − q k r k − 1 r_k = r_k−2 −q_kr_k−1 rk=rk−2−qkrk−1 可以求出可能为负数的 x,y,使得 r n = a x + b y 。 特 别 地 , 若 g c d ( a , b ) = 1 , 则 有 a x ≡ 1 ( m o d b ) , 即 x 为 a 模 b 的 逆 元 。 r_n = ax + by。 特别地,若 gcd(a,b) = 1,则有 ax ≡ 1 (mod b),即 x 为 a 模 b 的逆元。 rn=ax+by。特别地,若gcd(a,b)=1,则有ax≡1(modb),即x为a模b的逆元。
int gcd(int a, int b, int& x, int& y)
{ if(b){ int d = gcd(b, a%b, y, x);// d = y*b + x*(a%b) // = y*b + x*(a-(a/b)*b) // = y*b + x*a - x*(a/b)*b // = x*a + (y-x*(a/b))*b y -= a/b*x; return d; } x = 1; y = 0; return a; }
- 最小公倍数
二者公共倍数中最小的那个数;(我们通常用LCM来表示最小公倍数)
∵ \because ∵gcd(a,b) × \times ×lcm(a,b)=a × \times ×b;
∴ \therefore ∴lcm(a,b)可以由gcd(a,b)来求出;
上面提到的gcd(a,b) × \times ×lcm(a,b)=a × \times ×b;就是一个gcd与lcm的关系之一;
————————————————
互质
定义:如果任取a,b ∈ \in ∈N,若gcd(a,b)=1,则a,b互质。
而对于三个数或更多的情况,如gcd(a,b,c)=1,则称为a,b,c互质。
欧拉函数
1~N中与N互质的数的个数被称为欧拉函数,记为 ϕ \phi ϕ(N);
通式:φ(x)=N ∏ i = 1 n \prod\limits_{i=1}^n i=1∏n (1- 1 p i \frac{1}{pi} pi1) (其中p1, p2……pn为x的所有质因数,x是不为0的整数)
定义 φ(1)=1(和1互质的数(小于等于1)就是1本身)。
int phi(int n)
{int ans=n;for(int i=2;i<=sqrt(n);i++){if(n%i==0){ans=ans/i*(i-1);while(n%1==0) n/=i;}}if(n>1) ans=ans/n*(n-1);
}
性质:
- ∀ \forall ∀n>1, 1~n中与n互质的数的个数的和为n × \times × ϕ ( n ) \phi(n) ϕ(n)/2;
- 若 a,b互质,则 ϕ \phi ϕ(a,b)= ϕ \phi ϕ(a) × \times × ϕ ( b ) \phi(b) ϕ(b)。
证明:
因为gcd(n,x)=gcd(n,n-x),所以与n不互质的的数 x,n-x成对出现,平均值为n/2。因此,与n互质的数的平均值也是n/2,进而得到性质1。
根据欧拉函数的计算式,对a,b分解质因数直接可得性质2。把性质2推广到一般函数上得到“积极函数”的概念。
由以上的来学习欧拉函数,我相信你还会懵,关于欧拉函数的式子是怎么算出来的,所以,下面是更为详细的讲解;
欧拉函数就是给定一个正整数由1~8中与其互质数的个数,如8,在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
而我们就要找到怎么求解 φ;
它分为4种情况,或者说欧拉函数剩下的4个性质:
(1)如果n=1, φ(1)=1;这是定义,1与任何数(包括其本身)都互质。
(2)如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
(3)如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),则 ϕ \phi ϕ(p k ^k k)= p k p^k pk- p k − 1 p^{k-1} pk−1如φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。
(4)如果n可以分解成两个互质的整数之积,n = p1 × p2,则 φ(n) = φ(p1 × \times ×p2) = φ(p1) × \times ×φ(p2);如 φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
然后,由以上四种分开的情况,在进行总和,就可以得到φ(x)=N ∏ i = 1 n \prod\limits_{i=1}^n i=1∏n (1- 1 p i \frac{1}{pi} pi1);
嗯,就这样啦。
同余
定义:
若整数a,b除以正整数m的余数相等,则称a,b模m同余,记为a ≡ \equiv ≡b(mod m).
1.当问题要求对答案取模时,担心会在计算的过程中出现溢出,而同余就是在加减乘除时进行取模,而结果不变和之间对结果取模没有影响;(这个大家都知道吧)
用符号表示就是:
1.(a+b)%m = (a%m+b%m)%m;
2.a × \times ×b%m = ((a%m) × \times ×(b%m))%m;
由以上,就可以对费马小定理,欧拉定理进军了
费马小定理:
如果p是质数,则对于任何整数a,有a p ^p p ≡ \equiv ≡a(mod p)。
欧拉定理
如果正整数a,n互质,则a ϕ ( n ) ^{\phi(n)} ϕ(n) ≡ \equiv ≡ 1(mod n);
证明:
将1~n中与n互质的数按顺序排布:x1,x2……xφ(n) (显然,共有φ(n)个数)
我们考虑这么一些数:
m1=ax1;m2=ax2;m3=ax3……mφ(n)=axφ(n)
1)这些数中的任意两个都不模n同余,因为如果有mS≡mR (mod n) mS>mR,
就有:mS-mR=a(xS-xR)=qn,即n能整除a(xS-xR)。但是a与n互质,a与n的最大公因子是1,而xS-xR<n,因而左式不可能被n整除。也就是说这些数中的任意两个都不模n同余,φ(n)个数有φ(n)种余数。
2)这些数除n的余数都与n互质,因为如果余数与n有公因子r,那么a * xi=pn+qr=r(……),a * xi与n不互质,而这是不可能的。(因为a * xi=pn+qr=r(……),说明a * xi含有因子r,又因为前面假设n含有因子r,所以a * xi和n含有公因子r,因此a * xi与n不互质)那么这些数除n的余数,都在x1,x2,x3……xφ(n)中,因为这是1~n中与n互质的所有数,而余数又小于n.
由1)和2)可知,数m1,m2,m3……mφ(n)(如果将其次序重新排列)必须相应地同余于x1,x2,x3……xφ(n).
故得出:m1m2m3……mφ(n)≡x1x2x3……xφ(n) (mod n)
或者说a φ ( n ) ^{φ(n)} φ(n) (x1x2x3……xφ(n))≡x1x2x3……xφ(n)(mod n)
或者为了方便:K{a φ ( n ) ^{φ(n)} φ(n) -1}≡0 ( mod n ) 这里K=x1x2*x3……xφ(n)。
可知K{a φ ( n ) ^{φ(n)} φ(n) -1}被n整除。但K中的因子x1,x2……都与n互质,所以K与n互质。那么a[φ(n)]-1必须能被n整除,即a[φ(n)]-1≡0 (mod n),即a φ ( n ) ^{φ(n)} φ(n) ≡1 (mod n),得证。
中国剩余定理
m1,m2,m3,…,m n _n n,是两两互质的整数。
f ( x ) = { x ≡ a 1 ( m o d m 1 ) y ≡ a 2 ( m o d m 2 ) . . . x ≡ a n ( m o d m n ) f(x)=\left\{ \begin{aligned} x \equiv a1(mod m1)\\ y \equiv a2(mod m2)\\ .\\ .\\ .\\ x\equiv an(mod mn) \end{aligned} \right. f(x)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧x≡a1(modm1)y≡a2(modm2)...x≡an(modmn)
有整数解,x= ∑ i = 1 n \sum_{i=1}^n ∑i=1n a i a_{i} aiM i _i it i _i i。
证明:
因为Mi= m/mi 是除mi 之外所以模板的倍数,所以任意k不等于i,aiMiti ≡ \equiv ≡ 0 (mod mk)。又因为aiMiti ≡ \equiv ≡ ai(mod mi),所以代入x= ∑ i = 1 n \sum_{i=1}^n ∑i=1n a i a_{i} aiM i _i it i _i i。
扩展CRT
求解同余方程组
x ≡ ai (mod mi)
不要求 mi 两两互质。
将每个方程拆成若干个方程 x ≡ ai (mod pki,j i,j ) 其中 m i _i i= ∏ i = p i , j k i , j \prod\limits_{i=p _i,_j }^{k_i,_j} i=pi,j∏ki,j 的分解 式。对每个质数 p,合并对应的 所有方程,从而转化为模数两两互质的情形。若合并过程中出现 矛盾,则原方程组无解
组合计数
组合,不仅对于信竞,对于高中的数学,甚至是生物,都有很大的影响和帮助。
1.加法原理
就是完成一个事件要n个类,其中第i个步骤有a i _i i种不同的方法,且互不重合,所以完成一个事件共有a1+a2+a3+…+an个不同方法。
2.乘法原理
就是完成一个事件要n个步骤,其中第i个步骤有a i _i i种不同的方法,且互不干扰,所以完成一个事件共有a1a2a3*…*an个不同方法。
3.排列数
从n个不同的元素中依次取出m个元素排成一列,产生的不同的排列的数量为:n*(n-1)* … *(n-m+1);
证明:
可以想,第一个位置有n个不同的数可以填,对于第二个位置,因为第一个位置已经填过一个数,所以 只剩下n-1个数可以填,由此类推,在第m个位置就只会剩下(n-m+1)个数可以填,这些填下的数之间满足的是乘法原理,所以就将其乘起来。
组合数
从n个不同的元素中取出m个数组成一个集合(不考虑顺序),产生的不同集合的数量为:
n*(n-1)* … *(n-m+1) * m * (m-1) * … * 1;
证明:
组合数因为其对于顺序没有要求,所以对于上面所叙述的排列数(这是有顺序要求的)进行“全排列”就是组合数,而全排列就是m!,在乘上m!就可以啦;
性质:
1.C n m ^m_n nm=C n n − m ^{n-m}_n nn−m
2.C n m ^m_n nm=C n − 1 m ^m_{n-1} n−1m+C n − 1 m − 1 ^{m-1}_{n-1} n−1m−1
3.C n 0 ^0_n n0+c n 1 ^1_n n1+…+C n n ^n_n nn=2 n ^n n
证明:
首先来证明第一个 C n m ^m_n nm=C n n − m ^{n-m}_n nn−m
不知道大家有没有在高中学苯,苯的二氯代物和四氯代物的结构是一样多的,因为苯是6边型结构,在找四氯代物时,实际上是在找苯的两个氢的解构,就同在找二氯代物是一样一样的。所以,当放在这条性质上是,对于n-m个数的组合实际上可以看做取n-m的补集,求其的组合,就是m个数的组合。
2.C n m ^m_n nm=C n − 1 m ^m_{n-1} n−1m+C n − 1 m − 1 ^{m-1}_{n-1} n−1m−1
C n − 1 m ^m_{n-1} n−1m和C n − 1 m − 1 ^{m-1}_{n-1} n−1m−1的并集是全集,前一个的了解是在取数时不要第n个数,而后面的是要第n个数,所以根据加法原理,就可以得到C n m ^m_n nm=C n − 1 m ^m_{n-1} n−1m+C n − 1 m − 1 ^{m-1}_{n-1} n−1m−1;
3.C n 0 ^0_n n0+c n 1 ^1_n n1+…+C n n ^n_n nn=2 n ^n n
对于n个元素都可以取或不取,总方法数为2 n ^n n,等等有没有想到什么,高中减数分裂产生配子的种类,对于有n对同源染色体,会产生2 n ^n n。
容斥原理
将作为此次数论的最后,
定义:
设S 1 _1 1,S 2 _2 2,S 3 _3 3,…,S n _n n,为有限集合,|S|表示集合S的大小,则:
两个集合的容斥关系公式:A∪B =|A∪B| = |A|+|B| - |A∩B |(∩:重合的部分)
三个集合的容斥关系公式:|A∪B∪C| = |A|+|B|+|C| - |A∩B| - |B∩C| - |C∩A| + |A∩B∩C|
详细推理如下:
1、 等式右边改造 = {[(A+B - A∩B)+C - B∩C] - C∩A }+ A∩B∩C
2、维恩图分块标记如右图图1:1245构成A,2356构成B,4567构成C
3、等式右边()里指的是下图的1+2+3+4+5+6六部分:
那么A∪B∪C还缺部分7。
4、等式右边[]号里+C(4+5+6+7)后,相当于A∪B∪C多加了4+5+6三部分,
减去B∩C(即5+6两部分)后,还多加了部分4。
5、等式右边{}里减去C∩A (即4+5两部分)后,A∪B∪C又多减了部分5,
则加上A∩B∩C(即5)刚好是A∪B∪C。
基础数论讲解(详细)相关推荐
- Eggjs入门系列-基础全面讲解(完结)
对上篇文章回顾下,上篇讲到了 服务(Service) 插件 定时任务 框架扩展 启动自定义 应用部署 日志 HttpClient Cookie 与 Session Cookie 通过 ctx.cook ...
- [免费专栏] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...
- 计算机二级公共基础知识总结百度云,计算机二级公共基础知识总结详细版本[精]...
计算机二级公共基础知识总结详细版本[精] (15页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 15.9 积分 全国计算机等级考试二级公共基础知识总结第一 ...
- python实现录音并去燥_Python实现电脑录音(含音频基础知识讲解)
Python实现电脑录音(含音频基础知识讲解) 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些 ...
- python classmethod知识_python基础知识讲解——@classmethod和@staticmethod的作用
python基础知识讲解--@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...
- Tinyshop前后台操作基础教程讲解
Tinyshop前后台操作基础教程讲解 01 tinyshop v3框架的安装 [录播]tinyshop v3框架的安装(8分钟) 02 tinyshop v3框架的后台基本参数配 [录播]tinys ...
- Python语言学习:python语言的特点、入门、基础用法之详细攻略
Python语言学习:python语言的特点.入门.基础用法之详细攻略 相关内容 Python 基础教程 目录 python语言的特点 python语言的入门 python语言的基础用法 python ...
- 算法之基础数论应用篇(一)
基础数论应用篇 子集和 题目描述 筛质数 筛质数模板 欧拉筛 线性筛 哥德巴赫猜想 夏洛克和他的女朋友 二次筛法 分解质因数 试除法分解质因数 分解阶乘质因子 快速幂 模板 快速幂 快速乘法 序列的第 ...
- 最后一篇,小白看的Python基础教程,详细得很(十一)
@Author:Runsen 往期回顾: 第一篇.小白看的 Python 基础教程,详细得很(八) 第二篇.小白看的 Python 基础教程,详细得很(九) 第三篇.小白看的 Python 基础教程, ...
最新文章
- Spring Boot中使用PostgreSQL数据库
- 数字证书及CA的扫盲介绍
- 【CI/CD1】jenkins
- ZOJ-2587 Unique Attack 最小割的唯一性判定
- 「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?
- C库中没有itoa以及C++中string没有split方法的原因
- BZOJ 2186 SDOI2008 沙拉公主的困惑 数论
- php与mysql事物处理
- mysql忽略大小写 chmod_Ubuntu18.04下Mysql8.0.15关闭大小写敏感
- 分享24个JS特效广告和66个JS特效在线客服J代码JS代码
- PX4代码学习系列博客(1)——开发环境配置
- bootice添加黑苹果引导_黑苹果OC(OpenCore)引导升级教程
- Android 仿微信/支付宝 字体大小 调整控件
- virtual memory exhausted: Cannot allocate memory 解决办法 命令分配交换空间
- 【Red Hat7创建/扩容/删除逻辑卷 #步骤非常非常详细】
- MongoDB使用账号密码连接
- shell md5sum命令
- Jetson 相机编码
- 职场中如何与老板谈加薪
- 2021最新去水印微信小程序