数论


质数问题

  1. 定义:

    一个正整数只有除1外和自身之外的任何自然数整除,则这个数称为质数,负责称为合数。

  2. 判定:

    是为了判定n是不是质数;

    根据定义可以知道只要找2~ n \sqrt{n} n ​之间有没有可以和n整除的就可以啦;

  3. 筛选

    是为了找到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. 质因数分解

定理:任何一个大于1的正整数都能唯一的分解为有限个质数的乘积,N= p 1 c 1 p 2 c 2 . . . p m c m p1^{c1}p2^{c2}...pm^{cm} p1c1p2c2...pmcm;
其中。ci都是正整数,pi都是质数。


约数

  1. 定义:

若整数n除以整数d的余数为0,即d能整除n,则称d是n的约数,n是d的倍数,记为d|n。

这是约数的推论;

  1. 约数集合

∵ \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;
}

最小公约数 最大公倍数

谈到最小公约数,就可以想到最大公倍数,所有我们就可以一起来写(因为有一些定理是有关二者的)

  1. 最大公约数
    就是两个数的公共约数中最大的那个数;
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−qk​rk​−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; }

  1. 最小公倍数
    二者公共倍数中最小的那个数;(我们通常用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);
}

性质:

  1. ∀ \forall ∀n>1, 1~n中与n互质的数的个数的和为n × \times × ϕ ( n ) \phi(n) ϕ(n)/2;
  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=x1
x2*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} ai​M i _i i​t 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} ai​M i _i i​t 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。

基础数论讲解(详细)相关推荐

  1. Eggjs入门系列-基础全面讲解(完结)

    对上篇文章回顾下,上篇讲到了 服务(Service) 插件 定时任务 框架扩展 启动自定义 应用部署 日志 HttpClient Cookie 与 Session Cookie 通过 ctx.cook ...

  2. [免费专栏] Android安全之静态逆向APK应用浅析「手动注入smali」+「IDA Pro静态分析so文件」+「IDA Pro基础使用讲解」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  3. 计算机二级公共基础知识总结百度云,计算机二级公共基础知识总结详细版本[精]...

    计算机二级公共基础知识总结详细版本[精] (15页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 15.9 积分 全国计算机等级考试二级公共基础知识总结第一 ...

  4. python实现录音并去燥_Python实现电脑录音(含音频基础知识讲解)

    Python实现电脑录音(含音频基础知识讲解) 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些 ...

  5. python classmethod知识_python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解--@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  6. Tinyshop前后台操作基础教程讲解

    Tinyshop前后台操作基础教程讲解 01 tinyshop v3框架的安装 [录播]tinyshop v3框架的安装(8分钟) 02 tinyshop v3框架的后台基本参数配 [录播]tinys ...

  7. Python语言学习:python语言的特点、入门、基础用法之详细攻略

    Python语言学习:python语言的特点.入门.基础用法之详细攻略 相关内容 Python 基础教程 目录 python语言的特点 python语言的入门 python语言的基础用法 python ...

  8. 算法之基础数论应用篇(一)

    基础数论应用篇 子集和 题目描述 筛质数 筛质数模板 欧拉筛 线性筛 哥德巴赫猜想 夏洛克和他的女朋友 二次筛法 分解质因数 试除法分解质因数 分解阶乘质因子 快速幂 模板 快速幂 快速乘法 序列的第 ...

  9. 最后一篇,小白看的Python基础教程,详细得很(十一)

    @Author:Runsen 往期回顾: 第一篇.小白看的 Python 基础教程,详细得很(八) 第二篇.小白看的 Python 基础教程,详细得很(九) 第三篇.小白看的 Python 基础教程, ...

最新文章

  1. Spring Boot中使用PostgreSQL数据库
  2. 数字证书及CA的扫盲介绍
  3. 【CI/CD1】jenkins
  4. ZOJ-2587 Unique Attack 最小割的唯一性判定
  5. 「源码分析」CopyOnWriteArrayList 中的隐藏知识,你Get了吗?
  6. C库中没有itoa以及C++中string没有split方法的原因
  7. BZOJ 2186 SDOI2008 沙拉公主的困惑 数论
  8. php与mysql事物处理
  9. mysql忽略大小写 chmod_Ubuntu18.04下Mysql8.0.15关闭大小写敏感
  10. 分享24个JS特效广告和66个JS特效在线客服J代码JS代码
  11. PX4代码学习系列博客(1)——开发环境配置
  12. bootice添加黑苹果引导_黑苹果OC(OpenCore)引导升级教程
  13. Android 仿微信/支付宝 字体大小 调整控件
  14. virtual memory exhausted: Cannot allocate memory 解决办法 命令分配交换空间
  15. 【Red Hat7创建/扩容/删除逻辑卷 #步骤非常非常详细】
  16. MongoDB使用账号密码连接
  17. shell md5sum命令
  18. Jetson 相机编码
  19. 职场中如何与老板谈加薪
  20. 2021最新去水印微信小程序

热门文章

  1. 前端利器CodePen和JSRUN了解一下
  2. 最近邻分类算法KNN实现--参考麦子学院彭亮机器学习基础4.2
  3. 如何将网站发布和部署到本地服务器详细教程
  4. 【Kalman】卡尔曼滤波基础知识
  5. pandas批量拆分、合并EXCEl
  6. linux内核源码—编程之路
  7. BTree与B+Tree图文详解
  8. Matlab/simulink通信系统仿真入门操作
  9. 使用docker官方加速器
  10. 基于一维卷积神经网络的滚动轴承故障识别