求ax≡b(mod n)所有解的算法

unwritewolf 2009-08-06 10:02:20
利用欧几里德辗转相除法,模方程等价于存在整数y,使得ax-ny=b,时间复杂度为o(n+logb)。

Procedure modular_linear_equation(a,b,n:longint);
Begin
d:=extended_gcd(a,n,x,y); //d最大公约数,(a,n)->d;并求出x,y
if b mod d <> 0 then no_answer; //没有解,定理A
e:=(x*(b / d)) mod n; //?
For i:=0 to d-1 do //d个解,定理B
ans[i+1]:=(e+i*(n / d)) mod n; //?
End;

关于使用扩展欧几里德算法解决不定方程的办法
  对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。

定理(证明请查看相关数论书):
A. 方程 ax = b (mod n) 有解, 当且仅当 gcd(a, n) | b;
B. 方程 ax = b (mod n) 有d个不同的解, 其中 d = gcd(a, n);

谁能解释一下红色的部分~~~~~
...全文
934 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-08-09
  • 打赏
  • 举报
回复
楼上问的扩展欧几里德算法解释见http://blog.vckbase.com/arong/archive/2009/04/12/429.html

楼主问的部分:
extended_gcd得到的d,x,y满足ax-ny=d
其中d是a,n的最大公约数
回到方程az≡b(mod n) (为了避免和前面的x,y混淆,换成z)
我们需要找到一个满足条件得解使得az+b=kn
我们知道ax-ny=d, b= b(ax/d-ny/d) = abx/d - nyb/d
我想楼主对定理B没有疑问,因此知道b/d是整数,显然我们可以知道
a*x*(b/d) = b + n * y *(b/d)
从这个式子,显然x(b/d)是个满足条件得解
因此x(b/d) mod n肯定是在0到n-1之间得一个解,这就是你红色部分得e

我们顺便来解释一下定理B(我不知道有这个定理),az=b+kn,如果b和a,n得最大公约数互质,则显然不可能成立,因为这意味着a'dz -kn'd=z的左侧能整除d,而右侧不能





[Quote=引用楼主 unwritewolf 的回复:]
利用欧几里德辗转相除法,模方程等价于存在整数y,使得ax-ny=b,时间复杂度为o(n+logb)。

    Procedure modular_linear_equation(a,b,n:longint);
    Begin
    d:=extended_gcd(a,n,x,y);      //d最大公约数,(a,n)->d;并求出x,y
    if b mod d <> 0 then no_answer;      //没有解,定理A
   e:=(x*(b / d)) mod n;      //?
    For i:=0 to d-1 do        //d个解,定理B
       ans[i+1]:=(e+i*(n / d)) mod n;  //?
    End;

关于使用扩展欧几里德算法解决不定方程的办法
  对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。

定理(证明请查看相关数论书):
  A. 方程 ax = b (mod n) 有解, 当且仅当 gcd(a, n) | b;
  B. 方程 ax = b (mod n) 有d个不同的解, 其中 d = gcd(a, n);

谁能解释一下红色的部分~~~~~
[/Quote]
unwritewolf 2009-08-09
  • 打赏
  • 举报
回复
看得一头雾水,基本上理解了,验证感觉不难,要从零凯斯推到出来还是有困难的。谢谢~~
  • 打赏
  • 举报
回复
嗯我彻底理解错误,以前懂一点点的东西生疏了,挨砖头。
意思好理解,
定理B好牛
mark
[Quote=引用 1 楼 vshuang 的回复:]
楼主是要求x么?x = (b%n)/a;

利用欧几里德辗转相除法,模方程等价于存在整数y,使得ax-ny=b,时间复杂度为o(n+logb)。
不明白为什么转成这样?

[/Quote]
过去的我 2009-08-08
  • 打赏
  • 举报
回复
A. 方程 ax = b (mod n) 有解, 当且仅当 gcd(a, n) | b;

反证法:
假设 存在x,y 使得 ax = b(mod n) ,则
ax - b = kn
ax - kn = b

