基础数论重学笔记
之前都没有怎么理解,现在来复习一下。
费马小定理
对于任意质数 \(p\) 和任意整数 \(a\) 满足 \(\gcd(a,p)=1\),有 \(a^{p-1}\equiv 1\pmod p\)。
引理 1
对于任意三个正整数 \(a,b,c\) 满足 \(\gcd(c,m)=1\),若 \(ac\equiv bc\pmod m\),则 \(a\equiv b\pmod m\)。
变成 \(c(a-b)\equiv 0\pmod m\) 之后,因为互质所以可以扔掉 \(m\)。
引理 2
若 \(\{a_1,\cdots,a_m\}\) 是 \(m\) 的完全剩余系,存在整数 \(b\) 满足 \(\gcd(b,m)\),那么 \(\{a_1\times b,\cdots,a_m\times b\}\) 也是 \(m\) 的完全剩余系。
反证法。如果存在 \(a_i\times b\equiv a_j\times b\pmod m\),根据引理 1 可得 \(a_i\equiv a_j\pmod m\),\(a\) 不可能是完全剩余系。
证明
构造关于 \(p\) 的完全剩余系 \(\{0,1,2,\cdots,p-1\}\)。
根据引理 2 可得 \(\{0,a,2a,\cdots,(p-1)a\}\) 也是 \(p\) 的完全剩余系。
一一对应可得 \(1\times 2\times\cdots\times(p-1)\equiv a\times 2a\times\cdots\times(p-1)a\pmod p\)。
即 \((p-1)!\equiv(p-1)!\times a^{p-1}\pmod p\)。
显然 \(\gcd(p,(p-1)!)=1\),根据引理 1 即可证毕。
欧拉定理
\(a^{\phi(n)}\equiv 1\pmod n\),其中 \(\gcd(a,n)=1\)。
费马小定理是 \(n\) 为质数的一种特殊情况。
首先两个与 \(n\) 互质的数的乘积仍然与 \(n\) 互质。
所以证明把费马小定理里面的完全剩余系换成与 \(n\) 互质的剩余系即可。
乘法逆元
乘法逆元,是指数学领域群 \(G\) 中任意一个元素 \(a\),都在 \(G\) 中有唯一的逆元 \(a'\),具有性质 \(a\times a'=a'\times a=e\),其中 \(e\) 为该群的单位元。
单位元是集合里的一种特别的元,与该集合里的运算有关。当它和其他元素结合时,并不会改变那些元素。
所以在模域下的乘法中,单位元就是 \(1\)。
在求 \(\frac{y}{x}\) 时我们可以先求出 \(\frac{1}{x}\) 再乘上 \(y\)。
具体地,若 \(a\times b\equiv 1\pmod p\),则称 \(b\) 是 \(a\) 在模 \(p\) 意义下的乘法逆元,记作 \(a^{-1}\),即 \(b\equiv\frac{1}{a}\pmod p\)。
可以写成 \(a\times b+p\times q=1\) 的形式,根据裴蜀定理只有 \(a\) 与 \(p\) 互质才有解,也就是乘法逆元存在的条件。
费马小定理
只能解决 \(p\) 是质数的情况。
欧拉定理
需要事先求出 \(\phi(a)\)。
把两个定理分开写了一堆废话……
拓展欧几里得
\(b\) 取最小正整数解。
阶乘
在求组合数时我们常常会需要求阶乘的逆元。
先用上面的方法求出 \(n!\) 的逆元,然后考虑递推,从 \(i\) 推到 \(i-1\):
再深入思考一下你会发现 \(\frac{1}{i!}\times(i-1)!=\frac{1}{i}\pmod p\)。
这样就做到了线性求 \(1\sim n\) 的逆元。
如果要线性求一堆数的逆元,可以将 \(i\) 替换成 \(a_i\)。
原文地址:https://www.cnblogs.com/May-2nd/p/14195442.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go语言学习之 panic 和 recover
- Go语言学习之函数
- 【Spark Operator】webhook的分析
- 图解人脸识别算法facenet系列(一)
- Go 语言学习之 struct
- Go 语言学习之map
- 前端|利用手机号登录获取手机验证码
- Linux netstat命令结果分析
- setlistmap部分源码解析
- 使用 Log4j2 + SLF4j 打造日志系统的全方位教程
- 树莓派4的操作系统安装烧录、设置SSH、WIFI、VNC及备份
- C# dotnet 使用 startIndex 提升 IndexOf 的性能
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息