扩展欧几里德(摘自JokerPark)
来源:互联网 发布:java读取exe文件 编辑:程序博客网 时间:2024/05/05 20:32
扩展欧几里得算法用于求解二元一次不定方程
ax+by=c
可以证明ax+by的最小正整数是gcd(a,b)。
设:ax+by=bx'+(a mod b)y'=gcd(a,b),
a mod b=a-[a/b]*b
则有:
g=bx'+(a mod b)y'
从最后的化简结果可以看出求解二元一次不定方程可以用递归做。
不断调用gcd,到最后a=1,b=0是就可以求出x=1,y=0,再往上带。
这里的x,y就相当于上一层递归中的x',y',代入ay'+b(x'-[a/b]y')=ax+by,求解x,y
最后x0=x*(c/g)
对于方程其他的解:
设:
ax+by=ax'+by'
移项得:
a(x-x')=b(y'-y)
[a(x-x')]/gcd(a,b)=[b(y'-y)]/gcd(a,b)
因为a/gcd(a,b)⊥b/gcd(a,b)
所以x-x'=t*b/gcd(a,b)
x=x'+t*b/gcd(a,b)
CODE
function
extended_gcd(a,b:
longint
;
var
x,y:
longint
):
longint
;
var
t:
longint
;
begin
if
b=
0
then
begin
extended_gcd:=a;
x:=
1
; y:=
0
;
end
else
begin
extended_gcd:=extended_gcd(b,a
mod
b,x,y);
t:=x; x:=y; y:=t-(a
div
b)*y;
end
;
end
;
------------------------------------------------------------------
上面是摘抄的,好久没做数论了,贴我的模版:
function ext_gcd(a,b:longint;var x1,y1:longint);var x2,y2:longint;begin if b=0 then begin ext_gcd:=a; x1;=1; y1:=0; end else begin ext_gcd:=ext_gcd(b,a mod b,x2,y2); x1:=y2; y1:=x2-y2*(a div b); end;end;
- 扩展欧几里德(摘自JokerPark)
- 乘法逆元(摘自JokerPark)
- (扩展)欧几里德算法
- (扩展)欧几里德
- (扩展)欧几里德算法
- poj1061(扩展欧几里德)
- 欧几里德及扩展欧几里德算法(学习)
- 扩展欧几里德知识(一)
- 独自poj2115(扩展欧几里德)
- (扩展)欧几里德得算法
- poj2115C Looooops(扩展欧几里德)
- 欧几里德和扩展欧几里德
- 欧几里德, 与 扩展欧几里德
- 欧几里德|扩展欧几里德
- 欧几里德&&扩展欧几里德详解
- 欧几里德&&扩展欧几里德
- 扩展欧几里德
- 扩展欧几里德
- 第四部分:高级话题
- Tomcat 6 性能优化小结
- AsyncTask
- DriverManager与DataSource 连接数据库有何区别?
- Linux的帧缓冲设备(Framebuffer)简介
- 扩展欧几里德(摘自JokerPark)
- EmEditor 正则表达式
- [C++ 学习] 常量折叠
- MySQL中修改主字段属性为auto_increment
- 模板的偏特化
- Android开发之HTTP访问网络
- VIM自动格式化C代码
- 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集
- 时间