d = gcd(a,n)
d | a d |n
d | b
d 不整除 b ,则与上式不符,所以。。

unwritewolf 2009-08-08
  • 打赏
  • 举报
回复
求ax≡b(mod n)模方程所有解的算法 (ax与b同模)

欧几里德辗转相除法:
function gcd(a,b:longint):longint;
Begin
if b=0 then gcd:=a;
else gcd:=gcd(b, a mod b);
End;

扩展的欧几里德算法:
如果gcd(a, b)=d,那么一定存在x,y满足ax+by=d。
Function extended_gcd(a,b:longint; Var x,y:longint):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);
t:=x;
x:=y;
y:=t-(a / b) * y;
end;
End;

利用扩展欧几里德辗转相除法,模方程等价于存在整数y,使得ax-ny=b,时间复杂度为o(n+logb)。

    Procedure modular_linear_equation(a,b,n:longint);
    Begin
    d:=extended_gcd(a,n,x,y);      //d最大公约数,(a,n)->d;并求出x,y
    if b mod d <> 0 then no_answer;      //没有解,定理A
e:=(x*(b / d)) mod n;      //?
    For i:=0 to d-1 do        //d个解,定理B
ans[i+1]:=(e+i*(n / d)) mod n;  //?
    End;

关于使用扩展欧几里德算法解决不定方程的办法
  对于不定整数方程pa+qb=c,若 c mod Gcd(p, q)=0,则该方程存在整数解,否则不存在整数解。

参考定理(证明请查看相关数论书):
  A. 方程 ax = b (mod n) 有解, 当且仅当 gcd(a, n) | b;
  B. 方程 ax = b (mod n) 有d个不同的解, 其中 d = gcd(a, n);

谁能解释一下红色的部分~~~~~
baihacker 2009-08-08
  • 打赏
  • 举报
回复
我没有写完的地方,需要把i写成qd+r的形式就可以证明了...
baihacker 2009-08-08
  • 打赏
  • 举报
回复
Procedure modular_linear_equation(a,b,n:longint);
Begin
d:=extended_gcd(a,n,x,y); //d最大公约数,(a,n)->d;并求出x,y
if b mod d <> 0 then no_answer; //没有解,定理A
e:=(x*(b / d)) mod n; //?
For i:=0 to d-1 do //d个解,定理B
ans[i+1]:=(e+i*(n / d)) mod n; //?
End;
A. 方程 ax = b (mod n) 有解, 当且仅当 gcd(a, n) | b;
B. 方程 ax = b (mod n) 有d个不同的解, 其中 d = gcd(a, n);

首先两边同时除以d
a/dx=b/d (mod n/d)
记为
a'x=b'(mod n')
则gcd (a', n') = 1;
已经有
ax+ny=d
两边同时除以d有
a'_x + n'_y = 1(_x,_y是扩展欧几里德中的x, y,和求知数x重名了,故用_x, _y表示)
同时对n'取模有
a'_x = 1 (mod n')
两边同时乘以b有
a'*b'*_x = b' (mod n')
故a'x=b'(mod n')
的解为x = b'*_x = b / d * x为你代码中的e,同时e是原方程的一个解.

回到原方程
要验证(e+i*(n / d)) 为原方程的d个不同解只需要验证这d个数两两互素且加一个就不能两两互素即可.

请参考初等数论的书
wuyi8808 2009-08-08
  • 打赏
  • 举报
回复
《算法导论》中有。
  • 打赏
  • 举报
回复
,,帮顶
LeonTown 2009-08-07
  • 打赏
  • 举报
回复
帮顶。
wizard2215 2009-08-07
  • 打赏
  • 举报
回复
"d:=extended_gcd(a,n,x,y); //d最大公约数,(a,n)->d;并求出x,y "
这步求出的x是什么啊?y又是什么啊? 是满足“ax-ny=b”的一组解吗?
  • 打赏
  • 举报
回复
楼主是要求x么?x = (b%n)/a;

利用欧几里德辗转相除法,模方程等价于存在整数y,使得ax-ny=b,时间复杂度为o(n+logb)。
不明白为什么转成这样?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