首页 > 其他分享 >【学习笔记】扩展欧几里得

【学习笔记】扩展欧几里得

时间:2024-09-17 14:02:07浏览次数:8  
标签:方程 frac gcd 欧几里得 扩展 笔记 ax cases 正整数

扩展欧几里得算法(exgcd)

简介

扩展欧几里得算法基于辗转相除法构建,主要用于求方程

\[ax+by=c \]

最小正整数解

步骤

1.求方程\(ax+by=gcd(a,b)\)的解


我们构造两个方程

\[\begin{cases} ax+by=gcd(a,b)\\ bx'+(a\%b)y'=gcd(b,a\%b) \end{cases}\]

因为由欧几里得算法易于得到

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

所以

\[ax+by=bx'+(a\%b)y' \]

由此递推易得方程

\[ax+0y=1 \]

此时方程解为

\[x=\frac{1}{a} \]

对于\(a\%b\)我们可以表示为

\[a\%b=a-b*\lfloor \frac{a}{b} \rfloor \]

将此式带入原方程即可得

\[ax+by=bx'+ay'-b*\lfloor \frac{a}{b} \rfloor y' \]

整理可得

\[ax+by=ay'+b(x'-\lfloor \frac{a}{b} \rfloor y') \]

因为\(a=a,b=b\)
所以

\[\begin{cases} x=y'\\ y=x'-\lfloor\frac{a}{b}\rfloor y' \end{cases}\]

在写代码时可以用递归实现,先往下递归直到\(a\%b=0\)得到方程的一个解,然后返回利用x,y和x',y'的关系得到原方程的解

2.求方程\(ax+by=gcd(a,b)\)的最小整数解


因为有方程\(ax+by=gcd(a,b)\),所以

\[a(x+b/a)+b(y-a/b)=gcd(a,b) \]

显然\(x+b/a,y-a/b\)也为方程的一组解
此时,我们把

\[b/a,a/b \]

分别称为x,y的一个周期,一般用字母\(T\)表示
在步骤1里我们已经得到了方程的一个解\(x,y\)
因为

\[\begin{cases} x'=x+k*T1\\ y'=y+k*T2 \end{cases}\]

也为方程的一组解,所以

\[\begin{cases} x'=x\%T1\\ y'=y\%T2 \end{cases}\]

因为无法保证\(x,y\)同时都为正整数
所以对于\(x\)的最小正整数解为

\[x'=(x\%T1+T1)\%T1 \]

3.求普遍方程\(ax+by=c\)的最小正整数解


我们已经得到了普遍方城\(ax+by=gcd(a,b)\)的最小正整数解
我们设

\[p=c/gcd(a,b) \]

那么有

\[a*px+b*py=p*gcd(a,b) \]

对比系数易于得到,\(ax+by=c\)的对于\(x\)的最小正整数解为

\[\begin{cases} x'=px\\ y'=py \end{cases}\]

显然如果\(c\%gcd(a,b)!=0\)那么方程无最小正整数解

求逆元

对于求有理数的模运算

\[(\frac{a}{b})\%p \]

我们可以将其转化为

\[a\%p*(\frac{1}{b}\%p) \]

而\(\frac{1}{b}\%p\)就可以转化为求方程

\[ax\equiv1(\%p) \]

的解
因为\(1\%p=1\),所以\(x\)就可以看做方程

\[ax+py=1 \]

最小正整数解,其中\(x\)被称为a的逆元
特别的如果\(p\)是一个质数,那么根据费马小定律

\[a^{p-1}\equiv1(\%p)\\ a*a^{p-2}\equiv1(\%p)\]

所以

\[x=a^{p-2} \]

标签:方程,frac,gcd,欧几里得,扩展,笔记,ax,cases,正整数
From: https://www.cnblogs.com/GSNforces/p/18417133

相关文章

  • CMake构建学习笔记17-uriparser库的构建和使用
    在连续论述了几篇关于CMake如何使用的文章之后,笔者也是感觉被掏空了。接下来几篇就还是回到构建依赖库的问题上,容笔者花时间找到更好的主题来介绍更多关于CMake使用干货。如何有的读者自信已经很熟悉这方面的知识,可以进行跳过,在需要的时候再进行查阅。uriparser是一个严格遵循RFC......
  • 2024/9/17 笔记
    多项式以后再写吧。首先庆祝一下把猪国杀A了[SDOI2010]猪国杀题目描述游戏背景《猪国杀》是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪。每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多只,每只猪扮演$1$种角色。游戏目的主猪/\(\texttt{MP}\):自己存活......
  • 初学Linux笔记
    对linux系统中目录的解释:/bin:bin是Binary的缩写,这个目录存放着最经常使用的命令。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。/e......
  • 【学习笔记】数位DP
    数位DP适用条件此类题目一般要求在\([l,r]\)区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关。题目中给出的数的范围一般较大,往往在\(10^9\)以上因此无法暴力枚举,只能使用动态规划代码实现使用记忆化搜索更简单易于理解。从数的高位向低位搜索,每一位可......
  • C/C++笔记
    C/CPP笔记杂记structmsg_train和typedefstructmsg_train大小不一样cstdio和stdio#include<stdio.h>intmain(){printf("Hello,World!\n");return0;}#include<cstdio>intmain(){std::printf("Hello,World!\n"......
  • 【自学笔记】支持向量机(2)——核函数
    引入  核函数的功能是将一组数据映射到更高维的特征空间,这样可以让在低维无法线性分类的数据能够在高维空间下被分类。  可以证明,如果原始数据是有限的维度,那么一定存在一个高维特征空间使得样本线性可分。  文章内容由《机器学习》相关内容,网络资源,GPT回答和个人......
  • [proteus仿真]基于51单片机,74hs373,8255A扩展 流水灯设计
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,74hs373,8255A扩展流水灯设计二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。三、程序编程#include<reg52.h>#include<intrins.h>#include......
  • Python Web开发中的扩展与插件开发:从自定义到打包与发布
    PythonWeb开发中的扩展与插件开发:从自定义到打包与发布目录⚙️Flask中的自定义扩展开发......
  • 深入Kubernetes的自动扩展与弹性伸缩实践
    在云原生架构学习的征途中,第33天我们踏入了Kubernetes(K8s)自动扩展与弹性伸缩的深邃领域。作为云原生技术的基石,Kubernetes不仅以其强大的容器编排能力著称,更在自动扩展和弹性伸缩方面展现出了无与伦比的灵活性与效率。今天,我们深入探讨了Kubernetes如何通过HorizontalPodAutoscal......
  • 读构建可扩展分布式系统:方法与实践06异步消息传递
    1. 异步消息传递1.1. 通信是分布式系统的基础,也是架构师需要纳入其系统设计的主要问题1.2. 客户端发送请求并等待服务器响应1.2.1. 这就是大多数分布式通信的设计方式,因为客户端需要得到即时响应后才能继续1.2.2. 并非所有系统都有这个要求1.3. 使用异步通信的......