数论学习-初等数论基础总览
文章目录
- 初等数论基础(二)
- 建议先看
- 零、同余与逆元的概念
- 0.1 同余
- 0.2 逆元概念
- 0.2.1 逆元的求法
- 一、数论只会gcd
- 1.1 gcd
- 1.1.1 (a,b) = (a,a+b) 的证明
- 1.1.2 (a,b) = (b,a%b)的证明
- 辗转相除法代码:
- 辗转相除法时间复杂度
- 1.2 当然还会exgcd
- 1.2.1 裴蜀定理
- 1.2.2 ax+by = gcd(a,b)的求解
- 二、欧拉相关
- 2.1 欧拉函数
- 2.2 欧拉定理相关
- 2.2.1 欧拉定理与费马小定理
- 2.2.1.1 欧拉定理
- 2.2.1.2 费马小定理
- 2.2.1.3 乘法逆元
- 2.2.2 扩展欧拉定理
- 2.2.3 光速幂
- 三、同余方程相关与逆元求解
- 3.1 线性同余方程
- 3.1.2 威尔逊定理
- 3.2 逆元求解
- 3.2.1 exgcd求逆元
- 3.2.2 快速幂求逆元
- 3.3 中国剩余定理(CRT)
- 参考
初等数论基础(二)
建议先看
初等数论基础(一)~
零、同余与逆元的概念
本来想直接记逆元的,但是发现初等数论基础一没有讲同余,于是先给出同余的概念:
0.1 同余
同余:若整数a和整数b除以m的余数相等,则称a,b模m同余,记为
a≡b(modm)a \equiv b(mod \quad m)a≡b(modm)
对于同余的概念需要掌握,另外有关于同余类和剩余系的概念,了解即可:
其实同余类和离散数学的等价类类似。
另外:同余具有传递性,也可以做加减:
0.2 逆元概念
对于正整数a和m,如果有am与1在模m意义下同余,那么这个同余方程中x的最小正整数解叫做a%m的逆元
注:逆元与乘法逆元不一样,除乘法逆元外还有加法逆元、卷积逆元、矩阵逆元等。
若
ax≡1(modb),则称x是a关于模b的逆元ax\equiv 1(mod\quad b),则称x是a关于模b的逆元 ax≡1(modb),则称x是a关于模b的逆元
一般把一个数a的逆元记为a−1一般把一个数a的逆元记为a^{-1}一般把一个数a的逆元记为a−1
0.2.1 逆元的求法
1.exgcd求逆元
2.如果m是质数,可以通过快速幂求逆元(费马小定理)
3.如果模数是素数,可以O(n) 线性递推求逆元
方法1和方法2将在后面的内容中讲到,读者往后看即可,这里先给出第三种方法,线性递推求逆元
首先定义1的逆元是1,因为1显然与1同余
于是有代码:
typedef long long ll;
inv[i] = (1ll*(p-p/i)*inv[p%i])%p;
一、数论只会gcd
1.1 gcd
1.1.1 (a,b) = (a,a+b) 的证明
(a,a) = (a,0) = a(显然)
(a,b) = (a,a+b) = (a,ka+b)
(a,b) = (b,a%b)
1.1.2 (a,b) = (b,a%b)的证明
也叫辗转相除法
注意:gcd(a,b) = 1说明a和b互质。
另外:gcd(1,1) = 1,gcd(a,0) = a,gcd(a,1) = 1
辗转相除法代码:
ll gcd(ll a,ll b)
{return b?gcd(b,a%b):a;
}
//或者写成
ll gcd(ll a,ll b)
{if(b==0){return a;}return gcd(b,a%b);
}
辗转相除法时间复杂度
只知道是小于log2(b)的呜呜呜
小于log2(b) 很好证:
只需要证a%b<b/2就可以了
1.2 当然还会exgcd
啥?除了gcd还有exgcd????
在欧几里得求得gcd(a,b)以后,大家并不满足,于是好奇一个方程的解:
ax+by=gcd(a,b)已知a,b,求一组x,y使得方程成立ax+by = gcd(a,b) \\已知a,b,求一组x,y使得方程成立 ax+by=gcd(a,b)已知a,b,求一组x,y使得方程成立
在将这个方程的解之前需要介绍裴蜀定理:
1.2.1 裴蜀定理
∀a,b,∃x,ys.t.ax+by=gcd(a,b)\forall a,b ,\exists x,y \quad s.t. \quad ax+by = gcd(a,b) ∀a,b,∃x,ys.t.ax+by=gcd(a,b)
哈,其实就是说1.2的方程一定是有解的
1.2.2 ax+by = gcd(a,b)的求解
先构造:
显然当b = 0时,有x = 1,y = 任意值(一般写成0)
对于b!=0的情况:
只要每次先把(2)式求出,那么(1)式的解也能出来了:)
代码:
#include<bits/stdc++.h>
using namespace std;const int N = 1e5+10;
int exgcd(int a,int b,int &x,int &y)
{if(!b){x = 1,y = 0;return a;}int d = exgcd(b,a%b,y,x);y-=a/b*x;return d;
}
int main()
{int n;cin>>n;while(n--){int a,b,x,y;cin>>a>>b;exgcd(a,b,x,y);cout<<x<<' '<<y<<endl;}return 0;
}
这里给出例题:)例题链接
分析:题目要求ax+by=c的解:
令d = gcd(a,b),显然只有c%d==0即d|c时该方程有解。
我们通过exgcd先求出ax+by=d的一组特解x0,y0,然后该方程的一组特解x1,y1通过x0,y0分别乘上c/d即可得到
而通解如何求解呢?
显然可以通过先求得的特解推通解,k是任意整数,显然加号和减号的位置可以互相交换。
二、欧拉相关
2.1 欧拉函数
详细定义见:初等数论基础一
2.2 欧拉定理相关
2.2.1 欧拉定理与费马小定理
2.2.1.1 欧拉定理
记为:
说人话就是:对于任意a与n互质,即有a的φ(n)次方与1在模n意义下同余。
例:
φ(7)=6,3φ(7)=36%7≡1(mod7)\varphi(7) = 6,\quad 3^{\varphi(7)} = 3^6\%7 \equiv1(\mod 7) φ(7)=6,3φ(7)=36%7≡1(mod7)
2.2.1.2 费马小定理
2.2.1.3 乘法逆元
例题:例题链接
容易发现,费马小定理就是欧拉定理的特殊情况。
2.2.2 扩展欧拉定理
引申:
若b>φ(n),则ab≡ab%φ(n)+φ(n)(modn)若b>\varphi(n),则a^b \equiv a^{b\%\varphi(n)+\varphi(n)}( mod \quad n) 若b>φ(n),则ab≡ab%φ(n)+φ(n)(modn)
例题:
最幸运的数字
2.2.3 光速幂
例题:P5110
三、同余方程相关与逆元求解
3.1 线性同余方程
例题:线性同余方程
所以,当线性同余方程有解时只需要先用exgcd求解
ax+my=gcd(a,m),得到一组特解x0,y0然后x=x0∗b/gcd(a,m)即是原线性同余方程的一个解。ax+my = gcd(a,m),得到一组特解x0,y0\\ 然后x = x0*b/gcd(a,m)即是原线性同余方程的一个解。 ax+my=gcd(a,m),得到一组特解x0,y0然后x=x0∗b/gcd(a,m)即是原线性同余方程的一个解。
容易发现:
线性同余方程ax≡b(modm)即转化为ax+my=b,然后通过exgcd求解ax\equiv b(mod\quad m)\\即转化为ax+my=b,然后通过exgcd求解ax≡b(modm)即转化为ax+my=b,然后通过exgcd求解
例题链接
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
ll a,b,x,y;ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x = 1,y = 0;return a;}ll d = exgcd(b,a%b,y,x);y -= a/b*x;return d;
}
int main()
{ll a,b,x,y;cin>>a>>b;exgcd(a,b,x,y);cout<<(x%b+b)%b;
}
3.1.2 威尔逊定理
(p-1)的阶乘在模p意义下与-1同余。
(p−1)!≡−1(modp)(p-1)!\equiv -1(mod\quad p)(p−1)!≡−1(modp)
3.2 逆元求解
3.2.1 exgcd求逆元
我们知道:若ax≡1(modb)ax\equiv 1(mod\quad b)ax≡1(modb),则由线性同余方程可以转化为
ax+by=1ax+by=1ax+by=1
那么可以直接调用扩展欧几里得算法求逆元。
3.2.2 快速幂求逆元
如果b为质数,则φ(b)=b−1再由欧拉定理:∴ab−1≡1(modb)∵a∗ab−2=ab−1∴a在模b意义下的逆元就是ab−2\varphi(b)=b-1\\再由欧拉定理:\\ \therefore a^{b-1} \equiv 1(mod\quad b)\\ \because a*a^{b-2} = a^{b-1}\\ \therefore a在模b意义下的逆元就是a^{b-2}φ(b)=b−1再由欧拉定理:∴ab−1≡1(modb)∵a∗ab−2=ab−1∴a在模b意义下的逆元就是ab−2
于是可以快速幂求啦!
3.3 中国剩余定理(CRT)
中国剩余定理是干嘛的呢?
例如解以下方程组:
参考
《算法竞赛进阶指南》
大佬博客
这位大佬的博客激励我继续前进
关于同余的传递性和加减法的证明
数论学习-初等数论基础总览相关推荐
- 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)
<繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...
- 孙立岩 python-basic: 用于学习python基础的课件(一二三四)
python-basic: 用于学习python基础的课件 介绍 此部分讲解Python的基础,点击目录学习对应的小节: 01-简介,概述一下python: 02-环境搭建,如何在大家自己的windo ...
- 周志华教授专著《集成学习:基础与算法》上市,破解AI实践难题
[ 摘要 ]<集成学习:基础与算法>上市一周,斩获京东IT新书销量榜第一名桂冠,并拿下京东IT图书销量总榜第二名的惊人成绩. 文中有数据派独家福利哦 本书共读活动已正式开启,文末加入读者交 ...
- Expression Blend学习动画基础
原文:Expression Blend学习动画基础 什么是动画(Animation)? 动画就是时间+换面的组合,画面跟着时间变化.最常见的是flash的动画,还有GIF动态图片. 动画的主要元素 时 ...
- 电脑硬件知识学习_学习计算机基础必读的4本经典入门书籍,自学编程必备书单!...
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你看好文,读好书! 文/黄小斜 转载请注明出处 新手学习计算机并非易事,作为一个自学编程的过来人,深知打好计 ...
- linux shell概述,Linux学习 -- Shell基础 -- 概述
Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串 双引号 ...
- 没学过python、但是还是有公司要-学习python 基础都会了 为什么还是做不出项目呢?...
原标题:学习python 基础都会了 为什么还是做不出项目呢? Python是一门足够简单但又非常强大的程序语言,应用领域甲冠天下,在WEB开发.WEB爬虫.科学计算.人工智能.云计算.数据分析.数据 ...
- python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?
---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...
- python语言的单行注释以井号开头_推荐|零基础学习Python基础知识
原标题:推荐|零基础学习Python基础知识 Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进. Python具有丰富和强大的库,又被称为胶水语言.能把其他 ...
- 深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)
1.预备信息 1.1了解技术的发展阶段 技术一般存在几个阶段:1.发展期.2.高峰期.3.冰河期.4.应用期 就是先达到一个高峰,但是在达到高峰之后就会被发现很多问题,然后热度就会不断地下降,到达一个 ...
最新文章
- MultipartResolver实现文件上传功能
- Delphi2010使用TImage打开jpeg图片错误的处理
- WCF RIA 服务 (三十二)-- 身份验证、角色、个性化 3
- 廖雪峰python教程书-Python 爬虫:把廖雪峰的教程转换成 PDF 电子书
- Visual Studio 2017常用快捷键(小白入)
- javascript之作用域
- python分配buffer_Node.js中的buffer如何和python中的buffer相对应
- 【机器学习】一文解决样本不均衡(全)
- Type mismatch: cannot convert from int to Object错误
- 常用Docker 镜像命令(二)
- java的过滤器_java过滤器
- 时间触发协议(Time triggered protocol)概述
- 【舆情分析(5)】 情感倾向分析之鲁迅《祝福》里对祥林嫂(特定人物)的情感倾向
- 服务器可不可以选择ssd硬盘
- java汉诺塔(含汉诺塔问题的详解)
- 5+App和uni-app在App开发上有何区别?
- 机器学习算法实践-SVM中的SMO算法
- 黑苹果安装教程及相关问题处理心得
- docker-compose搭建seafile开源版私有云盘
- 32位系统能够识别多达内存_C ++程序可打印多达N个术语的卢卡斯系列
热门文章
- 拆t460拆机图解_ThinkPad T460P评测,二楼附ThinkPad T460P拆机图
- 升级qq群一直显示服务器失败怎么回事啊,QQ群创建失败是怎么回事,QQ群创建失败原因是什么...
- Warez出品的精品动画,近25万倍的压缩,大小仅有64K的
- 集查询IP地址信息、查询手机号码信息、查询身份证号信息的一个小程序
- 2018-3-18CCF小球碰撞问题
- 背包DP入门笔记(1) 骨头收集 HDU-2602
- 遥感专业学c语言吗,2019遥感科学与技术专业怎么样、学什么、前景好吗
- DNS反劫持的几种方式
- 抽象代数的代码实现(1) 置换群
- 计算机电路电子技术试题答案,数字电子技术试题库及答案解析知识分享