第六章 数学问题 -------- 6.5 欧几里得算法及其扩展

第六章 数学(三) ACwing 885排列组合公式Cab=a!b!(a−b)!\mathrm{C}_a^b = \frac{a!}{b!(a-b)!} Cab​=b!(a−b)!a!​因为a, b∈[1,2000]a,\space b \in[1, 2000]a, b∈[1,2000],所以不同的方案数为max(a×b)=4×106max(a \times b) = 4 \times 10^6max(a×b)=4×106种,因此可以直接递推处理Cab\mathrm{C}_a^bCab​的值。递推式为Cab=Ca−1b+Ca− 阅读详情

先来看看欧几里得算法:

public class Gcd {
    /**
     * 欧几里德算法,即辗转相除法 最大公约数
     */
    public static long gcd(long m, long n) {
        return n == 0 ? m : gcd(n, m % n);
    }

    /**
     * 最小公倍数lowest common multiple (LCM)
     * 最小公倍数 = a * b / a和b的最大公约数
     */
    private static long lcm(long a, long b) {
        return a * b / gcd(a, b);
    }
}

  接着再来看裴蜀(贝祖)等式:对于任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):ax+by = m 有整数解时当且仅当m是d的倍数。x、y可用扩展欧几里得算法求得。特别地,方程ax+by=1 有整数解当且仅当整数a和b互质。

  那什么是扩展欧几里得算法呢?

  现在我们知道了 a 和 b 的最大公约数是 gcd(a,b) 后面用gcd表示 ,那么,我们一定能够找到这样的 x 和 y ,使得: a*x + b*y = gcd 。这是一个不定方程。那么,怎么求出这个特解 x 和 y 呢?只需要在欧几里德算法的基础上加点改动就行了。我们观察到:欧几里德算法停止的状态是: a= gcd , b = 0 ,那么,这是否能给我们求解 x y 提供一种思路呢?

  首先,将a=gcd,b=0代入原方程,得到gcd*x+0*y=gcd。那么,这时候,只要x = 1 ,y 是 0 或者其他值(无所谓是多少,反正任何数乘以 0 都等于 0, 但是 x 一定要是 1),这时,我们就会有: a*1 + b*0 = gcd。 当然这是最终状态,但是我们是否可以从最终状态反推到最初的状态呢?

  假设当前我们要处理的是求出 a 和 b的最大公约数,并求出 x 和 y 使得 a*x + b*y= gcd ,而我们已经求出了下一个状态:b 和 a%b 的最大公约数,并且求出了一组x1 和y1 使得: b*x1 + (a%b)*y1 = gcd , 那么这两个相邻的状态之间是否存在一种关系呢?

  首先a可以表示成 a = b*t + k,而 t = a/b(这里的 “/” 指的是整除),k = a%b ,所以 可以得到a = b*(a/b) +k  -->  k=a-(a/b)*b  -->  a%b = a - (a/b)*b,代入 b*x1 + (a%b)*y1 = gcd。

  那么,我们可以进一步得到:gcd = b*x1 + (a-(a/b)*b)*y1
                   = b*x1 + a*y1 – (a/b)*b*y1
                   = a*y1 + b*(x1 – a/b*y1)

     对比之前我们的状态:求一组 x 和 y 使得:a*x + b*y = gcd ,是否发现了什么?

     这里: x = y1

           y = x1 – a/b*y1

  现在我们找到一组特殊的解  x0 和 y0,那么,我们就可以用 x0 和 y0 表示出整个不定方程的通解:

     x = x0 + (b/gcd)*t  ( t 取任意整数)

          y = y0 – (a/gcd)*t

  如果我们想要得到 x 大于 0 的第一个解的话,那么表达式就是:

    b /= d

    x = ( x0%b + b) % b

     以上就是扩展欧几里德算法的全部过程,依然用递归写:

public class ExtGcd {
    static long x;
    static long y;

