博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扩展欧几里德算法——求最小整数解
阅读量:5829 次
发布时间:2019-06-18

本文共 965 字,大约阅读时间需要 3 分钟。

这是一个数学推导!!!

 

首先我们已经知道了,如何通过扩展欧几里德算法,求出方程的其中一组解了

那么就可以继续往下看

  

  给出两个方程

    ax1+by1=gcd(a,b)

    ax2+by2=gcd(a,b)

  所以可以推出

    ax1+by1=ax2+by2

    a(x1-x2)=b(y2-y1)

  然后我们知道gcd(a,b)为a,b的最大公因数,所以我们将 A=a/gcd(a,b),B=b/gcd(a,b),接着往下推出

    A(x1-x2)=B(y2-y1)

  现在A和B两个已经是互素了,所以又可以接着推出

    (这个地方要好好理解,重点!)

    A*(n*B)=B*(m*A)

    (x1-x2)=n*B

    (y2-y1)=m*A

  这里我们从x入手

    (x1-x2)=n*B

    x1=x2+n*B

  由此,我们推出了x解的通解公式    x=x0+n*B

  同理,我们推出了y解的通解公式 y=y0-m*A

 

  那么我们如果要求 x 的最小整数解,也就是 x0, 不就是这样 x0=x%B

  但是要记得现在的 x是  ax+by=gcd(a,b)的x

  我们要求的 X 是  aX+bY=c的X,所以还得先转化  X=x*c/gcd(a,b).

  然后套入我们的公式

  X0=X%B

  X0=X%(b/gcd(a,b))

  嗯,到此结束,下面给下实现代码

 

  

void solve() {    int gcd = gcd_pro(a, b, x, y);    if (c % gcd != 0)     {        cout << "无解" << endl;    }    else    {        x = x * c / gcd;        b = b / gcd;        x_min = x % b;        if (x_min <= 0)        {            if (b < 0)b = -b;            x_min += b;        }    }}

 

转载于:https://www.cnblogs.com/caibingxu/p/10850664.html

你可能感兴趣的文章
UIKit Particle Systems in iOS 5 Tutorial ( 附雨的粒子效果 )
查看>>
优先级反转 [转]
查看>>
hive Cli常用操作(翻译自Hive wiki)
查看>>
drawRect & layoutSubviews 调用时间
查看>>
Hadoop和Spark的异同
查看>>
对Spring 容器管理事务支持的总结
查看>>
jquery back to top 页面底部的返回顶部按钮
查看>>
搭建可调试的微信公众平台本地测试环境
查看>>
oracle中清空表数据的两种方法
查看>>
解决Process因缓冲区满而导至进程阻塞的办法
查看>>
ArcIMS和中国足球
查看>>
Oracle 数据类型及存储方式(三)
查看>>
2011年终述职报告
查看>>
[php] serialize, unserialize the session data in PHP
查看>>
Topcoder好题推荐
查看>>
HDOJ2568 ( 前进 ) 【切水题,很欢乐~】
查看>>
亲历PHP面试题——写一个验证IP地址的isValidIp函数
查看>>
处理控制台事件消息
查看>>
[ListControl]MFC中实现list控件的编辑操作
查看>>
代码的版权声明
查看>>