首页 > 其他分享 >数论学习笔记

数论学习笔记

时间:2023-10-30 23:24:51浏览次数:37  
标签:gcd 数论 bmod 笔记 学习 int 逆元 ax equiv

整除

若 \(a / b (b \ne 0)\) 为整数,则称 \(b\) 整除 \(a\) ,记作 \(b \mid a\) 。若 \(a / b\) 和 \(c / b\) 的余数相等,则称 \(a, c\) 模 \(b\) 同余。

同余

关于同余,有以下命题等价:

  1. \(a\) 和 \(b\) 是模 \(d\) 同余的。
  2. 存在某个整数 \(n\) ,使 \(a = b + nd\) 。
  3. \(d\) 整除 \(a - b\) 。

由此可以轻易推出以下性质:

同余的基本性质

  • \[a \equiv b \pmod p \text{且} c \equiv d \pmod p \Rightarrow a \pm c \equiv b \pm d \]

  • \[a \equiv b \pmod p \Rightarrow ak \equiv bk \pmod {pk} \]

  • \[k\mid p \text{且} a \equiv b \pmod p \Rightarrow a \equiv b \pmod k \]

  • \[\text{有逆元时两侧可同除} \]

模运算基本性质

  • \[(a + b) \bmod p = ((a \bmod p) + (b \bmod p)) \bmod p \]

  • \[ab \bmod p = (a \bmod p)(b \bmod p) \bmod p \]

  • \[a \bmod kb \bmod b = a \bmod b \]

欧几里得辗转相除法(gcd)