    public static long gcd(long m, long n) {
        return n == 0 ? m : gcd(n, m % n);
    }
    /**
     * 扩展欧几里得
     * 调用完成后 静态变量xy是ax+by=m的解
     * 返回的还是最大公约数
     */
    public static long ext_gcd(long a,long b){
        if (b==0) { // 求出了最大公约数 为a
            x = 1;
            y = 0;
            return a;
        }
        long res = ext_gcd(b, a % b);
        //x,y已经被下一层递归更新了
        long x1 = x;//备份x
        x = y;//更新x
        y = x1 - a / b * y;//更新y
        return res;
    }
    public static void main(String[] args) {
        System.out.println(ext_gcd(2, 7));  // 1
        System.out.println(x+" "+y);        // -3 1
    }
}

  最后再来看一下这个线性方程(或者叫二元一次不定方程):ax+by = m 。有整数解时当且仅当m是gcd的倍数。

public static long linearEquation(long a, long b, long m) throws Exception {
    long d = ext_gcd(a, b);
    //m不是gcd(a,b)的倍数,这个方程无解
    if (m % d != 0) {
      throw new Exception("无解");
    }
    long n = m / d;//约一下,考虑m是d的倍数
    x *= n;
    y *= n;
    return d;
  }

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

   (1)求解不定方程;

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

 

 

算法基础课第六章。解决一些问题。 算法在于自己的实践,在于时间的积累。是一个漫长的过程。我们备战蓝桥杯一个多月的时间,我了解到了只是基础真正的算法高手都在练习算法,因为算法真的能让你的大脑思维提升。这只是我训练的八章成果。算法的在于你要有计算机语言去执行你要实现的功能。面向对象的思维思考问题。... 阅读详情

相关推荐

【滚雪球学数学建模】第5.1节·优化与规划:线性规划与整数规划的理论、方法与应用!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1760

扩展欧几里得算法(简单易懂,详细分析)

扩展欧几里得算法证明+应用 扩展欧几里得算法顾名思义是由欧几里得算法延伸出来的一个知识点,在搞懂扩展欧几里得算法之前不妨先来熟悉一下什么是欧几里得算法(又名辗转相除法) 欧几里得算法 1.应用:主要用于求解两个数a和b的最大公约数,我们不妨设(a>b),其公式为gcd(a,b)=gcd(b,a%b)=gcd(a%b,b%(a%b))=…=gcd(x,0),这里的x即为最大公约数. 2.下面展示代码: /*注意a>b,如果a<b交换一下位置即可*/ int gcd(int a,int b)

TheWayForDream 1万+

【滚雪球学数学建模】第11节·优化进阶

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1244

【数论系列】 欧几里得算法与拓展欧几里得

扩展欧几里得算法是欧几里得算法(辗转相除法)的扩展版本,该算法除了能够求出a、b的最大公约数,还能够同时求出 ax + by = gcd(a,b) 的一组正整数特解x、y(根据裴蜀定理可知此解必定存在)。扩展欧几里得常用来求形如方程:ax + by = c 的整数通解或者特解。等式方程 ax+by = c 是不一定有整数解x、y的,但是已知:若 c%gcd(a,b)==0,则方程ax + by = c 必定存在整数解,否则必定无解。

这里是阿安的博客 8494

AI人工智能核心算法原理与代码实例讲解:通用问题求解

AI人工智能核心算法原理与代码实例讲解:通用问题求解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 人工智

AI天才研究院 1153

PyTorch实战:手把手教你用QAT量化感知训练拯救模型精度(附避坑指南)

本文详细介绍了如何使用PyTorch进行QAT量化感知训练,以提升模型在边缘设备上的推理精度。通过核心原理讲解、实战代码示例和避坑指南,帮助开发者掌握从环境配置、模型训练到边缘部署的全流程,有效解决传统量化方法导致的精度损失问题。

c7d8e的博客 329

扩展欧几里得算法(详细推导+代码实现+应用)

1.扩展欧几里得算法 贝祖定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by=m中的m一定是d的倍数。(特别地,如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。) 那么贝祖定理的一个直接应用就是:如果ax+by=1有解,那么gcd(a,b)=1(将原公式两边同时除以gcd(a,b))。 扩展欧几里得算法用来解决这样一个问题:给定两个非零的整...

胡小涛的博客 1万+

算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)

量化策略开发,高质量社群,交易思路分享等相关内容

松鼠宽客的博客 2539

扩展欧几里得算法及其应用

本文主要介绍扩展欧几里得算法及其相关应用。

张小艾博客 2636

告别手动复制粘贴!用R语言脚本批量抓取TCMSP中药靶点基因(附完整代码)

