五一DAY1数论学习笔记

by ruanxingzhi

整除性

如果a能把b除尽,也就是没有余数,则我们称a整除b,亦称b被a整除。(不是除以,是整除!!

记作:\(a|b\)

|这个竖杠就是整除符号


整除的性质

  • 自反性

对于任意\(n\),有\(n|n\).

  • 传递性

若有\(a|b,b|c\),则\(a|c\).

  • 反对称性

如果\(a|b\),且\(b|a\),则\(a=b\)


约数和倍数

如果\(a|b\),那么\(a\)是\(b\)的约数,\(b\)是\(a\)的倍数。称\(a\)为\(b\)的因子。

从而得到重要推论:

任何数\(n\)至少有两个因子:\(1\)和\(n\)自身。我们将它们称为\(n\)的平凡因子。(其他的因子为非平凡因子)

\([1,n]\)的整数中,\(k\)的倍数有\(\frac{n}{k}\)个


计算

如何计算\([1,n ]\)中每个数的约数个数

n的约数个数记为\(d(n)\).要求给出一个\(O(n log n)\)的算法。

做法:暴力打标记

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int d[100005],n;
  4. int main(){
  5. cin>>n;
  6. for(int i=1;i<=n;i++){
  7. for(int j=1;i*j<=n;j++){
  8. d[i*j]++;
  9. }
  10. }
  11. for(int i=1;i<=n;i++){
  12. printf("d[%d]=%d\n",i,d[i]);
  13. }
  14. return 0;
  15. }

质数

质数是不存在非平凡因子的数

即只存在1和自己本身这两个约数的数

e.g.

\(2.3,5,7,19260817......\)


判断质数

求一个数是不是质数\(O(\sqrt{n})\)做法

  1. bool prime(int x){
  2. if(x==1)return false;
  3. for(int i=2;i*i<=x;i++){
  4. if(x%i==0)return false;
  5. }
  6. return true;
  7. }

n的因子成对出现,一般情况下,\(n=a*b\),则a,b中一个大于等于\(\sqrt{n}\),一个小于等于\(\sqrt{n}\)


如何证明质数有无限个

【反证】假设质数有限

分别为\(p_1,p_2,p_3......p_n\)

有\(m=p_1*p_2*p_3*...*p_n+1\)

则\(m\%p_1=1,m\%p_2=1,m\%p_3=1.......m\%p_n=1\)


质数的性质

设\(π(n)\)为不超过\(n\)的质数个数。那么有:

$$π(n)\sim\frac{n}{ln;n}$$

\(π(n)\)是质数分布函数,\(n\)越大,质数的分布越稀疏


质数判断

朴素想法就是逐个判断,然而它的复杂度是\(O(n\;\sqrt{n})\)(It is so big!)

所以我们使用筛法(小学学的,就比如100以内的数筛去2,3,5,7的倍数之后剩下的数就都是质数了)

为什么我们不需要使用4,6,8,9这些合数去筛?

前面我们学过整除的传递性,在这里就能用上了

若\(a|b\),\(b|c\),则\(a|c\)

所以筛了2,一定筛了4,6,8

筛了3时,一定筛掉了6,9

所以这些数早就被筛过了

我们为何要再用他们去筛呢


代码实现

  1. //埃氏筛法求素数
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. bool notprime[10005]={0};
  5. int main(){
  6. int n,i,a;
  7. cin>>n;
  8. for(a=2;a<=n;a++){
  9. if(notprime[a]==0){
  10. printf("%d\t",a);
  11. for(i=2;i*a<=n;i++){
  12. notprime[i*a]=1;
  13. }
  14. }
  15. }
  16. }

更多素数的知识请参考这里

Mono_pigsicklie的有关素数的小结


质因数分解

每个数都可以拆成质数乘积的方式。这个过程叫做质因数分解。

\(5 = 5 = 5^1\)

\(15 = 3 * 5 = 3^1 * 5^1\)

\(36 = 2 * 2 * 3 * 3 = 2^2 * 3^2\)

我们可以保证:这样的分解方式是唯一的

质因数分解可以\(O(\sqrt{n})\)完成

  1. //质因数分解
  2. int work(int x,int p[]){
  3. int cnt=0;
  4. for(int i=2;i*i<=x;i++){
  5. while(x%i==0){
  6. p[cnt++]=i;
  7. x/=i;
  8. }
  9. }
  10. if(x>1)p[cnt++]=i;
  11. return cnt;
  12. }

回顾小学除法

一个数除以另一个数,得到商和余数

\(17÷5=3......2\) -----> \(17=\lfloor\frac{17}{5}\rfloor*5+17\%5=3*5+2\)

普遍的我们可以这样来表示除法:

$$a=\lfloor\frac{a}{p}\rfloor * p+a%p$$

其中\(p\)是除数,\(\lfloor\frac{a}{p}\rfloor\)是商,\(a\%p\)是余数

显然,如果p能将a整除,那么a ÷ p的余数为0.

也就是说:\(p|a\)当且仅当\(a\%p=0\).

所以,我们判断\(p\)能否整除\(a\),就只需要判断\(a\%p\)是否为\(0\)。

这很方便用代码实现。


模的性质

  • 值域

首先,由于模是取余,所以\(a\%p\)一定落在\([0, p -1]\)之间。

  • 随时取模性质

只含加法和乘法的式子中,如果最后的运算结果需要对\(p\)取模,那么你可以在运算过程中随便取模

只需要最后把结果对\(p\)再取模,答案就是正确的。


如何保证取模之后得到的数一定是正数?

公式:\((a\%b+b)\%b\)


GCD与LCM

\(gcd(a,b)\):\(a,b\)的最大公因数

\(lcm(a,b)\):\(a,b\)的最小公倍数

最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。\(a\),\(b\)的最大公约数记为\((a,b)\),同样的,\(a\),\(b\),\(c\)的最大公约数记为\((a,b,c)\),多个整数的最大公约数也有同样的记号。

求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,\(a\),\(b\)的最小公倍数记为\([a,b]\)。

Small Quiz

如果我们把A分解成了\(2^{a_1}3^{a_2}5^{a_3}…\)

把B分解成了\(2^{b_1}3^{b_2}5^{b_3}…\)

1、如何快速求\(gcd(a,b)?\)

设\(d=2^{P_1}3^{P_2}5^{P_3}…\)

则很容易得到

\(P_1\le a_1,P_1 \le b_1\)

\(P_2\le a_2,P_2 \le b_2\)

\(P_3\le a_3,P_3 \le b_3…\)

所以a,b的最大公因数$$d=2{min(a_{1},b_1)}3{min(a_{2},b_2)}5^{min(a_3,b_3)}…$$

2、如何快速求\(lcm(a,b)?\)

类似的只要把上面的\(min\)改成\(max\)就好了

$$c=2{max(a_{1},b_1)}3{max(a_{2},b_2)}5^{max(a_3,b_3)}…$$

一个小式子:\(gcd(a,b)*lcm(a,b)=a*b\)

以a=1008,b=60为例:

\(1008=2^43^25^07^1\)

\(60=2^23^15^17^0\)

\(gcd(a,b)=2^23^15^07^0=\)

\(lcm(a,b)=2^43^25^17^1\)

\(gcd*lcm=2^23^15^07^02^43^25^17^1=1008*60\)


如何求GCD

直接给出两个数,如何求\(gcd(a,b)\)?

做法:GCD递归定理

\[gcd(a,b)=gcd(b,a\% b)
\]

等价的写法:\(gcd(a,b)=gcd(a\%b,b)\)

代码实现

  1. \\递归
  2. int gcd(int a,int b){
  3. if(b==0)return a;
  4. return gcd(b,a%b);
  5. }
  1. \\迭代
  2. int gcd(int m, int n) {
  3. while(m>0) {
  4. int c=%m;
  5. n=m;
  6. m=c;
  7. }
  8. return n;
  9. }

一条性质

记\(F[n]\)为斐波那契数列的第\(n\)项,则有

$$gcd(F[a],F[b])=F[gcd(a,b)]$$

求lcm

\(lcm(a,b)=a/gcd(a,b)*b\)

五一DAY1数论学习笔记的更多相关文章

  1. 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)

    ~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...

  2. 第一周 day1 Python学习笔记

    为什么要学习Python? Python擅长的领域 1. python2.x中不支持中文编码,默认编码格式为ASCII码,而python3.x中支持Unicode编码,支持中文,变量名可以为中文,如: ...

  3. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  4. 《从零开始学Swift》学习笔记http(Day1)——我的第一行Swift代码

    Swift 2.0学习笔记(Day1)——我的第一行Swift代码 原创文章,欢迎转载.转载请注明:关东升的博客 当第一次看到下面代码时我石化了,这些代码是什么东东?单词拼出来的? import Fo ...

  5. OpenCV图像处理学习笔记-Day1

    OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...

  6. Android学习笔记(五一):服务Service(上)- IntentService

    转自 http://blog.csdn.net/flowingflying/article/details/7616333 对于需要长期运行,例如播放音乐.长期和服务器的连接,即使已不是屏幕当前的ac ...

  7. sqli-labs学习笔记 DAY1

    DAY 1 准备工作 安装phpstudy 安装配置sqli-labs 学习笔记 SQL语句的注释:–, # +在URL经过编码后会编码为空格 SQL语句的查询语句:SELECT column_nam ...

  8. [学习笔记]NTT——快速数论变换

    先要学会FFT[学习笔记]FFT——快速傅里叶变换 一.简介 FFT会爆精度.而且浮点数相乘常数比取模还大. 然后NTT横空出世了 虽然单位根是个好东西.但是,我们还有更好的东西 我们先选择一个模数, ...

  9. 【转】 Pro Android学习笔记(五一):ActionBar(4):标准和Tab模式

    之前,我们学习的Action Bar是标准模式,Tab模式的如下图所示. 对于Tab,我们在Android学习笔记(二二): 多页显示-Tag的使用中学习过,但Action Bar的tab更适合fra ...

