欧几里得定理及扩展

article/2025/9/18 11:09:20

 

  我们都知道欧几里得算法是用来快速求两个数的最大公约数的算法,效率较高:2O(logn)。

   我们先给出算法的实现:

 1 int gcd_1(int a, int b)
 2 {
 3     if(b==0) return a;
 4     return gcd_1(b, a%b);
 5 }
 6 
 7 int gcd_2(int a, int b)
 8 {
 9     while(b)
10     {
11         int r = a%b;
12         a = b;
13         b = r;
14     }
15     return a;
16 }
View Code

  要证明上述算法的正确性,我们就是证明如下定理的正确性:

  定理:设a,b,c,q,都是整数,且b>0。如果有a=b*q+c,那么gcd(a,b)==gcd(b,c)。

  证明:

  设 d=gcd(a, b), e=gcd(b, c). 于是存在整数k1, k2, k3, k4,使得a=d*k1, b=d*k2, b=e*k3, c=e*k4.

  那么 a = b*q+c = e*k3*q+e*k4=e*(q*k3+k4).所以e能整除a,从而e<=d;

  同理:c=a-b*q=d*k1-d*k2*q=d*(k1-k2*q),所以d能整除c,从而d<=e;综上,推出e==d---->gcd(a,b)==gcd(b,c)。

 

--------------------------- 分 割 线 -----------------------------------

 

  重点是扩展欧几里德定理,它在解线性同余式和中国剩余定理等很多方面都很有用。

  给你两个整数A,B让求一组整数解(X,Y)使得 Gcd(A,B)==A*X+B*Y。数论已经证明这组解一定存在。并且我们可以用扩展欧几里得算法求出解。

  首先给出欧几里得算法的证明过程:

  我们要求的是使 A*X+B*Y == Gcd(A, B)成立的X,Y值.

  根据欧几里得算法有:Gcd(A, B)==Gcd(B, A%B),那么我们可以递归求出X1 , Y1 满足:

  B*X1 + (A%B)Y1  == Gcd(B, A%B) == Gcd(A, B)。

  把A%B化简可得:

  B*X1 + (A-A/B*B)*Y1  == Gcd(A, B)----->

  B*X1 + A*Y1 - A/B*B*Y1  == Gcd(A, B) ------>

  A*Y1 + B*(X1 - A/B*Y1 )  == Gcd(A, B)

  所以推出:X = Y1

         Y = X1 - A/B * Y1

  代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;__int64 Exgcd(__int64 a, __int64 b, __int64 &x, __int64 &y)
{if(b==0){x=1, y=0;return a;}__int64 ans = Exgcd(b, a%b, x, y);__int64 tp=x;x = y;y = tp - a/b*y;return ans;
}int main()
{__int64 a, b, x,y;while(~scanf("%I64d%I64d", &a, &b)){__int64 ss = Exgcd(a, b, x, y);printf("%I64d, %I64d, %I64d\n", x,y,ss);}return 0;
}

 

扩展欧几里德算法的应用主要有以下三方面:

(1)求解不定方程;

(2)求解模线性方程(线性同余方程);

(3)求解模的逆元;

 

 

参考资料:《ACM国际大学生程序设计竞赛算法与实现》俞勇 主编

     《离散数学》John.Dossy Ablert.D.Otto著,原书第5版。

转载于:https://www.cnblogs.com/khan724/p/4148209.html


http://chatgpt.dhexx.cn/article/I87TJD8o.shtml

相关文章

欧几里得算法和唯一分解定理

gcd算法 我们通常利用gcd算法来计算两个数的最大公约数。 gcd求法有很多种&#xff0c;通常我们利用辗转相除法&#xff0c;辗转相除法又称欧几里得算法。其计算原理依赖于下面的定理&#xff1a; 定理&#xff1a;两个整数的最大公约数等于其中较小的那个数和两数相除余数的…

欧几里得定理、扩展欧几里德定义及中国剩余定理(数列和一些数学方面的概念)

一、 欧几里得扩展&#xff1a;是欧几里得算法的扩展&#xff0c;已知整数a&#xff0c;b&#xff0c;扩展欧几里得算法可以 在求得a&#xff0c;b的最大公约数的同时&#xff0c;能找到整数x、y&#xff08;其中一个可能为负数&#xff09;&#xff0c;使得他们满足贝祖等式 …

《欧几里德算法》原理及应用

欧几里德算法又称辗转相除法&#xff0c;用于计算两个整数a&#xff0c;b的最大公约数。其计算原理依赖于下面的定理&#xff1a; 定理&#xff1a;gcd(a,b) gcd(b,a mod b) 解释&#xff1a;a和b的最大公约数&#xff0c;等于b和a除以b余数的最大公约数 证明&#xff1a;a…

数学--数论--欧几里得定理和拓展欧几里得定理

欧几里得定理: gcd(a, b) gcd(b, a%b) 证明&#xff1a; 我们首先约定&#xff1a;m gcd(a,b) , n gcd(b, q) , a b*p q。&#xff08;这里的gcd含义跟上面一样&#xff0c;q的含义跟后面式子同&#xff09; 1. m 是a,b的最大公约数&#xff0c;那么m整除a,b q a…

欧几里得定理与扩展欧几里得

3,欧几里德定理:&#xff08;射影定理&#xff09; 定理指出素数是无限的。 a*b*c1要么是素数要么其质因子就是素数。 扩展欧几里得&#xff1a; 扩展欧几里得算法是欧几里得&#xff08;又叫辗转相除法&#xff09;的扩展。已知整数a、b&#xff0c;扩展欧几里得算法可以在…