本文介绍如何使用R语言脚本自动化抓取TCMSP数据库中的中药靶点基因数据,告别手动复制粘贴的低效操作。通过详细的代码示例和参数设置,帮助研究人员快速获取并过滤符合药代动力学标准的中药成分及其靶点基因,大幅提升研究效率。特别适合生物信息学和中药现代化研究领域的从业者。

weixin_26950847的博客 266

3步!Spring Boot+OCR引擎秒提身份证/营业执照?手把手教你从零实现!

OCR技术革新文档识别效率 本文演示了如何利用Spring Boot+Tesseract OCR+OpenCV构建自动化文档识别系统。相比传统人工录入,OCR技术可实现: 5秒极速提取身份证/营业执照关键信息 精准识别中文文本(准确率90%+) 正则过滤自动匹配结构化数据 技术要点: OpenCV图像预处理(灰度化+二值化) Tesseract多语言OCR识别 正则表达式精准提取证件号码 效率提升达100倍,错误率降低90%,适用于金融、政务等需要批量处理证件的场景。

java专栏 905

扩展欧几里得算法详解

为了介绍扩展欧几里得,我们先介绍一下贝祖定理: 即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。 换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。(可以来判断一个这样的式子有没有解) 有一个直接的应用就是 如果ax+by=1有解,那么gcd(a,b)=1; 要求出这个最大公因数gcd(a,b),我们最容易想到的就是古...

hhh 7万+

华为OD统一考试 - 模拟消息队列(Java & Python& JS & C++ & C )

让我们来模拟一个消息队列的运作,有一个发布者和若干消费者,发布者会在给定的时刻向消息队列发送消息,

算法大师! 3519

第六章 数学(二)

互质:公因数只有111的两个非零自然数,叫做互质数。欧拉函数的定义:1∼N1∼N1∼N中与NNN互质的数的个数被称为欧拉函数,记为ϕ(N)\phi(N)ϕ(N)。由算数基本定理中,N=P1α1⋅P2α2⋅⋅⋅PkαkN = P_1^{\alpha_1}·P_2^{\alpha_2}···P_k^{\alpha_k}N=P1α1​​⋅P2α2​​⋅⋅⋅Pkαk​​,则ϕ(N)=N×P1−1P1×P2−1P2×...×Pk−1Pk\phi(N) = N \times \frac{P_1 - 1}{P_1} \t

