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

news/2024/9/19 11:38:54/文章来源:https://www.cnblogs.com/GSNforces/p/18417133

扩展欧几里得算法(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} \]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11 线程同步接口std::condition_variable和std::future的简单使用sk

合集 - C++(1)1.C++11 线程同步接口std::condition_variable和std::future的简单使用09-17收起 std::condition_variable 条件变量std::condition_variable有wait和notify接口用于线程间的同步。如下图所示,Thread 2阻塞在wait接口,Thread 1通过notify接口通知Thread 2继续执…

安全:nftables:基础知识

一,policy: 1,原文档链接: https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/9/html/configuring_firewalls_and_packet_filters/assembly_creating-and-managing-nftables-tables-chains-and-rules_getting-started-with-nftables#con_basics-of-nft…

Leetcode 952. 按公因数计算最大组件大小

1.题目基本信息 1.1.题目描述 给定一个由不同正整数的组成的非空数组 nums ,考虑下面的图: 有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之间才有一条边。 返回 图中最大连…

Leetcode 19.删除链表的倒数第第N个结点

1.题目基本信息 题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/ 2.解题方法 2.1.解题思路 使用快慢指针 2.2.解题步骤 第一步,初始化快指针为head,慢指针指向一…

Leetcode 297. 二叉树的序列化与反序列化

1.题目基本信息 1.1.题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限…

曾亨瑾第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/这个作业的目标 发布一篇随便简单介绍自己姓名 曾亨瑾学号 2022329301104一、自我介绍 1.基本信息 大家好,我是电气工程及其自动化(2)班的曾亨瑾,来自广东东莞。 2.兴趣爱好 我喜欢打羽毛球和慢跑(虽然都是…

2024软件工程第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 开发类“羊了个羊”消除类小游戏,并借助AIGC技术提高效率学号 052203132项目展示Github地址:https://github.c…

宏定义与特别运用

目录宏定义数值宏常量字符串宏常量用define宏定义注释符号?程序的编译过程预处理中宏替换和去注释谁先谁后?如何写一个可靠的宏函数do-while-zero结构do-while-zero的评价宏定义中的空格宏只能在main函数上面定义吗?宏的作用范围#undef宏替换是在函数调用之前进行.块中进行#…

白云龙期货投资-第六讲

## 价量行情中的配合 1,价涨量增,顺势推动。 2,价量背离,趋势转变 (价与量在相对高位称为顶背离,在下跌末期为底背离。背离后如果想再次上涨或者下跌,一般价格都会出现一个盘整期,而成交量则出现缩量地量期)价量行情中的配合 1,价涨量增,顺势推动。 2,价量背离,趋势…

软件工程结对项目 3:python实现自动生成小学四则运算题目的程序

这个作业属于哪个课程 广工计院计科34班软工这个作业要求在哪里 作业要求团队成员1 庄崇立3122004633团队成员2 罗振烘3122004748这个作业的目标 结对合作完成小学四则运算题目的程序,熟悉项目开发流程,提高团队合作能力一、GitHub地址 二、需求 1.题目:实现一个自动生成小学…

结构、权限修饰符、类

结构、权限修饰符、类 结构(struct:自定义的数据结构) struct student {// 成员变量int number;char name[100];void func(){ // 成员函数(方法)number++;} };// 1. 形参为引用 void func1(student &stu){stu.number = 2000;strcpy_s(stu.name, sizeof(stu.name…

Leetcode 2183. 统计可以被 K 整除的下标对数目

1.题目基本信息 1.1.题目描述 给你一个下标从 0 开始、长度为 n 的整数数组 nums 和一个整数 k ,返回满足下述条件的下标对 (i, j) 的数目:0 <= i < j <= n - 1 且 nums[i] * nums[j] 能被 k 整除。1.2.题目地址 https://leetcode.cn/problems/count-array-pairs-di…