数论还是有很多没学完 只是小小的总结

一、同余定理

1.反身性:\(a\equiv a (mod m)\)

2.对称性:若\(a\equiv b(mod m)\),则\(b\equiv a (mod m)\)

3.传递性:若\(a\equiv b(mod m)\),\(b\equiv c(mod m)\),则\(a\equiv c(mod m)\)

4.同余式相加:若\(a\equiv b(mod m)\),\(c\equiv d(mod m)\),则\(ac\equiv bd(mod m)\)

5.同余式相乘:若\(a\equiv b(mod m)\),\(c\equiv d(mod m)\),则\(ac\equiv bd(mod m)\)

二、最小公倍数与最大公约数

最大公约数:GCD

辗转相除法:设\(gcd(a,b)\)为\(a\)与\(b\)的最大公约数

\[gcd(a,b)=gcd(a-b,b)\Rightarrow gcd(a,b)=gcd(b,a\%b)$$当$b$为0时,此时的$a$即为二者的最大公约数
```cpp
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
```
最小公倍数:LCM
记$d=gcd(a,b)$,$a=a'd$,$b=b'd$,可以看出 $lcm(a,b)=\frac{ab}{gcd(a,b)}$
## 三、整除
给定$a$,$b$两个数,若b能整除a,记作$b\mid a$,反之记作$a\nmid b$
简单定理:
* 若$b\mid a$,且$c\mid b$,则$c\mid a$
* 若$c\mid a$,且$c\mid b$,则$c\mid \left(na+mb\right)$
## 四、素数与合数
对于任意一个大于1的自然数,只有1和它本身两个因子,则称为素数
素数定理:小于等于x的素数个数 $\approx \frac{x}{\ln x}$ ,可以用来估计素数个数,估算所开数组的大小
不是素数的大于1的自然数称为合数

素数筛法:
### 1、暴力枚举
复杂度:$O(\log{n})$
由于任意一个数$x$的因子可看为两部分,小于$\sqrt{x}$与大于$\sqrt{x}$,因此可以枚举所有$\{i\mid i\le \sqrt{x}\}$,如若出现$i\mid x$,则不是素数,反之是素数。
*一般用于对某单个数的素性判定*
```cpp
bool check(int x)
{
int end = sqrt(x);
for (int i = 2; i <= end; ++i)
{
if (x % i == 0)
return false;
}
return true;
}
```
拓展内容(求单个合数的最大质因数)
对于任何一个数$x$,可以将他进行质因数分解,且同时保证$prime[i]^2\le x_{cur}$进行优化。
首先可以预处理出所有$\{prime\mid prime \le \sqrt{x}\}$,这样$x$的质因数分解一定是在这个集合中,或者只有最大质因数不在这个集合中。如果所剩下的最后一个数为1,即完美的进行了质因数分解,则最大质因数为最后一次除的质数,反之则最后剩下的数即为最大质因数
```cpp
const int maxn = 10000;
int vis[maxn];
int cnt, prime[maxn/10];

void Euler_Sieve()
{
for (int i = 2; i < maxn; ++i)
{
if (!vis[i]) prime[cnt++] = i;
for (int j = 0; j < cnt && prime[j] * i < maxn; ++j)
{
vis[prime[j] * i] = true;
if (i % prime[j] == 0)
break;
}
}
}
int Maximum_prime_factor(int x)
{
int ans;
for (int i = 0; i < cnt && prime[i] * prime[i] <= x; ++i)
{
if (x % prime[i] == 0)
{
ans = prime[i];
while (x % prime[i] == 0)
x /= prime[i];
}
}
return x == 1 ? ans : x;
}
```
### 2、埃氏筛法
复杂度:$O(\log{\log{n}})$
由于对于任何合数而言,他们能够被任意$prime$ 整除,所以,可以通过枚举$k*prime(k*prime\le lim_{up})$,来筛选出一些约数,而没有被筛选过的自然就是素数
值得说明的是:当选中某个$prime$时,比$prime$小的质数的倍数已经被筛出了,所以为了减小时间复杂度,可以从$prime^2$开始筛选
```cpp
const int maxn = 10000;
bool vis[maxn];
int cnt, prime[maxn / 10];
void Eratosthenes_Sieve()
{
for (int i = 2; i < maxn; ++i)
{
if (vis[i]) continue;
prime[cnt++] = i;
for (int j = i * i; j < maxn; j += i)
vis[j] = true;
}
}
```
拓展内容(求出多个合数的最大质因数)
利用埃氏筛法是由小质数到大质数的筛选过程,每次大质数筛选时会覆盖之前小质数的结果,因此可以得到实现代码
注意:开始条件从$i^2$变为了$2i$
```cpp
#include<cstdio>
const int maxn = 10000;
int vis[maxn];
int cnt, prime[maxn / 10];
void get_Maximum_prime_factors()
{
for (int i = 2; i < maxn; ++i)
{
if (vis[i]) continue;
prime[cnt++] = i;
for (int j = 2*i; j < maxn; j += i)
vis[j] = i;
}
}
```
### 3、欧拉筛
复杂度:$O(n)$
通过对每个合数,只用其最小的质因数进行筛选的思想,每次将$cur*prime[i]$对应的数筛出,为了保证最小的质因数筛出,当$prime[i]\mid cur$时,需要break
原因在于设$cur=k*prime[i]$,那么如果继续筛即对于
$$n=cur*prime[i+1]=(prime[i]*k)*prime[i+1]=prime[i]*(k*prime[i+1])$$则可以看出来,这个数$n$本应该在枚举$cur$到比它大的数$k*prime[i+1]$被比$prime[i+1]$更小的$prime[i]$筛出
```cpp
void Euler_Sieve()
{
for (int i = 2; i < maxn; ++i)
{
if (!vis[i]) prime[cnt++] = i;
for (int j = 0; j < cnt && prime[j] * i < maxn; ++j)
{
vis[prime[j] * i] = true;
if (i % prime[j] == 0)
break;
}
}
}
```
拓展内容(求出多个合数的最小质因数)
利用欧拉筛每个数都被其最小质因数所筛去
注意:开始条件从$i^2$变为了$2i$
```cpp
#include<cstdio>
const int maxn = 10000;
int vis[maxn];
int cnt, prime[maxn / 10];
void get_Maximum_prime_factors()
{
for (int i = 2; i < maxn; ++i)
{
if (!vis[i]) vis[i] = prime[cnt++] = i;
for (int j = 0; j < cnt && prime[j] * i < maxn; ++j)
{
vis[prime[j] * i] = prime[j];
if (i % prime[j] == 0)
break;
}
}
}
```
### 4、杜教筛
待学
### 5、min25筛
待学

## 五、欧拉函数\]

数论总结——更新ing的更多相关文章

  1. 适合入门自学服装裁剪滴书(更新ing)

    [♣]适合入门自学服装裁剪滴书(更新ing) [♣]适合入门自学服装裁剪滴书(更新ing) 适合入门自学服装裁剪滴书(更新ing) 来自: 裁缝阿普(不为良匠,便为良医.) 2014-04-06 23 ...

  2. Coursera,Udacity,Edx 课程列表(更新ing)

    Coursera,Udacity,Edx 课程列表(更新ing) Coursera有很多特别好的课程,平时没有机会听到国外大牛的课程,通过Coursera算是可以弥补一下吧,国外的课程普遍比国内的老师 ...

  3. storcli 命令(更新Ing)

    help [root@centos7]# storcli -h Storage Command Line Tool Ver 007.0606.0000.0000 Mar , (c)Copyright ...

  4. 【板子】数论基础(持续更新ing...)

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...

  5. 大白话strom——问题收集(持续更新ing)

    本文导读: 1.基于storm的应用 2.storm的单点故障解决 3.strom与算法的结合学习4.杂记——常见问题的解答5.http://www.blogchong.com/catalog.asp ...

  6. paper 34 :常见函数的举例(更新ing)2

    在研究opencv,不是很难,但是需要换种思维来认知这个C/C++为编程函数的开源代码库,OK,我现在还是总结一些常用MATLAB的函数,随时更新,下一阶段就是opencv方面的认知了! 1.std ...

  7. 一些不认识的开源js(更新ing。。。)

    孟星魂和小蝶归隐山林曾经说过,我们不问江湖事,但是不能不知道江湖事,因为我们是老伯的人(大概意思),所以有些东西可以用不到,但是一定要了解点... (首先不能人云亦云,但是有个主观观点也没啥大问题) ...

  8. Python:常见错误集锦(持续更新ing)

    初学Python,很容易与各种错误不断的遭遇.通过集锦,可以快速的找到错误的原因和解决方法. 1.IndentationError:expected an indented block 说明此处需要缩 ...

  9. 【小知识+小细节】不断更新ing...

    1.printf printf("%.0lf",k) 输出的不是floor(k) 而是k四舍五入 ..才发现.xlf 都是四舍五入取x位 2.cin char buff[300] ...

随机推荐

  1. 风车签名 - 让管理APP变成一件简单的事儿

    这是一款在Mac平台下安全可控的iOS签名管理软件,旨在对签名后的APP能够完全控制,包括APP的开启或禁用.设置到期时间锁.注入第三方动态库文件.设置安装限量.修改APP名称和自定义Bundle I ...

  2. 多测师讲解自动化测试 _RF定位iframe框_高级讲师肖sir

    Open Browser https://mail.163.com/ gc Maximize Browser Window sleep 2 #进入if框 Comment Input Text name ...

  3. 多测师讲解python _函数的传递_高级讲师肖sir

    题目:   要求1.通过函数来实现       2.引用函数传递方法        3.引用返回值   有一个登录系统:账号admin  密码123456 验证码abc123    账号.密码.验证码 ...

  4. Windows下CertUtil校验和编码文件

    目录 前言 CertUtil计算文件hash 计算MD2 计算MD4 计算MD5 计算SHA1 计算SHA256 计算SHA384 计算SHA512 文件base64编码 文件base64解码 文件h ...

  5. 如何把base64格式的图片上传到到阿里云oss c#版

    今天碰到需要把canvas上的的图片转存到阿里云oss,于是百度了半天,一个能打的答案都没有.怒了,自己搞起. 代码超级简单,需要先引入nuget 中啊里云的oss api 1 byte[] arr ...

  6. Git hub加载慢?下载慢?浏览慢?几个小技巧让你一键起飞!

    记得,那是一个风和日丽,艳阳高照的夜晚,只因为当初的一次回眸,于是便决然走向了程序员的道路,从此,CV大法心中记,代码伴我身. 这一天,正当我打开电脑准备开开心心的使用CV大法完成任务的时候,却恼人的 ...

  7. 发布MeteoInfo 1.2.8

    增加了对SYNOP数据的支持(功能从C#版移植过来).数据可以从这里下载:http://weather.cod.edu/digatmos/syn/SYNOP数据搞气象的人应该多少知道些,类似MICAP ...

  8. FY2E HDF格式数据处理绘图

    圆盘标称投影数据时静止气象卫星常见的数据产品,比如FY2E静止气象卫星就有很多这样的产品(可以从国家卫星气象中心网站上下载).所谓的圆盘标称投影就是Geostationary投影,主要的投影参数有中央 ...

  9. day31 Pyhton 面向对象的基础 三大特性

    一.内容回顾 封装 1.概念 笔记 2.__名字 在类的外部就不能用了 3.私有化的 不能被子类继承,也不能在其他任何类中调用 三个装饰器方法(装饰类中的方法) 1.不被修饰的  普通方法,会使用对象 ...

  10. <二分查找+双指针+前缀和>解决子数组和排序后的区间和

    <二分查找+双指针+前缀和>解决子数组和排序后的区间和 题目重现: 给你一个数组 nums ,它包含 n 个正整数.你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 ...