lumoumou`s blogs 549

杰理SDK UART 使用教程

本文介绍了JL701n芯片的UART串口通信使用教程,重点讲解了UART2的初始化配置、数据收发和中断处理功能。教程详细说明了代码结构、核心功能函数、配置参数和使用步骤,包括UART初始化、数据发送和接收中断处理等关键操作。同时提供了完整的API接口说明和注意事项,强调了中断处理限制、缓冲区管理、引脚配置等重要细节。最后给出了基本使用流程和高级任务处理示例,并针对常见问题提供了故障排除建议。本教程适用于需要在JL701n芯片上实现可靠串口通信的开发者。

qq_42014563的博客 1818

AI Agent在智能广告投放中的应用

随着互联网的快速发展,广告投放市场变得越来越复杂和竞争激烈。传统的广告投放方式往往难以精准地触达目标受众,导致广告资源的浪费。AI Agent作为一种智能的自动化程序,能够在复杂的环境中自主学习、决策和执行任务。本文章的目的在于深入探讨AI Agent在智能广告投放中的应用,研究如何利用AI Agent提高广告投放的精准度、效率和效果,降低成本。范围涵盖了AI Agent的基本原理、相关算法、在广告投放中的具体应用场景以及实际案例分析等方面。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 619

第六章 数学问题(上)

1、巧用进制 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。 如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。 本题目要求编程实现:对用户给定的重量,给出砝码组合方案。 例如: 用户输入: 5 程序输出: 9-3-1 用户输入: 19 程序输出: 27-9+1 要求程序输出的组合总是大数在前小数...

h_666666的博客 377

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

迷宫逃脱:A*寻路算法的数学艺术与工程实践

A*算法在迷宫游戏中的实现展现了离散优化问题的美学价值。从二维网格的启发式设计到动态环境的实时响应,每个技术细节都体现着算法工程化的智慧。这种范式可延伸至自动驾驶、机器人导航等前沿领域。进阶研究方向多智能体路径规划冲突消解机器学习启发式函数优化量子计算加速路径搜索。

闲人编程的博客 805

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《数论概论》读书笔记 第6章 线性方程与最大公约数

这章讲的就是欧几里得算法和exgcdexgcd。 原式: ax+by=gcd(a,b)ax+by=gcd(a,b)(假设a≥ba≥b) 当 b=0b=0 时有 gcd(a,b)=agcd(a,b)=a,此时 x=1,y=0x=1,y=0 当 bb 不为 00 时,根据欧几里得定理 gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b) 可得ax+by=gcd(a,b)=

LzyRapX 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一本非常好的书《具体数学》

而是指正文部分并没有什么让人难理解的东西,作者写的非常详细,只要跟着逻辑走就行了,其实都是扎扎实实的基础知识,基本上一般工科大一的水平,接触过无穷级数,泰勒公式就完全没问题,如果卷一点的高中生应该都可以,学起来会非常顺畅,只是连接可能需要点时间,不过后面习题尤其是附加题和研究题都是一些很难很难的问题。这本书里面精彩的部分很多,是艺术一样的思维。,前半部分章节都是一些非常基础的东西,但是很有趣,有河内塔,切蛋糕,约瑟夫环,轮盘赌,足球胜利等等趣味问题,而且有些问题是随着进度会重复出现,用不同的视角去解决它!

weixin_41310374的博客 2314

算法笔记(胡凡)刷题笔记目录

文章目录胡凡算法笔记刷题笔记目录,待更新...《算法笔记》第三章、入门模拟《算法笔记》第四章、算法初步《算法笔记》第五章、数学问题《算法笔记》第六章、C++标准模板库(STL)介绍《算法笔记》第七章、数据结构专题(1)《算法笔记》第八章、搜索专题《算法笔记》第九章、数据结构专题(2) 胡凡算法笔记刷题笔记目录,待更新… 《算法笔记》第三章、入门模拟 《算法笔记》3.1小节——入门模拟->简单模拟 《算法笔记》3.2小节——入门模拟->查找元素 《算法笔记》3.3小节——入门模拟->图形输出

李霁明的博客 6687

Python 数学建模手册(一)

数学建模是将商业问题转化为清晰数学公式的艺术。对于给定问题或使用场景,模型的算法实现有助于优化参数,并生成更好的洞见与理解,从而支持决策过程。数学模型可以补充机器学习模型,并在如医学等敏感领域做出重大决策时发挥作用。有三个核心主题帮助你理解数学建模:数学模型有用的领域——例如,控制工程和信号处理已验证的基于 Python 的数学工具——例如,图论和 MCMC数学优化的基础算法本书将通过数学建模的概念和各种建模方法向你介绍。根据两大信息来源,我将指导你选择最优技术和最适合的算法,使用 Python 来解决商业

龙哥盟 1352

最短路径算法大冒险:从迷宫小白到图论忍者(超豪华扩展版)China and English

图 是顶点的集合 V 和边的集合 E 组成的数学结构,其中:爬行 10min冲刺 2min灵魂出窍 8hr蠕动 1hr你的床厕所公司打卡机下班 1.2 权值:世界的"代价度量" 每条边可携带权值 ,代表:权值可以是负数! 比如:(因为钱从老板口袋流到你口袋)[床厕所公司下班床010∞∞厕所∞02∞公司∞∞0480下班60∞∞0] \begin{bmatrix} & \text{床} & \text{厕所} & \text{公司} & \text{下班} \\ \text{床} & 0 & 10 & \i

𝓓𝓸𝓶𝓲𝓷𝓪𝓽𝓲𝓷𝓰 𝓐𝓵𝓵 𝓣𝓱𝓲𝓷𝓰𝓼 1043

2048数字游戏:网格变换的数学之舞

2048游戏的精妙设计展现了离散数学在交互系统中的完美应用。从网格变换的矩阵运算到得分计算的信息熵原理,每个细节都体现着数学规律与游戏性的高度统一。这种设计范式为益智类游戏设立了黄金标准。扩展思考三维空间中的2048扩展多人协作合并模式基于区块链的分数存证系统。

闲人编程的博客 998
上一篇: 第六章 数学问题 -------- 6.4 算法必备求和公式
下一篇: 第六章 数学问题 -------- 6.7【扩展欧几里得】一步之遥
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值