Ứng dụng lý thuyết đồng dư trong tin học
ứng dụng Lý thuyết đồng dư trong Tin họcĐinh Đức HùngNhư các bạn đã biết, trong thực tế có nhiều khi chúng cần quan tâm khôngchỉ các số nguyên mà cả số dư của số nguyên đó trong phép chia cho một sốnguyên dương. Chẳng hạn ta muốn biết sau 50 giờ nữa sẽ là mấy giờ thì chỉ cầntính số dư của 50 cho 24 và cộng thêm giờ hiện thời rồi chia cho 24!Lý thuyết đồng dư là một phần quan trọng trong toán phổ thông.Trong bài viết này, chúng tôi chỉ đề cập đến hai ứng dụng nhỏ của đồngdư: Bài toán tạo các số ngẫunhiên bằng máy vi tính và Bài toán mã hoá thư từ.Mộtsố kiến thức về đồng dư có liên quanTrướchết chúng ta cùng xem lại một số kiến thức về đồng dư:Định nghĩa 1: Cho a là một số nguyên, m là một số nguyên dương. Khi đó, r được gọi là số dư trong phép chia acho m nếu tồn tại số nguyên q, r sao cho: a = mq+r, ,0≤r<M< b>.Trong lập trình Pascal để lấy số dư r chúng ta sử dụng phép toán mod: r:= a mod m;Ví dụ: 3mod 2=1; 4 mod 2=0; 5 mod 3=2.Định nghĩa 2: Cho a, b làhai số nguyên, m là một số nguyên dương. Lúc đó, a được gọi là đồng dư với b theo môđun m nếu số dư trong phép chiaa cho m bằng số dư trong phép chia b cho m. Kí hiệu: a≡b (mod m)Từ địnhnghĩa này ta có: a ≡ b (mod m)⇔ a-b chia hết cho m;Ví dụ: 5 ≡ 2 (mod 3)⇔ 5-2 chia hết cho 3; 11≡7(mod 4)⇔11-7 chia hết cho 4;Định lý 1: Cho m là số nguyên dương a đồng dưvới b theo mođun m khi chỉ khi tồn tạisố nguyên k sao cho a=b+km.Định lý 2:Nếu a≡b (mod m); c≡d(mod m) thì a+c≡b+d(mod m) và ac≡bd(mod m).<BBàitoán 1: Tạo các số ngẫunhiên bằng máy vi tính Thôngthường, chúng ta dùng thuật ngữ ngẫunhiên khi nói đến một sự tuỳ ý nào đó. Thí dụ khi bạn yêu cầu cho một số ngẫu nhiên nghĩa là cho một số nàocũng được tuỳ ý. Nhưng trong toán học, sốngẫu nhiên được định nghĩa là một số đềucó khả năng xuất hiện tương đương nhaụ Trong lập trình Pascal các bạn vần dùng hàm Random để sinh các số ngẫunhiên trong một miền nào đó. Nhưng đã bao giờ các bạn đặt ra câu hỏi người tasinh ra các số ngẫu nhiên đó bằng cách nàỏ Có nhiều phương pháp để tạo ra cácsố có tính chất gần giống với tínhchất của số ngẫu nhiên bởi vì việc tạo ra các số ngẫu nhiên là điều không thể.Một chương trình do chúng ta viết thì chắc chắn là các số được tạo ra có thểsuy luận được. Vì vậy, các số do chúng ta tạo ra chỉ có thể gọi là giả ngẫu nhiên. Tuy vậy, chúng ta hãybằng lòng với việc sử dụng những số giả ngẫu nhiên đó như những số ngẫu nhiên.Một phương pháp phổ biến được đưa ra bởi D.Lehner năm 1951 để tạo ra cácsố giả ngẫu nhiên là phương pháp đồng dưtuyến tính.Tư tưởng của phương pháp này có thể trình bày ngắn gọn như sau: Ta chọn4 số nguyên là môđun m, nhân tử a, số gia c và số hạt giốngx0 , với điều kiện 2 của m, 0 < c< m và 0 < x0 < m. Chúng ta sẽ tạo ra các dãy số ngẫu nhiên {xn}, 0 ≤ xn < m bằng cách sử dụng liên tiếp các phép số dư: xn+1 = axn+c)mod m.Ví dụ: Với m=9, a=7, c=4, x0 = 3 thì dãy số giả ngẫunhiên được tạo ra như sau:x1 = (7x0+ 4) mod 9 = (7.3 + 4) mod 9 = 25 mod 9 = 7.x2 = (7x1+ 4) mod 9 = (7.7 + 4) mod 9 = 53 mod 9 = 8. x3 = (7x2+ 4) mod 9 = (7.8 + 4) mod 9 = 60 mod 9 = 6.x4 = (7x3+ 4) mod 9 = (7.6 + 4) mod 9 = 46 mod 9 = 1.x5 = (7x4+ 4) mod 9 = (7.1 + 4) mod 9 = 11 mod 9 = 2.x6 = (7x5+ 4) mod 9 = (7.2 + 4) mod 9 = 18 mod 9 = 0.x7 = (7x6+ 4) mod 9 = (7.0 + 4) mod 9 = 4 mod 9 = 4.x8 = (7x7+ 4) mod 9 = (7.4 + 4) mod 9 = 32 mod 9 = 5.x9 = (7x8+ 4) mod 9 = (7.5 + 4) mod 9 = 39 mod 9 = 3.x10 = (7x9+ 4) mod 9 = (7.3 + 4) mod 9 = 25 mod 9 = 7.Dãy trên chứa 9 phần tử khác nhau trước khi lặp lạịThực tế là khi chúng ta chọn các số m, a, c, x0 một cách tuỳý không theo một quy luật nào thì có thể dẫn đến trường hợp tạo ra được dãy sốcó chu kì quá nhỏ so với miền xác định của nó (mođun m). Một thí dụ trongtrường hợp ta chọn m= 381, a=19, c=1, x0 = 0 dãy số giả ngẫu nhiên được tạo ra là: 0, 1, 20, 0, 1, 20, . Rõ ràng, đây là dãy có chu kỳ 3, không ngẫu nhiên trong miền 0 .381. Như vậy, làm thế nào để tạo ra một dãy số giả ngẫu nhiên tốt D.E.Knuth đã đưa ra và phát triển quy luật chọn m, a, c, x0như sau:+ Mođun m có thể lớn đến giá trị tối đa của một Word (thường là luỹ thừacủa 10 hoặc 2);+ Nhân tử a không quá lớn hay quá nhỏ (tốt hơn hết là ít hơn m một chữsố; a nên là một hằng số tuỳ ý không theo một mẫu riêng nào cả và nên kết thúcbởi x21 với x là một số chẵn.+ Giá trị hạt giống x0 có thể lấy bất kỳ;Người ta thấy rằng: với cách chọn đó dãy số tạo ra tương đối tốt theonghĩa đã nóịCài đặt: Ta có thể dùng mảng hoặc dùng một biến cập nhậtliên tục các phần tử của dãy số giả ngẫu nhiên. Nhưng trong cả hai trường hợpđó để chương trình có thể chạy tốt ngay khi a và x0 tương đối lớnchúng ta cần giải quyết vấn đề tràn.Sau đây chúng ta lấy một ví dụ sẽ thấy ngay điều đó: Giả sử máy tính củachúng ta có Word 32 bit nhưng ta chọn như sau: m=100000000, a=31415821, x0 = 1234567,c=1 đều là những giá trị nhỏ hơn giá trị tối đa của Word. Thế nhưng ngay giá trị của phép tính đầu tiên a.x0 = 38784935884507 đã vượt quá giá trị giới hạn của Word (mà ở đây chúng ta chỉ quan tâm đến giá trị (a.x0 + 1)mod m nhỏ hơn giá trị Word).Giải pháp: Giảsử P.Q vượt ra ngoài phạm vi m ở trên chúng ta sẽ làm như sau: Ta biểu diễn:P=104.P1+P0; Q=104.Q1+Q0;Bây giờ P.Q=(104.P1 + P0)(104.Q1 + Q0) =108.P1.Q1 + 104(P1.Q0 + P0.Q1) + P0.Q0.Trong tổng này chúng ta chỉ quan tâm đến 4 số cuối của số hạng 104(P1.Q0+P0.Q1)và ta có: P.Q mod m = (((P1.Q0+P0.Q1)mod 104).104 + P0.Q0) mod m. Cácbạn hoàn toàn có thể chứng minh được điều nàỵSau đây là một cách cài đặt hàm surplus(p,q) để lấy số dư của p.q cho 108:Function Surplus(p,q:longint):longint;Constm=100000000;m1=10000;Varq1,q0,p1,p0:longint;BeginQ1:=q div m1; q0:=q mod m1;P1:=p div m1; q0:=q mod m1;Surplus:=(((P1.Q0+P0.Q1) mod m1).m1 +P0.Q0) mod m; End;Cuốicùng ta có đoạn chương trình tạo n số ngẫu nhiên For i:=1 to ndo write((surplus(a,x0)+1) mod m);Chương trình trên sẽ không bị tràn với m ≤ 1/ 2 giới hạn tối đa củasố nguyên. Muốn tạo các số ngẫu nhiên nằm trong khoảng (0,1) ta chỉ việc chiadãy đã tạo được ở trên cho mođun m. Mời các bạn hãy thử xem!Bàitoán 2: Bài toán mật mã Trong nhiều lĩnh vực truyền thông thì việc giữ bí mật thông tin giữangười gửi và người nhận luôn được đặt rạ Chẳng hạn những bức điện tín, thư tíntrong quân sự. Mật mã học là một ngành khoa học chuyên nghiên cứu các thư từ bímật. Một trong những người sử dụng mật mã được biết đến sớm nhất là JuliusCaesar (Xê-da). Cách làm của Caesar như sau: ông dịch mỗi chữ cái ở bức thư gốcđi ba chữ về phía sau A -> D, B -> E, ., X -> A, Y -> B, Z -> C.Chúng ta sẽ xem xét quá trình mã hoá của Caesar một cách toán học: Trướctiên ta thay các chữ cái bằng các số p từ 0 đến 25: A -> 0, B -> 1, ., Z-> 25. Để mã hoá bức thư ta thay pbằng giá trị f(p) thuộc {0,1,2, ., 23, 24, 25}được xác định như sau: f(p) = (p+3) mod 26 và dịch ngược trở lại các kí tự.Ví dụ: Ta phải mã hoá bức thư sau: "I LOVE YOU MORETHAN I CAN SAY" bằng mật mã Caesar ta tiến hành như sau:-Chuyển các chữ thành các số: 8 11 1421 4 24 14 20 12 14 17 4 19 7 0 13 8 20 13 18 0 24- Thay p bởi f(p) ta được:11 1417 24 17 1 17 23 15 17 20 7 22 10 3 16 11 53 16 21 3 1- Thay ngược trở lại các chữ cái ta được bức thư bí mật như sau: LORYH BRX PRUH WKDQ LXQ VDBNgười nhận bức thư này phải tiến hành giải mã bức thự Thực chất củaviệc giải mã bức thư được mã hoá bằng mật mã Caesar là sử dụng hàm ngược: f-1(p)= (p-3) mod 26. Nói cách khác là ta tiến về đầu 3 chữ cáịChúng ta có thể tổng quát hoá phương pháp của Caesar bằng cách thay vìdịch 3 chữ cái ta dịch đi k chữ, lúc đó: f(p) = (p+k) mod 26 và f -1(p)=(p-k) mod 26. Các loại mật mã này được gọi là mật mã dịch. Độ an toàn của nó không caọMột phương pháp nâng cao độ an toàn là sử dụng hàm f(p)=(ạp+b) mod 26.Trong đó a,b được chọn sao cho f là song ánh. Chẳng hạn ta có thể dùng hàmf(p)=(7.p+3) mod 26. Lúc đó, A -> D, B ->K, .,Y ->P, Z ->W. Trongtrường hợp này để giải mã bức thư sẽ không đơn giản như trên. Thật vậy, muốngiải mã bức thư ta phải tiến hành như sau: giả sử f(p) là số biểu diễn chữ cái trong bức thư được mã hoá ta xét các khảnăng số nguyên k =0, 1, 2, ., 6. Nếu tồntại k sao cho (26.k-3 +f(p)) chia hết cho 7 thì chữ số biểu diễn chữ cái trongbức thư gốc là: p = (26.k-3 + f(p)) div7. Sau đây là chương trình mật mã. Programchuong_trinh_MAT_MA;Varchon: integer;ProcedureMahoa;Varch,kt:char;f,ma:text;i,ii:integer;s,ss:string;Beginwriteln('cho ten buc thu can mahoa:');readln(s);writeln('thanh buc thu:');readln(ss);assign(f,s);reset(f);assign(ma,ss);rewrite(ma);while not(eof(f)) dobeginread(f,ch);if ch<>' ' thenbegini:=ord(upcase(ch))-65;ii:=(7*i+3) mod 26;kt:=chr(ii+65);write(ma,kt);endelse write(ma,ch);end; close(f);close(ma);end;Proceduregiaimathu;Varf,gma:text;ch,kt:char;s,ss:string;i,ii,k:integer;ok:boolean;Beginwriteln('hay cho ten cua buc thu can giaima:');readln(s);writeln('tro thanh buc thu:');readln(ss);assign(f,s);reset(f);assign(gma,ss);rewrite(gma);while not(eof(f)) dobeginread(f,ch);if ch<>' ' thenbeginii:=ord(ch)-65;k:=0;ok:=false;while (k<7) and(not ok) dobegin if (26*k+ii-3)mod 7 =0 thenbegini:=(26*k+ii-3) div 7;kt:=chr(i+65);write(gma,kt);ok:=true;endelse k:=k+1;end;endelse write(gma,ch);end;close(f);close(gma);end;{----------CHUONGTRINH CHINH-----------------}beginWriteln('Moi ngai chon chuc nang can lam:'); Writeln('1: Ma hoa thú);Writeln('2: Giai ma thú);Writeln('0: exit');Write('Chon: ');Readln(chon);Case chon of 1:Mahoa;2:giaimathu;0:halt;else writeln('moi chon laí);end;end. . ứng dụng Lý thuyết đồng dư trong Tin học inh Đức HùngNhư các bạn đã biết, trong thực tế có nhiều khi chúng cần quan. chia cho 24 !Lý thuyết đồng dư là một phần quan trọng trong toán phổ thông .Trong bài viết này, chúng tôi chỉ đề cập đến hai ứng dụng nhỏ của đồngdư: Bài toán