扩展欧几里得算法——java
扩展欧几里得算法是欧几里得算法的扩展。已知整数a,b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个可能是负数),是他们满足贝祖等式ax+by=gcd(a,b),如果a是负数,可以把问题转换成|a|(-x)+by=gcd(a,b),然后令x’=(-x).
通常谈到最大公约数时,我们都会提到非常基本的事实:给予两个整数a,b,必存在整数x,y使得ax+by=gcd(a,b).
有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去,可以得到ax+by=gcd(a,b)的整数解。
欧几里得算法也可以用来计算模反元素;
我也不是太懂,这个还需以后好好研究一下:
求解 x,y的方法的理解
设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,a>b>0 时
设 ax1+ by1= gcd(a,b);
bx2+ (a mod b)y2= gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
则:ax1+ by1= bx2+ (a mod b)y2;
即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+ bx2- [a / b] * by2;
也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);
根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
由于java没有指针,所以用指针代替比较方便
package 基本算法;import java.util.Scanner;public class 扩展欧几里得算法 {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc=new Scanner(System.in);int a=sc.nextInt();int b=sc.nextInt();Int y=new Int();Int x=new Int();int m=exgcd(a, b, x, y);System.out.println(m+" "+x.v+" "+y.v);}public static int exgcd(int a,int b,Int x,Int y) {if(b==0) {x.v=1;y.v=0;return a;}
// 下述由于将x,y的位置进行调换,所以式子有所不同,可以用下面的方法;
// int gcd=exgcd(b, a%b, y, x);
// y.v-=(a/b)*x.v;int gcd=exgcd(b, a%b, x, y);int c=y.v;y.v=x.v-(a/b)*y.v;x.v=c;return gcd;}}
class Int{int v;public Int() {};public Int(int v) {this.v=v;}
}
扩展欧几里得算法——java相关推荐
- HDU1573 X问题【扩展欧几里得算法】
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- HDU1576 A/B【扩展欧几里得算法+试探法】
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- Python在GF(2⁸)有限域上求解多项式的乘法逆元——基于扩展欧几里得算法
文章目录 一.前言 二.数学基础 1.GF(2⁸)有限域内的多项式 2.不可约多项式 3.多项式模运算 3.乘法逆元 三.算法步骤 1.扩展欧几里得算法 2.多项式除法 3.多项式乘法 四.代码实现 ...
- 拓展欧几里得算法java实现
扩展欧几里得算法是欧几里得算法(又叫辗转相除法)的扩展.除了计算a.b两个整数的最大公约数,此算法还能找到整数x.y(其中一个很可能是负数). 通常谈到最大公因子时, 我们都会提到一个非常基本的事实: ...
- 扩展欧几里得算法java_扩展欧几里得算法
首先.扩展欧几里得定理:对于两个不全为0的整数a.b,必存在一组解x,y,使得ax+by==gcd(a,b); int gcd(int a,intb) {intt,d;if(b==0) { x=1; ...
- 扩展欧几里得算法_扩展欧几里得递推算法
欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...
- 欧几里得算法扩展欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...
- 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...
难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...
- POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...
最新文章
- 30个在线学习设计与开发的站点
- Windows 7系统垃圾清理自写程序
- 2019.7.16 网络层协议与应用
- SQL SERVER视图
- mysql 事务 视图 存储过程 触发器
- ubuntu 上搭建lanp环境
- 彩虹易支付最新版开源版源码分享
- 逗娱-游戏程序开发实习生测试题
- 开关稳压集成电路电源
- 服务器受到DDOS攻击怎么办
- 计算机无线键盘没反应,电脑无线键盘没反应怎么回事
- 京东企业注册HTML
- 首页被绑定为www.7939.com的手工解除方法
- Android程序打包安装过程
- 【深度学习】模型部署的错误整理
- Python文本挖掘:词云图
- 【遗传规划/计算智能】 彻底学会 DEAP 框架,从零搭建 GP
- TM1650和AIP650 按键扫描、LED驱动程序
- 中国聚丙烯酰胺行业市场研究与投资价值报告(2022版)
- ChatGPT神奇用法:定点周边景点推荐,Get私人导游!