关键词:
感谢:http://blog.csdn.net/u014634338/article/details/40210435
扩展欧几里德算法的应用主要有以下三方面:
(1)求解不定方程;
(2)求解模的逆元;
(3)求解模线性方程(线性同余方程);
一、解不定方程
对于不定整数方程pa+qb=c,
1.若 c mod gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。
2.在找到p * a+q * b = gcd(p, q)的一组解p0,q0后,p * a+q * b = gcd(p, q)的其他整数解满足:
p = p0 + b/gcd(p, q) * t
q = q0 - a/gcd(p, q) * t(其中t为任意整数)
由此可以求出p * a+q * b = gcd(p, q)的一系列解
3.至于pa+qb=c的整数解,只需将p * a+q * b = gcd(p, q)的每个解乘上 c/Gcd(p, q) 即可。
在找到p * a+q * b = gcd(a, b)的一组解p0,q0后,应该是得到p * a+q * b = c的一组解
p1 = p0*(c/Gcd(a,b)),q1 = q0*(c/Gcd(a,b)),
p * a+q * b = c的其他整数解满足:
#include <iostream> #include <stdio.h> using namespace std; int exgcd(int a,int b,int &x,int &y)///模板 { if(b==0) { x=1; y=0; return a; } int r=exgcd(b, a%b, x, y); int t=y; y=x-(a/b)*y; x=t; return r; } int main() { int x,y,a=5,b=6,n=3; int ans=exgcd(a,b, x, y); if(n%ans){///无整数解 printf("NO "); } else { cout<<a<<"x+"<<b<<"y="<<ans<<"的一个整数解为:"<<endl; cout<<"x="<<x<<" "<<"y="<<y<<" "<<endl; cout<<"a*x+b*y=gcd(a,b)前10个解 "; int p=x+b/ans;///1. int q=y-a/ans; int o=1; while(1){ if(o==10)break; cout<<"x="<<p<<" "<<"y="<<q<<" "<<endl; o++; p=x+b/ans*o; q=y-a/ans*o; } cout<<"a*x+b*y=n*gcd(a,b)前10个解 "; p = p*(n/ans);///2. q = q*(n/ans); o=1; while(1){ if(o==10)break; cout<<"x="<<p<<" "<<"y="<<q<<" "<<endl; o++; p=x+b/ans*o; q=y-a/ans*o; } ///求最小整数解 int t=x*n/ans;///3. int temp=b/ans; t=(t%temp+temp)%temp; int s=(n-a*t)/b; cout<<a<<"x+"<<b<<"y="<<n<<"的Xmin整数解为:"<<endl; cout<<"x="<<t<<" "<<"y="<<s<<" "<<endl; } return 0; }
二、求乘法逆元
如果a×b≡1 mod n,则a、b互为乘法逆元(也就是(a*b)%n=1)。
若a与b不互素,则a模b没有乘法逆元!
一般,我们能够找到无数组解满足条件,但是一般是让你求解出最小的那组解,怎么做?我们求解出来了一个特殊的解 x0 那么,我们用 x0 % m其实就得到了最小的解了。为什么?
可以这样思考:
x 的通解不是 x0 + n*t(n>=0的整数) 吗?
那么,也就是说, a 关于 m 的逆元是一个关于 m 同余的,那么根据最小整数原理,一定存在一个最小的正整数,它是 a 关于m 的逆元,而最小的肯定是在(0 , m)之间的,而且只有一个,这就好解释了。
可能有人注意到了,这里,我写通解的时候并不是 x0 + (m/gcd)*t ,但是想想一下就明白了,gcd = 1,所以写了跟没写是一样的,但是,由于问题的特殊性,有时候我们得到的特解 x0 是一个负数,还有的时候我们的 m 也是一个负数这怎么办?
当 m 是负数的时候,我们取 m 的绝对值就行了,当 x0 是负数的时候,他模上 m 的结果仍然是负数(在计算机计算的结果上是这样的,虽然定义的时候不是这样的),这时候,我们仍然让 x0 对abs(m) 取模,然后结果再加上abs(m) 就行了,于是,我们不难写出下面的代码求解一个数 a 对于另一个数 m 的乘法逆元:
int cal(int a,int n) { int x,y; int gcd(ex_gcd(a, n, x, y)); if(1%gcd!=0) { return -1; } x*=1/gcd; n=abs(n); int ans=x%n; if(ans<=0) ans+=n; return ans; }
扩展欧几里得算法
https://zh.wikipedia.org/wiki/扩展欧几里得算法 用类似辗转相除法,求二元一次不定方程的整数解。然后把它们改写成“余数等于”的形式//式1//式2//式3然后把它们“倒回去”//应用式3//应用式2//应用式1得解。这个过程可以用矩阵... 查看详情
扩展欧几里得算法
扩展欧几里德算法 先介绍什么叫做欧几里德算法 有两个数ab,现在,我们要求ab的最大公约数,怎么求?枚举他们的因子?不现实,当ab很大的时候,枚举显得那么的naïve,那怎么做? 欧几里德... 查看详情
欧几里得算法及扩展算法。
百度百科:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b)=gcd(b,amodb)。证明: r=amodb, a=b*k+r;=> r=a-b*k;d|a&&d|b=>(a/d-b/d*k)=r/d=>d|r... 查看详情
扩展欧几里德算法
...ttp://blog.csdn.net/zhjchengfeng5/article/details/7786595 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数ab,现在,我们要求ab的最大公约数,怎么求?枚举他们的因子?不现实,当ab很大的时候,... 查看详情
欧几里德算法与扩展欧几里德算法
欧几里得算法就是我们常说的辗转相除法,辗转相除法可以用来求最大公约数,知道最大公约数还可以求最小公倍数。gcd在好像也有库函数__gcdintGcd(inta,intb){while(b!=0){ intr=b; b=a%b; a=r;}returna;}非递归方法intgcd(inta,intb){retu... 查看详情
扩展的欧几里德算法-hdu2669(代码片段)
TheSkyisSprite. TheBirdsisFlyintheSky. TheWindisWonderful. BlewThrowtheTrees TreesareShaking,LeavesareFalling. LoversWalkpassing,andsoareYou. ............................ 查看详情
扩展欧几里德算法(代码片段)
0、欧几里德定理一切的基础,自然就是欧几里德定理了。它的形式非常简单(sometimesnaive)gcd(a,b)=gcd(b,amodb) 证明:假设a,b的公约数为g,且$$a=bx+y(x,yinZ)$$则显然有$$gmida,qquadgmidb,qquadamodb=y$$$$ecau 查看详情
同余|欧拉定理|费马小定理|扩展欧拉定理|扩展欧几里得算法
目录同余基本定理欧拉定理费马小定理扩展欧拉定理扩展欧几里得算法同余基本定理欧拉定理若a,m互质,则[a^varphileft(might)equiv1left(modmight)]应用令,,这两个数是互素的。比5小的正整数中与5互素的数有1、2、3和4,所以。计算:... 查看详情
欧几里得算法和扩展欧几里得算法
概述欧几里德算法又称辗转相除法,用于计算两个整数(a),(b)的最大公约数。其计算原理依赖于下面的定理:(gcd)函数就是用来求((a,b))的最大公约数的。(gcd)函数的基本性质:[gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)]原理证明:(a?)可以表... 查看详情
扩展欧几里得算法acwing877.扩展欧几里得算法——扩展欧几里得算法证明
AcWing877.扩展欧几里得算法题解与证明#include<iostream>usingnamespacestd;intexgcd(inta,intb,int&x,int&y)if(b==0)x=1,y=0;returna;int 查看详情
扩展欧几里得算法
扩展欧几里德算法基本算法:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y,使得gcd(a,b)=ax+by。证明:设a>b。 1,显然当b=0,gcd(a,b)=a。此时x=1,y=0; 2,ab!=0时 设ax1+b... 查看详情
poj1061-青蛙的约会---扩展欧几里德算法求最小整数解
扩展欧几里得算法模板#include<cstdio>#include<cstring>#definelllonglongusingnamespacestd;llextend_gcd(lla,llb,ll&x,ll&y){if(b==0){x=1,y=0;returna;}else{llr=extend_gcd(b,a%b,y,x);y-=x*(a 查看详情
扩展欧几里德
...blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数ab,现在,我们要求ab的最大公约数,怎么求?枚... 查看详情
数论扩展欧几里得算法
扩展欧几里得 上回刚写完欧几里得,那现在还有一个东西叫拓展欧几里得: 扩展欧几里得法是一个在求解同余方程等问题上的一个很好的方法,其具体功能如下: 在已知(a,b)时,求解一组(p,q)使得p*a+q*b=... 查看详情
c++中扩展欧几里得算法的递归到底发生了啥?
】c++中扩展欧几里得算法的递归到底发生了啥?【英文标题】:Whatexactlyhappensinsideextendedeuclideanalgorithm\'srecursioninc++?c++中扩展欧几里得算法的递归到底发生了什么?【发布时间】:2016-03-0906:20:53【问题描述】:我知道什么是扩展... 查看详情
理解扩展欧几里得算法的实现
】理解扩展欧几里得算法的实现【英文标题】:UnderstandingimplementationofExtendedEuclideanalgorithm【发布时间】:2021-12-1316:51:10【问题描述】:经过一些实验和搜索,我想出了以下定义:emcd\'::Integer->Integer->(Integer,Integer,Integer)emcd\'a0... 查看详情
2018/7/31-zznu-oj-问题c:磨刀-扩展欧几里得算法的基本应用(代码片段)
问题C:磨刀时间限制: 1Sec 内存限制: 128MB提交: 190 解决: 39[提交][状态][讨论版][命题人:admin]题目描述磨刀是一个讲究的工作,只能在n℃下进行,所以我们首先要做的就是把刀的表面温度提升到n℃。... 查看详情
扩展欧几里德算法
转自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html基本状态:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y,使得gcd(a,b)=ax+by。证明:设a>b。 1,显然当b=0,gcd(a,b)=a。... 查看详情