Giải thuật Euclid mở rộng

Giải thuật Euclid mở rộng được sử dụng để giải một phương trình vô định nguyên (còn được gọi là phương trình Đi-ô-phăng) có dạng

Trong đó là các hệ số nguyên, là các ẩn nhận giá trị nguyên. Điều kiện cần và đủ để phương trình này có nghiệm (nguyên) là là ước của . Khẳng định này dựa trên một mệnh đề sau:

Nếu thì tồn tại các số nguyên sao cho

Cơ sở lý thuyết của giải thuật

[sửa | sửa mã nguồn]

Giải thuật Euclid mở rộng kết hợp quá trình tìm ƯCLN(a, b) trong thuật toán Euclid với việc tìm một cặp số x, y thoả mãn phương trình Đi-ô-phăng. Giả sử cho hai số tự nhiên a, b, ngoài ra a>b>0. Đặt , chia cho được số dư và thương số nguyên . Nếu thì dừng, nếu khác không, chia cho được số dư ,...Vì dãy các là giảm thực sự nên sau hữu hạn bước ta được số dư .

;
;
....;

trong đó số dư cuối cùng khác 0 là . Bài toán đặt ra là tìm x, y sao cho

Để làm điều này, ta tìm x, y theo công thức truy hồi, nghĩa là sẽ tìm

sao cho:
với .

Ta có

, nghĩa là
. (1)

Tổng quát, giả sử có

với .
với .

Khi đó từ

suy ra

từ đó, có thể chọn

(2)
(3)

Khi ta có được . Các công thức (1), (2), (3) là công thức truy hồi để tính x, y.

Giải thuật

[sửa | sửa mã nguồn]
{Thuật toán Euclide: a, b không đồng thời bằng 0, trả về gcd(a, b)}
function gcd(a, b);
begin
  while b  0 do
    begin
      r:= a mod b; a:= b; b:= r;
    end;
  Result:= a;
end;
{Thuật toán Euclide mở rộng: a, b không đồng thời bằng 0, trả về cặp (x, y) sao cho a * x + b * y = gcd(a, b)
Về tư tưởng là ghép quá trình tính cặp số (x, y) vào trong vòng lặp chính của thuật toán Euclide.}
function Extended_gcd(a, b); 
begin
  (xa, ya):= (1, 0);
  (xb, yb):= (0, 1);
  while b  0 do
    begin
      q:= a div b;
      r:= a mod b; a:= b; b:= r; //Đoạn này giống thuật toán Euclide.
      (xr, yr):= (xa, ya) - q * (xb, yb); //Hiểu là: (xr, yr):= (xa, ya) "mod" (xb, yb);
      (xa, ya):= (xb, yb);
      (xb, yb):= (xr, yr);
    end;
  Result:= (xa, ya);
end;

Giải thuật sau chỉ thực hiện với các số nguyên a>b>0, biểu diễn bằng giải mã:

 Sub Euclid_Extended(a,b)
 Dim x0, x, y,y1 As Single
    x0=1: x1=0: y0=0: y1=1
 
 While b>0
      r= a mod b 
      if r=0 then Exit While
      q= a / b
      x= x0-x1*q
      y= y0-y1*q
      a=b
      b=r
      x0=x1     
      x1=x
      y0=y1     
      y1=y
 Wend
    Me.Print d:=b, x, y
code
 End Sub

Với a=29, b=8, giải thuật trải qua các bước như sau:

Bước
0 29 8 5 3 1 0 1 0 1 -3
1 8 5 3 1 0 1 -1 1 -3 4
2 5 3 2 1 1 -1 2 -3 4 -7
3 3 2 1 1 -1 2 -3 4 -7 11
4 2 1 0 2

Kết quả thuật toán cho đồng thời , .
Dễ dàng kiểm tra hệ thức

Áp dụng giải thuật Euclid mở rộng tìm số nghịch đảo trong vành

[sửa | sửa mã nguồn]

Số nghịch đảo trong vành

[sửa | sửa mã nguồn]

Trong lý thuyết số, vành được định nghĩa là vành thương của với quan hệ đồng dư theo modulo m (là quan hệ tương đương) mà các phần tử của nó là các lớp đồng dư theo modulo m (m là số nguyên dương lớn hơn 1). Ta cũng có thể xét chỉ với các đại diện của nó. Khi đó

