首页 > 编程语言 >欧几里得算法和扩展欧几里得算法

欧几里得算法和扩展欧几里得算法

时间:2022-08-19 23:34:00浏览次数:58  
标签:a% gcd 欧几里得 扩展 算法 y2

欧几里得算法和扩展欧几里得算法

概述

本篇简要介绍欧几里得算法和扩展欧几里得算法

欧几里得算法

欧几里得算法就是辗转相除法,用于求两个数的最大公约数

欧几里得算法:

public static int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

欧几里得算法的证明:

前提:设gcd(a,b) 是 自然数 a 和 b 的最大公约数,a 除以 b 得到的商和余数分别为 p 和 q

即: a = b * p + q (1)

若a能被b整除,b就叫做a的约数,即b可以整除a

由上式可以看出 gcd(b,q) 可以整除a,也可以整除b 【a,b 都可以被gcd(b,q) 整除】,也就是说

即:gcd(b,q) 可以整除gcd(a,b)

根据q = a - b*q 同理可证 gcd(a,b) 可以整除 gcd(b,q)

可以知道 gcd(a,b) == gcd(b,q) == gcd(b,a%b)

因为 a%b一直在减小,最后就会化为 gcd(c,0) 0和c的最大公约数是c 求得结果为c

扩展欧几里得算法

扩展欧几里得算法是对欧几里得算法的扩展,用于求解二元一次方程的整数解

扩展欧几里得算法的实现主要归咎于 裴蜀定理

前提:a,b为整数,且gcd(a,b) = d,那么对于任何整数 x,y

那么: ax+by 一定是d的倍数

个人理解:若两个整数有最大公约数d,那么ax+by = d一定有解

那么应该如何 根据裴蜀定理得到 二元一次方程的解?

​ 这里我们通过一组特解得到其他解

  1. 当 a%b == 0时

    因为gcd(a,b) == d,则 a == d

    这时令x1 = 1,y1 = 0,可以证明 ax1+by1 = d

  2. 当 a%b !=0时

    b * x2+(a%b) *y2=gcd(b,a%b)

    由 欧几里得定理 gcd(a,b) == gcd(b,a%b) 可得

    b * x2+(a%b) *y2 == a * x1+b * y1

    又带入 a % b = a - b(a/b) 可得

    a * x1 + b * y1 = a * y2 + b (x2 - (a/b) * y2)

    即:

    x1 = y2 y1 = x2-(a/b) * y2 (x2,y2是特解)

这里得到了解的关系,接下来通过 1 的特解,就可以求得其他解:

static long d,x,y
public static void exgcd(long a, long b, long x, long y)
{
    if(b == 0) {d = a, x = 1, y = 0;}
    else
    {
        exgcd(b, a%b, d, y, x);
        y -= x * (a / b);
    }
}

注:方程 ax + by = 1 有解 当且仅当 整数a和b互素(gcd(a,b)= 1)

无解情况:

对于ax+by = d,d不是gcd(a,b)的倍数

ax + by = d求得的解的大小

|x| <= b且 |y| <= a

扩展欧几里得算法应用

  • 求解不定方程 (ax+by=c 给出整数abc,求出xy整数解)
  • 求解模线性方程(线性同余方程)
  • 求解模的逆元

线性同余方程

给定整数a,b,m,求一个整数满足:a*x≡b(mod m)

a * x≡b(mod m)可以说明a*x-b始终是m的倍数,即a *x - b= -y *m => a * x + m * y = b

利用扩展欧几里得算法求得x和y使得 a * x + m * y = gcd(a,m)后,把x放大 b/gcd(a,m) 倍即可求出未知数x

int x1 = exgcd(a,m,d,x,y);
x = x*b/d;

模的逆元

b' b≡1(modn)

若 a 与 p 互素,则满足 ( a * x ) % p = 1的 x为 a的逆元。

构造得(k * p + 1)% p = 1(k为任意常数) ,联立 (a * x) % p = 1 可以求得a的逆元

可得扩展欧几里得形式:a * x + k * p = 1

exgcd(a, b,x, y);
x = (x % b + b) % b; //防止x%b出现负数

标签:a%,gcd,欧几里得,扩展,算法,y2
From: https://www.cnblogs.com/ioname/p/16606899.html

相关文章

  • 算法总结
    1.每日温度题(一道关于栈的问题)请根据每日气温列表temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后......
  • Vue面试题05:Vue中如何扩展一个组件(应用题)
    Vue中如何扩展一个组件按照逻辑扩展和内容扩展来列举逻辑扩展的方法:mixins、extends、compositionapi内容扩展的方法:slots使用方法、使用场景和问题混入:mixi......
  • 【排序】各类排序算法的时间性能比较
    用https://www.luogu.com.cn/paste/nzx555us中代码在此题运行时限\(\tt1s\),空间限制\(\tt256MB\)。插入排序冒泡排序选择排序希尔排序快速排序归并排......
  • 延时任务-基于netty时间轮算法实现
    一、时间轮算法简介为了大家能够理解下文中的代码,我们先来简单了解一下netty时间轮算法的核心原理时间轮算法名副其实,时间轮就是一个环形的数据结构,类似于表盘,将时间轮......
  • 链表反转类算法题
    反转链表类NO1.反转链表给定一个长度为n的链表,反转该链表,输出表头。方法一:迭代法(推荐使用)算法流程:step1:特殊情况判断,空链表或只有一个结点的链表,直接返回头......
  • 算法工程师需要掌握哪些核心技能点?
    一、算法工程师和其他IT从业人员的区别我想大概从事IT行业的开发人员多少对算法岗位都有所了解,但是其实很多人对这个岗位的认知存在一定的误区,或者说是被一些书籍所误导。......
  • 算法--模拟法
      方法:三次翻转(推荐使用)思路:循环右移相当于从第mmm个位置开始,左右两部分视作整体翻转。即abcdefg右移3位efgabcd可以看成AB翻转成BA(这里小写字母看成数组元素,大写......
  • 算法---二分
      classSolution{public:intfindPeakElement(vector<int>&nums){//writecodehere//题目只需要求一个峰值即可,我门可以利用二......
  • 算法联系---二分查找
       classSolution{public:boolFind(inttarget,vector<vector<int>>array){//因为题目的属性可以知道用右上角的元素判断,如果右上角......
  • python | 算法大神左神(左程云)算法课程 第五节
    TodayNew->python|算法大神左神(左程云)算法课程第五节(第几节我已经搞不清了,随便吧。。)针对b站视频左神算法与数据结构,自己练习对应的python代码相关链接:1️⃣b站视......