随机推荐

  1. 通过IP获取MAC地址例子(应用层)

    博客地址:http://home.cnblogs.com/u/zengjianrong/ 由于某种需求,需要获取某个ip的mac地址,在应用层实现例子如下代码. 流程:1. 先遍历arp表,若存在对应 ...

  2. ROS向节点传递参数

    ROS的节点有很多中调用方式,包括rosrun,launch,直接运行等,向节点内传递参数的方式也有很多. 1. rosrun + 参数服务器传递 ros::init(argc, argv, &quo ...

  3. vCenter6.7的简单安装与使用

    1.VMware的vCenter已经有了很大的改进,安装过程极为简单方便. 2. 下载vCenter的安装包即可. 我这边下载的ISO为: VMware-VIM-all--.iso 网上有资源,通过百 ...

  4. Java 中要将 String 类型转化为 int 类型

    在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...

  5. 深入V8引擎-AST(5)

    懒得发首页了,有时候因为贴的代码太多会被下,而且这东西本来也只是对自己学习的记录,阅读体验极差,所以就本地自娱自乐的写着吧! 由于是解析字符串,所以在开始之前介绍一下词法结构体中关于管理字符串类的属性 ...

  6. ubuntu与centos系统对比

    CentOS与Ubuntu该如何选择,哪个更好用.笔者在自媒体平台收集了一些网友的观点,较为经典,分享给大家.至于应该选择哪个,希望看完本文章后,读者心中有数. 观点1:CentOS适用于服务器,Ub ...

  7. python高级编程——网络编程(一)

    计算机网络基础 概念:计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信.而网络编程就是开发计算机网络应用程序 计算机的通信协议 概念:计 ...

  8. spring AOP的两种配置

    xml配置 定义要被代理的方法的接口 public interface TestAop { public void print(String s); } 实现上述接口 public class Tes ...

  9. Promise 封装 ajax

    Promise 封装ajax 成链式结构: var url = 'http'; function(method, url) { return new Promise(function(res, ret ...

  10. 4 Linux文件与目录管理

    Linux的目录文件结构为树状结构,最顶级目录为根目录 / 其他目录通过挂载可以将他们添加到树中,通过解除挂载可以移除他们 绝对路径: 根目录开始 eg: /usr/share/doc 相对路径: 不 ...