给定整数 \(a, b\) ,将它们的最大公因数记作 \(\gcd(a, b)\) ,欧几里得辗转相除法便是用来求 \(\gcd(a, b)\) 的,因而简称 \(\gcd\) 。
记 \(a, b\) 的公因数集合为 \(T\) ,\(b , a \bmod b\) 的公因数集合为 \(T'\) ,有 \(T = T'\) 。证明:
设 \(u \subseteq T\) ,\(a = xu, b = yu\) ,$$a \bmod b = a - b \left \lfloor a / b \right \rfloor = xu - yu(\left \lfloor a / b \right \rfloor) = u[x - y(\left \lfloor a / b \right \rfloor)]$$ ,所以 \(u \mid a \bmod b\) 。因而 \(T \subseteq T'\) 。
同样的,记 \(v \subseteq T'\) ,\(b = nv, a \bmod b = mv\) ,$$a = a \bmod b + b \left \lfloor a / b \right \rfloor = mv + nv(\left \lfloor a / b \right \rfloor) = v[m + n\left \lfloor a / b \right \rfloor]$$ ,所以 \(v \mid a\) 。因而 \(T' \subseteq T\)。

综上, \(\gcd(a, b) = \gcd(b, a \bmod b)\) ,因而可以直接递归求解。时间复杂度为 \(\log(n)\) 。

边界:当 \(b = 0\) 时,\(\gcd(a, b) = a\) 。

code:

int gcd(int a, int b){
    return b ? gcd(b, a % b) : a;
}

扩展欧几里得(exgcd)

由欧几里得辗转相除法,我们可以运用这个算法在求最大公因数的同时求出满足 $$ax + by = \gcd(a, b)$$ 的正整数解 \(x, y\) 。

对于边界条件 \(b = 0\) , \(x = 1, y = 0\) 就是一组合法解(当然,此处 \(y\) 可以取任意数)。那么,设 \(a' = b, b' = a \bmod b\) ,且我们已经求出 \(x_0, y_0\) 满足 \(a'x_0 + b'y_0 = \gcd(a', b')\) ,于是:

\[\begin{aligned} \gcd(a, b) &= \gcd(a', b') \\ &= a'x_0 + b'y_0 \\ &= bx_0 + (a\bmod b)y_0 \\ &= bx_0 + (a - b \left \lfloor a / b \right \rfloor)y_0 \\ &= ay_0 + b(x_0 - \left \lfloor a / b \right \rfloor y_0) \end{aligned} \]

因此,满足 \(ax + by = \gcd(a, b)\) 的 \(x = y_0, y = x_0 - \left \lfloor a / b \right \rfloor y_0\) 。

code:

int exgcd(int a, int b, int &x, int &y){
    if(!b){
        x = 1, y = 0;
        return a;
    }
    int a1 = exgcd(b, a % b, x, y);
    int x1 = y, y1 = x - a / b * y;
    x = x1, y = y1;
    return a1;
}

乘法逆元

对于一个数 \(a\) ,若 \(ab = 1\) ,那么我们称 \(a\) 的逆元为 \(b\) ,记作 \(a^{-1}\) 。在同余中,则是若 \(ab \equiv 1\) , 则 \(b\) 为 \(a\) 的逆元。通常,我们通过找到 \(a\) 的逆元来避免除法。给定 \(a\) 和 \(b\) ,我们需要求出 \(x\) 满足 \(ax \equiv 1 \pmod b\) 。

逆元唯一性定理:逆元若存在,则总是唯一的。
反证法。设有 \(x \not \equiv y\) 使得 \(ax \equiv ay \equiv 1\) ,则有 \(axy \equiv ax(y) \equiv y\) ,且 \(axy \equiv ay(x) \equiv x\) , 则 \(x \equiv y\) ,矛盾。
逆元存在性定理:在模 \(m\) 下,当且仅当 \(a \bot m\) 时,\(a\) 的逆元存在。后续补充证明。

事实上, \(ax \equiv 1 \pmod b\) 等价于 \(ax + by = \gcd(a, b)\) 。由逆元存在性定理,\(a \bot b\) 时, \(ax + by = 1\) 。所以 \(ax = 1 - by\) , \(ax \equiv 1\) 。而若 \(ax \equiv 1 \pmod b\) ,则 \(ax - 1 \equiv 0 \pmod b\) ,所以令 \(y = \frac{ax - 1}{b}\) , 就有 \(ax + by = 1\) 。因此这两者等价。我们就可以直接使用exgcd求出 \(a\) 在模 \(b\) 下的乘法逆元。不过有一个需要注意的是,使用exgcd求出来的逆元可能是负数,输出 (x % b + b) % b 就好啦!

裴蜀定理

不定方程 \(ax + by = c\) 有整数解 \(x, y\) 的充要条件是 \(\gcd(a, b) \mid c\) 。
证明:
当 \(\gcd(a, b) \mid c\) 时,我们可以先用exgcd求出\(ax +by = \gcd(a, b)\) 的解,然后同时乘以 \(\ c / gcd(a, b)\) 即可得出解。
当 \(\gcd(a, b) \not \mid c\) 时,在该方程两边同时除以 \(\gcd(a, b)\) ,发现方程左边为整数,右边为分数,则必定无解。

由此,我们就可以运用裴蜀定理直接证明逆元存在性定理了。

标签:gcd,数论,bmod,笔记,学习,int,逆元,ax,equiv
From: https://www.cnblogs.com/yduck/p/17799163.html

相关文章

  • 《代码大全2》阅读笔记
    错误处理程序1.处理预料中可能要发生的错误,在程序的正确性与健壮性间平衡;2.方法:返回中立值、换用下一个正确的数据、返回与前次相同的数据、换用最接近的合法值、把警告信息记录到日志文件中、返回一个错误码、调用错误处理子程序或对象、当错误发生时显示出错信息、用最妥当的......
  • 学习笔记432—VBM_DARTEL算法对灰质变化的计算
    VBM_DARTEL算法对灰质变化的计算根据一些文献得知,VBM目前比较新的算法是DARTEL算法,这一算法被集成在SPM里,这里记录一下做法。VBM是对T1像进行分割得到灰质等。所以要有结构T1加权像数据。整个流程应该是这样:1.手动调整前联合(AC)首先就是需要我们自己手动调整一下结构像,打开SPM,sp......
  • 论文阅读笔记——LAVA: Large-scale Automated Vulnerability Addition
    LAVA:Large-scaleAutomatedVulnerabilityAdditionBrendanDolan-Gavitt∗,PatrickHulin†,EnginKirda‡,TimLeek†,AndreaMambretti‡,WilRobertson‡,FrederickUlrich†,RyanWhelan†(Authorslistedalphabetically)∗[email protected]......
  • 基于Googlenet深度学习网络的矿物质种类识别matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述       VGG在2014年由牛津大学著名研究组vGG(VisualGeometryGroup)提出,斩获该年lmageNet竞赛中LocalizationTask(定位任务)第一名和ClassificationTask(分类任务)第二名。Clas......
  • 【Redis使用】一年多来redis使用markdow笔记总结,第(1)篇:Redis命令详解
    Redis是一个高性能的key-value数据库。本文会让你知道:什么是nosql、Redis的特点、如何修改常用Redis配置、写出Redis中string类型数据的增删改查操作命令、写出Redis中hash类型数据的增删改查相关命令、说出Redis中list保存的数据类型、使用StrictRedis对象对string类型数据......
  • Springmvc的学习
    1.SpringMVC1.1:基于MVC架构1.2:容易理解,上手快,使用简单1.3:方便与Spring整合1.4:SpringMVC强化注解的使用,控制层(Controller)@Controller2.第一个SpringMVC注解的程序的创建和使用注解式开发:在代码中通过类与方法的注解,完成处理2.1:创建项目,添加jar2.2:配置注册中央控制器(中央调度......
  • 阅读笔记:《软件需求分析》阅读笔记四
    软件需求分析是软件工程中至关重要的一部分,它涉及到确定和记录系统或应用程序的功能和性能需求,以便开发团队可以理解和满足用户的期望。在进行软件需求分析时,需要考虑各种因素,包括用户需求、系统约束、功能规范等等。本次笔记将继续探讨软件需求分析的重要性以及一些常用的技术和......
  • 快速排序学习
    //#include<bits/stdc++.h>#include<iostream>usingnamespacestd;voidquick_sort(intq[],intl,intr){if(l>=r)return;intx=q[(l+r)/2];inti=l-1,j=r+1;while(i<j){doi++;while(q[i]<x);doj--;while(q[j]>......
  • 《代码大全》阅读笔记04
    六、代码改善1.软件质量的普遍原理就是改善质量以降低开发成本。2.提高生产效率和改善质量的最佳途径就是减少花在代码返工上的时间,无论返工是由需求、设计改变还是调试引起的。3.结对编程,通过复查可以快速地将所有开发者的水平提高到最高优秀的开发者的高度。七.开发者测试1.......
  • 阅读笔记1
    《代码整洁之道》读书笔记第一章:整洁代码整洁的代码读起来令人愉悦;糟糕的代码引发混乱!别修改糟糕的代码时,往往会越改越烂;完善错误处理代码,在细节上话心思;整洁的代码只做好一件事,糟糕的代码想做太多事,它意图混乱,目的含混。GradyBooch观点:整洁代码简单直接,整洁的代码如同优美......