Phép cộng và nhân trong là phép toán thông thường được rút gọn theo modulo m:


Phần tử a của được gọi là khả nghịch trong hay khả nghịch theo modulo m nếu tồn tại phần tử a' trong sao cho a*a'=1 trong hay . Khi đó a' được gọi là nghịch đảo modulo m của a. Trong lý thuyết số đã chứng minh rằng, số a là khả nghịch theo modulo m khi và chỉ khi ƯCLN của a và m bằng 1.
Khi đó tồn tại các số nguyên x, y sao cho

Đẳng thức này lại chỉ ra y là nghịch đảo của a theo modulo m. Do đó có thể tìm được phần tử nghịch đảo của a theo modulo m nhờ thuật toán Euclid mở rộng khi chia m cho a.

Giải thuật

[sửa | sửa mã nguồn]
//a, m > 0. Trả về a^-1 mod m, gcd(a, m) phải bằng 1, chú ý là ta không cần quan tâm y khi giải pt diophante a * x + m * y = 1
function ModuloInverse(a, m);
begin
  xa:= 1; xm:= 0;
  while m  0 do
    begin
      q:= a div m;
      xr:= xa - q * xm;
      xa:= xm;
      xm:= xr;
      r:= a mod m;
      a:= m;
      m:= r;
    end;
  Result:= xa;
end;

Giải thuật sau chỉ thực hiện với các số nguyên m>a>0, biểu diễn bằng giã mã:

 Procedure Euclid_Extended (a,m)
int,  y0:=0,y1:=1;

While a>0 do {
     r:= m mod a 
     if r=0 then Break      
     q:= m div a
     y:= y0-y1*q
     y0:=y1     
     y1:=y
     m:=a
     a:=r
     
  }
 If a>1 Then Return "A không khả nghịch theo mođun m" 
 else Return " Nghịch đảo modulo m của a là y"

Tìm số nghịch đảo (nếu có) của 30 theo môđun 101

Bước i m a r q y0 y1 y
0 101 30 11 3 0 1 -3
1 30 11 8 2 1 -3 7
2 11 8 3 1 -3 7 -10
3 8 3 2 2 7 -10 27
4 3 2 1 1 -10 27 -37
5 2 1 0 . . . .

Kết quả tính toán trong bảng cho ta . Lấy số đối của theo mođun được . Vậy .

Ứng dụng

[sửa | sửa mã nguồn]

Số nghịch đảo theo môđun được ứng dụng nhiều trong việc giải phương trình đồng dư, trong lý thuyết mật mã.

Tham khảo

[sửa | sửa mã nguồn]

Liên kết ngoài

[sửa | sửa mã nguồn]
Chúng tôi bán
Bài viết liên quan
Đọc sách như thế nào?
Đọc sách như thế nào?
Chắc chắn là bạn đã biết đọc sách là như thế nào rồi. Bất cứ ai với trình độ học vấn tốt nghiệp cấp 1 đều biết thế nào là đọc sách.
Nghệ thuật của việc mất cân bằng trong phát triển
Nghệ thuật của việc mất cân bằng trong phát triển
Mất cân bằng trong phát triển là điều rất dễ xảy ra, vậy mất cân bằng như thế nào để vẫn lành mạnh? Mình muốn bàn về điều đó thông qua bài viết này.
Những kiểu tóc đẹp chơi tết 2020 là con gái phải thử
Những kiểu tóc đẹp chơi tết 2020 là con gái phải thử
“Cái răng cái tóc là gốc con người”. Tết này bạn hãy “làm mới” mình bằng một trong các kiểu tóc đang biến các cô nàng xinh lung linh hơn nhé.
Vĩnh biệt BAEMIN- hành trình chan chứa đầy cảm xúc
Vĩnh biệt BAEMIN- hành trình chan chứa đầy cảm xúc
Baemin với tên khai sinh đầy đủ là Baedal Minjeok, được sự hẫu thuận mạnh mẽ nên có chỗ đứng vững chắc và lượng người dùng ổn định