数论入门笔记

2023-11-14

数论入门笔记



一、 数论是什么

数论主要研究整数的性质。需要关注的是一些特殊的数,如质数,素数,最大公约数,最小公倍数等等,以及相应的欧几里得算法,和各种筛法,欧拉函数,积性函数等等等等。。。。。。。


二、数论基础

1. 欧几里德算法(辗转相除法)

可以通过欧几里得算法来算出两个正整数a,b的最大公约数。
复杂度: O ( l o g ( m a x ( a , b ) ) O(log(max(a,b)) O(log(max(a,b))
代码如下(示例):

 int gcd(int a, int b){
 	return b == 0? a : gcd(b,a%b);//b==0 是递归的边界条件
 }

下面是该程序的运算过程:
欧几里得算法的过程
也可以直接调用库函数__gcd(a,b);

2. 有关素数的基础算法

单个整数素性测试
简单素数筛

素数只有:素数它本身和1。判断一个数是否是素数只需检查 2 ~ / ( n ) \sqrt(n) ( n)内的整数是否存在有能整除这个数的数就能判断这个数是不是素数。
复杂度: O ( ( n ) ) O(\sqrt(n)) O(( n))
代码如下(示例):

bool is_prime()
{
	for(int i=2;i*i<=n;i++)
	{
		if(n%i==0)return false;
	}
	return n!=1;
}
多个整数素性测试

n内的素数的总数大概是 n / l n ( n ) n/ln(n) n/ln(n)

埃氏筛法(Eratosthenes筛法)

用于高效去对多个整数进行素数检测(素数的个数<= 1 0 6 10^6 106)
2 ~ n的数写入数组,之后找到最小并且没有被划去的数,之后将在2 ~ n之间这个数的倍数划去,以此枚举n以内的素数。
复杂度: O ( n l o g ( l o g ( n ) ) ) O(nlog(log(n))) O(nlog(log(n)))
代码如下(示例):

#define MAX_N 1000010
int prime[MAX_N];
bool is_prime[MAX_N+1];
int sieve(int n)
{
	int p=0;
	for(int i=0;i<=n;i++) is_prime[i]=true;
	is_prime[0]=is_prime[1]=false;
	for(int i=2;i<=n;i++)
	{
		if(is_prime[i])
		{
			prime[p++]=i;
			for(int j=2*i;j<=n;j+=i)is_prime[j]=false;
		}
	}
	return p;
}
区间筛法

在区间[a,b)上 (a<b<= 1 0 12 10^{12} 1012,b-a<= 1 0 6 10^6 106)
用埃氏筛法算出[2, ( b ) \sqrt(b) ( b)]的质数,同时划去[a,b)中这个质数的倍数。
代码如下(示例):

#define MAX_L 1000010
#define MAX_SQRT_B 1000010
typedef long long int ll;
bool is_prime[MAX_L];
bool is_prime_small[MAX_SQRT_B];
void segment_sieve(ll a,ll b){
	for(int i=0;(ll)i*i<b;i++)is_prime_small[i]=true;
	for(int i=0;i<b-a;i++)is_prime[i]=true;
	for(int i=2;(ll)i*i<b;i++)
	{
		if(is_prime_small[i]){
			for(int j=2*i;(ll)j*j<b;j+=i){is_prime_small[j]=false;}
			for(ll j=i*max(2LL,(a+i-1)/i);j<b;j+=i)is_prime[j]=false;
		}
	}
}
欧拉筛法(线性筛法)

埃氏筛法在筛选时有重复,如6它被素数2和素数3都筛过,像这样的数有很多,而欧拉筛法不会。

int prime[maxn];
int is_prime[maxn];
void Prime(){
    mem(is_prime,0);
    mem(prime, 0);
    for (int i = 2;i <= maxn; i++) {
        if (!is_prime[i]) {
            prime[++prime[0]] = i;      //纪录素数, 这个prime[0] 相当于 cnt,用来计数
        }
        for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) {
            is_prime[i*prime[j]] = 1;
            if (i % prime[j] == 0) {
                break;
            }
        }
    }
}

3. 扩展欧几里德算法

裴蜀定理
若a,b是整数,且gcd(a,b)=g,那么对于任意的整数x,y,ax+by=m中的m一定是g的倍数。反之ax+by=m有解,m一定是g的倍数。
它的一个重要推论是:a,b互质的充要条件是存在整数x,y使ax+by=1。

扩展欧几里德算法这个算法原理如下:
g c d ( a , b ) = g c d ( b , a m o d b ) ; gcd(a,b)=gcd(b,a mod b); gcda,b=gcd(b,amodb);
g c d ( a , b ) = a x 1 + b y 1 ( 裴 蜀 定 理 ) gcd(a,b)=ax_1+by_1(裴蜀定理) gcd(a,b)=ax1+by1()
即 g c d ( b , a m o d b ) = b x 2 + ( a m o d b ) y 2 即gcd(b,a mod b)=bx_2+(a mod b)y_2 gcdb,amodb=bx2+(amodb)y2
推导通解:
a x 1 + b y 1 = a x 2 + b y 2 ax_1+by_1=ax_2+by_2 ax1+by1=ax2+by2
即 a x 1 + a x 2 = b y 1 + b y 2 即ax_1+ax_2=by_1+by_2 ax1+ax2=by1+by2
两 边 同 除 g c d ( a , b ) , 简 写 g 两边同除gcd(a,b),简写g gcd(a,b),g//如果g=0,意味a=0 or b=0
( a / g ) ( x 1 + x 2 ) = ( b / g ) ( y 1 + y 2 ) , 有 因 为 互 素 , 所 以 ( x 1 + x 2 ) 一 定 是 ( b / g ) 的 倍 数 , 所 以 可 的 通 解 为 ( x 0 + k ( b / g ) , y 0 + k ( b / g ) ) (a/g)(x_1+x_2)=(b/g)(y_1+y_2),有因为互素,所以(x_1+x_2)一定是(b/g)的倍数,所以可的通解为(x_0+k(b/g),y_0+k(b/g)) (a/g)(x1+x2)=(b/g)(y1+y2),(x1+x2)b/gx0+k(b/g),y0+k(b/g)
推导算法:
a x 1 + b y 1 = b x 2 + ( a m o d b ) y 2 ax_1+by_1=bx_2+(amodb)y_2 ax1+by1=bx2+(amodb)y2
已 知 x 2 , y 2 , a m o d b = a − ( a / b ) ∗ b , 代 入 已知x_2,y_2,amodb=a-(a/b)*b,代入 x2,y2,amodb=a(a/b)b,
a x 1 + b y 1 = b x 2 + ( a − ( a / b ) ∗ b ) y 2 = ax_1+by_1=bx_2+(a-(a/b)*b)y_2= ax1+by1=bx2+(a(a/b)b)y2=
a x 1 + b y 1 = a y 2 + b ( x 2 − ( a / b ) y 2 ) ax_1+by_1=ay_2+b(x_2-(a/b)y_2) ax1+by1=ay2+b(x2(a/b)y2)
x 1 = y 2 , y 1 = ( x 2 − ( a / b ) y 2 ) x_1=y_2,y_1=(x_2-(a/b)y_2) x1=y2,y1=(x2(a/b)y2)
当 b = 0 时 a x + b y = g c d ( a , 0 ) = a ; − > x = 1 , y = 0 ; 当 b=0时 ax+by=gcd(a,0)=a; ->x=1,y=0; b=0ax+by=gcd(a,0)=a;>x=1,y=0;//临界条件

//1.
void gcd(int a,int b,int& d,int& x,int& y)
{
	if(!b){d=a;x=1;y=0;}
	else {gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
//2.
int extgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
{
    int d=a;
    if(b!=0)
    {
        d=extgcd(b,a%b,x,y);y-=(a/b)*x;
    }
    else
    {
        x=1;y=0;
    }
        return d;  
}

费马小定理
如果p是一个质数,而整数a不是p的倍数,则有 a p − 1 ≡ 1 ( m o d p ) a^{p-1}≡1(mod p) ap11(modp
逆元
类似倒数, a x ≡ b m o d m ; a c ≡ 1 m o d m ax≡b mod m; ac≡1 mod m axbmodm;ac1modm; c就是a的逆元; a c ≡ 1 m o d m 等 价 a c = 1 + m k ac≡1 mod m等价ac=1+mk ac1modmac=1+mk ac-mk=1,这就成了 扩展欧几里德算法。

int mod_inverse(int a,int b)
{
	int x, y;
	extgcd(a,m,x,y);
	return (m+x%m)%m;
}

三. 模运算

同余定理:
a mod b=c 则(a+b*k) mod b=c (k!=0)
(a+b) mod n=[(a mode n)+(b mod n)] mod n
(a-b) mod n=[(a mode n)-(b mod n)+n] mod n
a b mod n=(a mod n)(b mod n) mod n
注意乘法时可能会溢出所以要用long long int来保存中间结果
代码如下(示例):

int mul_mod(int a,int b,int mod)
{
	a%=mod;b%=mod;
	return (int)(a*1LL*b)%mod;
 } 

四. 快速幂运算

反复平方法

  x n = ( ( x 2 ) 2 ) . . . \ x^ {n}=((x^{2})^2)...  xn=(x2)2)...
复杂度: O ( l o g ( n ) ) O(log(n)) O(log(n))

代码如下(示例):

typedef long long int ll;
ll mod_pow(ll x,ll n,ll mod)
{
	ll res = 1;
	while(n>0)
	{
		if(n&1) res=res * x % mod;//当n为奇数时
		x=x*x%mod;
		n>>=1;
	}
	return res;
}  

五、计数与概率

1. 杨辉三角与二项式

C [ i ] [ j ] = C [ i − 1 ] [ j − 1 ] + C [ i − 1 ] [ j ] C[i][j]=C[i-1][j-1]+C[i-1][j] C[i][j]=C[i1][j1]+C[i1][j]

2. 数论中的计数问题

n的正约数的个数 ( a 1 + 1 ) ( a 2 + 1 ) . . ( a n + 1 ) (a1+1)(a2+1)..(an+1) (a1+1)(a2+1)..(an+1)
欧拉筛法求1-n的k次方的约数个数之和

const int size=1e7+5;
bool prime[size];//is素数 
int p[size];//素数             
int sigma[size];//因质数个数 
int tot=0;//素数个数 
int k;//素数k次方 
void init()
{
	sigma[1]=1;
    for(int i=2;i<size;i++) prime[i]=true;
    for(int i=2;i<size;i++)
    {
        if(prime[i]) 
        {
            p[tot++]=i;
            sigma[i]=k+1;
        }
        for(int j=0;j<tot&&p[j]*i<size;j++)
        {
            prime[i*p[j]]=false;
            if(i%p[j]==0)
            {
                sigma[i*p[j]]=sigma[i]*2-sigma[i/p[j]];// 相当于
                break;
            }
            else 
            {
                sigma[i*p[j]]=sigma[i]*(k+1);// 相当于
            }
        }
    }
}

算小于与n互素的整数个数用欧拉函数。
φ φ φ函数的值:

φ ( x ) = x ( 1 − 1 / p ( 1 ) ) ( 1 − 1 / p ( 2 ) ) ( 1 − 1 / p ( 3 ) ) … . . ( 1 − 1 / p ( n ) ) φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))…..(1-1/p(n)) φ(x)=x(11/p(1))(11/p(2))(11/p(3))..(11/p(n)) 其中 p ( 1 ) , p ( 2 ) … p ( n ) p(1),p(2)…p(n) p(1),p(2)p(n)为x的所有质因数;x是正整数; φ ( 1 ) = 1 φ(1)=1 φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。

3. 离散概率初步

条件概率: P ( B ∣ A ) = P ( A B ) / P ( A ) P(B|A)=P(AB)/P(A) PBA=P(AB)/P(A)
全概率公式: P ( B ) = P ( A 1 ) P ( B ∣ A 1 ) + P ( A 2 ) P ( B ∣ A 2 ) + . . P(B)=P(A1)P(B|A1)+P(A2)P(B|A2)+.. PB=P(A1)P(BA1)+P(A2)P(BA2)+..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数论入门笔记 的相关文章

  • APK的安装流程

    文章目录 我们来思考一下Android系统是如何安装一个APK文件的 从直观的流程上 当我们点击一个APK文件或者从应用商店下载一个APK文件 会弹起一个安装对话框 点击安装就可以安装应用 那么这里面的流程是什么样的呢 首先很容易想到的是
  • QT增加链接库和头文件搜索目录(相对目录)

    QT开发的时候 需要增加链接的动态库或者静态库 或者搜索的头文件 正常情况下 使用相对目录是最好的 下面是常用的方法 1 增加库依赖 如下 OUT PWD表示QT编译后的输出目录 比如Debug或者Release目录 后续发布的时候 把so
  • 【设计模式】Java设计模式——模板方法模式(Template Pattern)

    文章目录 1 介绍 1 1 定义 1 2 作用 2 模式结构 2 1 UML类图 2 2 模式组成 3 代码实例 3 1 背景 3 2 应用 4 优点 5 缺点 6 应用场景 1 介绍 1 1 定义 模板方法模式 Template Patt
  • 上古神器Vim

    玩转Vim 世界上10种人 会用Vim的和不会用Vim的 玩转Vim 从放弃到爱不释手 什么是Vim Linux下两大编辑神器之一Vim Linux Unix下使用最多的编辑器 Vi的改进版 可能是最难上手的编辑器之一 为什么要学习Vim
  • 【经验分享】用PS如何将图片的四角做成圆弧角

    经验分享 用PS如何将图片的四角做成圆弧角 在很多情况下圆角图片看起来更美观整洁 今天分享一下自己经常使用 PS 是如何将图片做出圆弧角 仅供参考 以下面这张图片为例 一 在 PS 中打开素材图片 选择 圆角矩形工具 二 在上方选项卡中选择
  • 基于javaweb的网上电商项目(前后端分离+java+vue+springboot+ssm+mysql+redis)

    基于javaweb的网上电商项目 前后端分离 java vue springboot ssm mysql redis 运行环境 Java 8 MySQL 5 7 Node js 10 开发工具 后端 eclipse idea myeclip
  • chrony服务部署,实现时间同步

    目录 chrony服务部署实验 实验一 第一台机器从阿里云同步时间 第二台机器从第一台机器同步时间 实验二 第一台服务器使用系统时间作为第二台服务器的时钟源 第一台服务器层级设置为6 问题排错 NTP 是网络时间协议 Network Tim
  • 记一次ubuntu16误删libc.so.6操作的恢复过程

    背景 操作系统 ubuntu16 glibc版本 2 23 修改原因 经过一系列报错和手工构建之后 vulkansdk成功安装 起码运行 vulkansdk成功 在进行 vulkaninfo进行验证时 报错 意思是当前glibc版本过低 需
  • 数字化转型面临的五大挑战

    如果将数字化转型分成五个阶段 全球大多数组织正处在第二和第三的僵局阶段 而处于第四和第五阶段的组织 全球不超过25 总体而言 未来数字化转型将面临五大挑战 一是陈旧的考核体系 数字企业需要新的度量标准来了解进度和引导投资 如果考核体系不变
  • 1_01李婉玲_函数_1019

    day04作业练习 作业01 小明和他家人在泰国旅游 到3个不同的饭店吃饭 账单 bill 分别是124元 48元和268元 为了给服务员小费 tip 小明创建了一个简单 的小费计算器函数 tipCalculator a 如果账单小于50元
  • spring jdbctemplate操作数据库

  • 【高数】Abel定理,幂级数的和收敛半径,不同幂级数收敛半径的比较,缺项幂级数的解法

    目录 一 收敛区间及收敛点 二 收敛半径的变化 三 借助正项级数敛散性求幂级数收敛区间 四 缺项幂级数的解法 五 小结 一 收敛区间及收敛点 现对该形式的幂级数进行如下讨论 1 幂级数的收敛区间 对称中心是x0 收敛半径是R 2 经有限次的
  • 最美丽的理论:爱因斯坦引力场方程的推导

    全文共2948字 预计学习时长9分钟 图源 superprof 伟大的前苏联物理学家列夫 朗道和叶夫根尼 利夫希茨在他们的著作 经典场论 中写道 建立在相对论基础上的引力场理论被称为广义相对论 它是由爱因斯坦建立的 并且可能是现存的物理理论
  • 局域网速度测试,三款软件轻松搞定(转)

    局域网络可谓随处可见 我们也十分关注其实际运行速度如何 比如两台计算机间的文件传输 访问对方计算机的快慢等 而决定局域网络速度的因素很多 又不可能通过简单的操作检测出速度的大小 同时也希望能有一些软件能帮助我们管理局域网 以方便故障的排查
  • LeetCode 1967. 作为子字符串出现在单词中的字符串数目(BM、KMP)

    给你一个字符串数组 patterns 和一个字符串 word 统计 patterns 中有多少个字符串是 word 的子字符串 返回字符串数目 子字符串 是字符串中的一个连续字符序列 示例 1 输入 patterns a abc bc d
  • 【GD32F303开发之开发工具的安装与配置】

    GD32F303开发系列文章目录 第一章 GD32微控制器开发工具的安装与配置 第二章 GD32基准工程实验 第三章 GD32串口通信实验 第四章 GD32EXMC与LCD显示实验 文章目录 GD32F303开发系列文章目录 前言 一 GD
  • 为了使用学校GPU集群而离线安装Python和pytorch

    参考 https blog csdn net zhangdongren article details 82685932 学校GPU集群为无网环境 所以要离线安装 1 下载python 源文件 2 解压到 下的某个目录 make编译源文件
  • 冒泡排序法

    冒泡排序 冒泡排序的排序过程 N个数最外层的for循环次数为 N 1 次 内层for循环为 N 1 i 次 每一轮凑从第1个数开始对比 每一次都是和它下一个元素对比 将最大值元素放到最后 其他元素向前移位 重复以上动作 知道N 1次循环全部
  • 钢琴音阶识别_基础知识:关于大小音阶的简单说明

    大小音阶 Scales 简单说明 音阶是音乐的构造块 building blocks 有上千种不同的音阶 有时称调式 每一种都有其特性与功能 peculiarities and functions 从我们称为 西方 音乐中 从欧洲国家起源的
  • Golang中常用的代码优化点

    写代码其实也有很多套路和经验 这篇介绍几个让golang代码更优雅的四个套路 大家好 我是轩脉刃 这篇想和大家聊一聊golang的常用代码写法 在golang中 如果大家不断在一线写代码 一定多多少少会有一些些代码的套路和经验 这些经验是代

随机推荐

  • Centos SSH免密登录

    1 防火墙操作相关 systemctl stop firewalld 永久关闭防火墙 systemctl disable firewalld 2 关闭Selinux 1 查看状态 getenforce 2 临时关闭 setenforce 0
  • java “Unsupported major.minor version 52.0错误“解决办法

    java Unsupported major minor version 52 0错误 解决办法 java Unsupported major minor version 52 0错误 解决办法 解决办法 java Unsupported
  • Landsat数据下载

    Landsat数据下载步骤 0 Landsat数据介绍 1 下载地址 2 下载步骤 2 1 检索数据 2 1 1 设置地点 有多种方法 2 1 2 选择时间范围 2 1 3 在Data Sets界面选择传感器 卫星或者传感器的名称 2 2
  • el-select可以输入选择项以及选择某一项后出现输入文本框

    效果 直接上代码做笔记 通过ref属性获取输入内容 在 blur中进行赋值 很好的实现了可选择 可输入
  • 进程概念

    基本概念 进程是程序的一个执行实例 从内核来看 进程是担当分配系统资源的实体 注 在Linux操作系统中 大多数指令都是创建了一个个的进程 操做系统如何管理内存 答 使用一个结构体 PCB 来描述进程 使用高效的数据结构来组织进程 描述进程
  • 学习记录-Qt读取条码扫描枪

    一 条码简介 条形码 barcode 是将宽度不等的多个黑条和空白 按照一定的编码规则排列 用以表达一组信息的图形标识符 常见的条形码是由反射率相差很大的黑条 简称条 和白条 简称空 排成的平行线图案 条形码可以标出物品的生产国 制造厂家
  • git强制更新(覆盖)本地仓库与远程仓库一致

    问题描述 在远程改好代码 且改动较多 不想耗费精力进行合并的操作 于是想强制覆盖本地仓库 解决方案 使用以下指令 git fetch all git reset hard origin master
  • 在kali中常见的三种扫描

    第一步 确保要扫描的电脑和执行扫描的电脑是否在同一个网段上 Kali里面查看ip地址的命令为ifconfig ifconfig Win7系统查看IP地址的命令为ipconfig ipconfig 在kali中输入ping 192 168 5
  • 多级菜单 jquery折叠菜单

    多级jquery折叠菜单 前言 效果图 分析 前言 先上代码 DOCTYPE html gt
  • C++模板初阶

    C 模板初阶 泛型编程 函数模板 概念 函数模板格式 函数模板原理 函数模板的实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的实例化 泛型编程 我们前面学习了C 的函数重载功能 那么我们如何实现一个通用的交换函数呢 比如 我传
  • git上传遇到 GitHub could not read Username 的解决办法

    Gitversion 1 8 5 2 执行git push命令异常 如下 1 Push failed 2 Failed with error unable to read askpass response from C Users eddy
  • Springboot学习笔记5:整合JDBC

    一 什么是JDBC 在web开发中 不可避免的地要使用数据库来存储和管理数据 为了在java语言中提供数据库访问的支持 Sun公司于1996年提供了一套访问数据的标准Java类库 即JDBC JDBC的全称是Java数据库连接 Java D
  • computed与watch的区别

    一 computed与watch 在之前的练习中本人碰到computed来监听某个数据变化 我们都知道computed与watch都是可以监听数据变化 但具体要怎么区别它们呢 1 1 watch 1 1 1 watch的简单执行
  • xss原理和分类

    前言 准备智警杯的过程中 也不能掉下漏洞的学习 浅浅学习一下关于xss的一些知识 何为xss 全名跨站脚本攻击 也属于注入 属于代码注入的一种 由于未进行严格的过滤 haker可以将恶意代码注入到网页当中 其他用户在访问该网页时会执行恶意代
  • 真的!!!两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点!...

    给前端宇宙加星标 提升前端小宇宙 作者 coder94 https segmentfault com a 1190000017866549 两行css如下 列间距 可有可无 默认30px column gap 0 效果图如下
  • IDEA导入Spring源码环境搭建

    一 环境准备 1 Spring源码包 下载地址 https github com spring projects spring framework 2 gradle工具 下载地址 http downloads gradle org dist
  • 获取APP签名信息或者查看签名文件的MD5,SHA1,SHA256

    1 查看APP是否签名 将APP文件后缀改为 zip并解压会得到以下内容 CERT RSA就包含签名信息 然后运行命令 keytool printcert file Users Documents app release META INF
  • uni-app 开放生态

    uni app 积极拥抱社区 创建了开放 兼容的生态系统 uni app插件市场 有数千款插件 支持前端组件 js sdk 页面模板 项目模板 原生插件等多种类型 在生态建设上远远领先于竞品 兼容 微信小程序 JS SDK 丰富的小程序生态
  • sql注入之报错注入

    目录 1 常用报错的函数 2 其他函数 一 extractvalue 二 updetaxml 1 常用报错的函数 1 extractvalue 2 updataxml 3 floor 2 其他函数 1 substring extractva
  • 数论入门笔记

    数论入门笔记 目录 数论入门笔记 一 数论是什么 二 数论基础 1 欧几里德算法 辗转相除法 2 有关素数的基础算法 单个整数素性测试 简单素数筛 多个整数素性测试 埃氏筛法 Eratosthenes筛法 区间筛法 欧拉筛法 线性筛法 3