拓展欧几里得模板/求逆元模板(java)

简介: 基本原理 :设 a 和 b 不全为 0,则存在整数 x,y 使得 xa yb=gcd(a,b)=c对于辗转相除法的最后一项 此时 b=0,则 gcd(a,b)=1a 0b,(这个a,b是经过gcd的最后一项a,b)

拓展欧几里得模板



参考:哈尔滨理工大学ACM培训资料汇编/ACM-ICPC培训资料汇编*


基本原理 :设 a 和 b 不全为 0,则存在整数 x,y 使得 xa yb=gcd(a,b)=c


对于辗转相除法的最后一项 此时 b=0,则 gcd(a,b)=1a 0b,(这个a,b是经过gcd的最后一项a,b)


因为gcd(a,b)=gcd(b,a%b)


则有x *a y *b=x1 *b y1 * (a%b) 将等式右边变形,

b *x1 (a%b) *y1=b *x1 (a-(a/b) *b) *y1=a *y1 b *(x1-(a/b) *y1)


则,x=y1,y=x1-(a/b) *y1 则可由后向前迭代得到 x,y


解题思路 对于扩展欧几里德定理的题,一般都需要进行一定的推导之后得到一个形式为 xa yb=c 的方程,然后根据 c 确定解是否存在,如果 c 可以被 gcd(a,b)整除,那么方程有 解,否则方程无解。而且所得的解是不唯一的,对于一组解 x0,y0 则其所有解可以表示为 x=x0 b/gcd(a,b)*t,y=y0-a/gcd(a,b)*t,t=0, 1, 2……一般会要求找出 x 或者 y 的最小正整数 解,这个时候需要做一些调整。


总的来说。递归是一来一回的过程,在gcd中,我们只用到了去的过程,求的最大公约数,而在exgcd中,我们发现了在来的过程中,某些数按照一定的规则变化,可以得到我们想要的结果而已。


static long x=0,y=0;
...
static long extgcd(long a,long b)
  {
    if(b==0) {x=1;y=0;return a;}
    long ans=extgcd(b, a%b);
    long team=x;
    x=y;
    y=team-a/b*y;
    return ans;
  }


求逆元:


从拓展欧几里得中知道可以求ax by=c,一般是解决这类问题

当a,b互质时候。c一定等于1.因为gcd(a,b)=1,c必须被gcd整除,那么如果有解一定是1.

那么ax by=1.

求逆元一般形式(求a关于1mod m的逆元)

ax≡1 (mod m). x就是所求的逆元

变形为 ax bm=1

这样就可以运用拓展欧几里得(但是x要大于0处理)


 static long x=0;static long y=0;//全局变量
 ......
 long q=tgcd(a,b);
 // long x1=x;
 if(1%q!=0) {out.println("Not Exist");}
 else {
 while(x<=0){//x*a y*b=1 要求x>0这样并且要求x最小,那么这样操作就相当于 ab-ab操作。刚开始还没明白
 x =b;
 y-=a;
 }
 system.out.println(x);}//
 static long tgcd(long a,long b)
 {
 if(b==0) {x=1;y=0;return a;}
 long ans=tgcd(b,a%b);
 long team=x;
 x=y;
 y=team-a/b*y;
 // System.out.println(x);
 return ans;
 }


还有用小费马可以求逆元,就不介绍了。


目录
相关文章
|
3月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
42 6
|
3月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
129 1
|
3月前
|
Java
Java PDF模板生成PDF
Java PDF模板生成PDF
62 1
|
3月前
|
小程序
java--微信小程序发送模板消息
java--微信小程序发送模板消息
152 0
|
5月前
|
小程序 Java
【aspose-words】Aspose.Words for Java模板语法详细剖析
本文通过详细分析Aspose.Words for Java模板语法,介绍了使用条件块、变量和动态合并表格单元格三个常用模板标签,并结合实际案例进行演示。通过这三个标签的实操,帮助读者更好地掌握Aspose.Words的使用技巧。此外,还提供了官方文档链接以便进一步学习。
170 0
【aspose-words】Aspose.Words for Java模板语法详细剖析
|
5月前
|
Java
Java系列之 IDEA 为类 和 方法设置注解模板
这篇文章介绍了如何在IntelliJ IDEA中为类和方法设置注解模板,包括类模板的创建和应用,以及两种不同的方法注解模板的创建过程和实际效果展示,旨在提高代码的可读性和维护性。
|
4月前
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
1688 0
|
6月前
|
存储 Java 应用服务中间件
Java中套路和实现问题之基于组合/模板的套路常见框架中的应用有什么
Java中套路和实现问题之基于组合/模板的套路常见框架中的应用有什么
|
5月前
|
JavaScript Java Python
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
|
7月前
|
算法 Java 数据处理
Java算法模板 数据流快读
Java算法模板 数据流快读
53 2