SpringData Jpa、Hibernate、Jpa 三者之间的关系

JPA规范与ORM框架之间的关系是怎样的呢&#xff1f; JPA规范本质上就是一种ORM规范&#xff0c;注意不是ORM框架——因为JPA并未提供ORM实现&#xff0c;它只是制订了一些规范&#xff0c;提供了一些编程的API接口&#xff0c;但具体实现则由服务厂商来提供实现&#xff0c;JBo…

JPA(一):十分钟入门 JPA

一.JPA的概念 为了节省时间&#xff0c;更加具体的解释我们就略过吧。 二.在IDEA中使用JPA 2.1.添加JAP依赖 添加相关的maven依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7<…

【Tools】管理JPA数据模型的最先进的IntelliJ插件:JPA Buddy

目录 说明基础操作JPA BuddyEasyCode 说明 使用IDEA版本为 2022.2.1。由于IDEA版本或插件版本的不同&#xff0c;操作界面可能略有不同。了解了JPA Buddy和EasyCode&#xff0c;个人更倾向于JPA Buddy&#xff0c;功能更强大&#xff0c;操作简单。 JPA Buddy通过以下方式简化了…

JPA和Spring-Data-JPA简介

什么是JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术 ORM&#xff1a;通过使用描述对象和数据库之间映射的元数据&#x…

SpringBoot 一文搞懂Spring JPA

一文搞懂Spring JPA 什么是 JPA spirng data jpa是spring提供的一套简化JPA开发的框架&#xff0c;按照约定好的【方法命名规则】写dao层接口&#xff0c;就可以在不写接口实现的情况下&#xff0c;实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能&#xff0c;如…

JPA基础知识----JPA 基本注解,JPA API

JPA 是什么 Java Persistence API&#xff1a;用于对象持久化的 API Java EE 5.0 平台标准的 ORM 规范&#xff0c;使得应用程序以统一的方式访问持久层 JPA和Hibernate的关系 JPA 是 hibernate 的一个抽象&#xff08;就像JDBC和JDBC驱动的关系&#xff09;&…

java jpa是什么_什么是JPA?

JDBC jdbc是一组规范&#xff0c;是接口&#xff0c;由不同的数据库厂商各自提供相应的实现类&#xff0c;打包成jar包&#xff0c;也就是所谓的数据库驱动。而我们的java应用程序&#xff0c;只需要调用jdbc的接口就可以了。 而JPA是和jdbc类似的东西 什么是JPA Java Persiste…

JPA与Mybatis的区别

其实JPA和mybatis大体上没什么区别&#xff0c;架构上很相似&#xff0c;mybatis就是mapper层&#xff0c;JPA就是repository层&#xff0c;其他都一样的 JPA就是把mapper层的接口换成repository的接口: 那么接口具体长什么样呢&#xff1f; mapper层 自己写sql语句 JPA的re…

什么是JPA?Java持续性介绍

新钛云服已累计为您分享723篇技术干货 本文将了解基于 Hibernate 的 Java 持久化标准&#xff0c;学习如何使用 JPA 在关系数据库或 NoSQL 数据库中存储和管理 Java 对象。 作为一种规范&#xff0c;Jakarta Persistence API&#xff08;以前称为 Java Persistence API&#xf…

spring boot 中使用 jpa以及jpa介绍

最近在项目中使用了一下jpa&#xff0c;发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。 在这里我们先来了解一下jpa。 1.什么是jpa呢&#xff1f; JPA顾名思义就是Java Persistence API的意思&#xff0c;是JDK 5.0注解或XML描述对象&#xff0d;关系表的…

JPA是什么

JPA仅仅是一种规范&#xff0c;也就是说JPA仅仅定义了一些接口&#xff0c;而接口是需要实现才能工作的。所以底层需要某种实现&#xff0c;而Hibernate就是实现了JPA接口的ORM框架。 也就是说&#xff1a; JPA是一套ORM规范&#xff0c;Hibernate实现了JPA规范&#xff01;如…

数据中台(一)数据中台详解

1.数据中台的由来 数据库阶段 ---> 传统数仓 ---> 大数据平台 ----> 大数据中台 1.1.数据存储起源&#xff1a;数据库 1979年&#xff1a;Oracle1.0商用数据库发布 1996年&#xff1a;MySQL1.0发布&#xff0c;到2000年以后开始火起来。 特点&#xff1a;数据库主要面…

通俗易懂解释什么是“中台”

通俗易懂解释什么是“中台” 随着互联网公司崛起&#xff0c;“中台”这个词也进入了人们的视线。BAT 等公司纷纷推出了自己的中台系统。那么&#xff0c;什么是中台系统&#xff1f;它是如何诞生的&#xff1f;它长什么模样&#xff1f;我们为什么需要它&#xff1f;一串串的问…

什么是中台

什么是中台&#xff1f; 前台 由各类前台系统组成的前端平台。每个前台系统就是一个用户触点&#xff0c;即企业的最终用户直接使用或交互的系统&#xff0c;是企业与最终用户的交点。列如用户直接使用的网站&#xff0c;手机APP&#xff0c;微信公众号都属于前台范畴。 中台&…

什么是“中台”?

“中台”这个概念&#xff0c;越来越多的在各种技术大会上提及&#xff0c;各大技术公司&#xff0c;纷纷推出自己的“中台”方案&#xff0c;究竟什么是“中台”&#xff1f;他和“前台”、“后台”有何区别&#xff1f; 《》&#xff0c;这是我的朋友、前同事小灰写的一篇漫画…