Tải bản đầy đủ (.pdf) (89 trang)

Các thuật toán cơ bản trong lý thuyết số ( Luận án thạc sĩ)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (327.68 KB, 89 trang )

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC KHOA HỌC

NGUYỄN THÙY DUNG

CÁC THUẬT TOÁN CƠ BẢN
TRONG LÝ THUYẾT SỐ

LUẬN VĂN THẠC SĨ TOÁN HỌC

Thái Nguyên - Năm 2014


ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC KHOA HỌC

NGUYỄN THÙY DUNG

CÁC THUẬT TOÁN CƠ BẢN
TRONG LÝ THUYẾT SỐ
Chuyên ngành:

PHƯƠNG PHÁP TOÁN SƠ CẤP

Mã số : 60.46.01.13

LUẬN VĂN THẠC SĨ TOÁN HỌC

NGƯỜI HƯỚNG DẪN KHOA HỌC
PGS. TS. TẠ DUY PHƯỢNG


Thái Nguyên - Năm 2014


i

Mục lục
Mục lục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

i

Mở đầu

1

Nội dung

3

1 Các thuật toán cơ bản trong lý thuyết số

3

1.1

Tìm thương và số dư . . . . . . . . . . . . . . . . . . . . .

3

1.2


Thuật toán Euclid phân tích một số ra thừa số nguyên tố .

6

1.3

Thuật toán tìm ước số chung lớn nhất . . . . . . . . . . . .

8

1.4

Thuật toán tìm bội số chung nhỏ nhất . . . . . . . . . . . . 12

1.5

Thuật toán Lucas - Lehmer tìm số nguyên tố . . . . . . . . 15

1.6

Thuật toán Miller tìm số giả nguyên tố . . . . . . . . . . . 18

1.7

Một số thuật toán trong mật mã công khai . . . . . . . . . 23

1.8

Một số thuật toán khác . . . . . . . . . . . . . . . . . . . . 28


2 Lập trình và thực thi trên máy tính một số thuật toán số
học

30

2.1

Tìm thương và số dư . . . . . . . . . . . . . . . . . . . . . 30

2.2

Kiểm tra số nguyên tố . . . . . . . . . . . . . . . . . . . . . 43

2.3

Phân tích một số ra thừa số nguyên tố . . . . . . . . . . . . 50

2.4

Tìm ước chung lớn nhất . . . . . . . . . . . . . . . . . . . . 59


i

2.5

Tìm bội chung nhỏ nhất

. . . . . . . . . . . . . . . . . . . 66


2.6

Tìm số nguyên tố đứng sau hoặc đứng trước một số tự nhiên 74

2.7

Một số ứng dụng trong lý thuyết mật mã . . . . . . . . . . 75

2.8

Maple và một số giả thuyết về số nguyên tố . . . . . . . . . 77

Kết luận

82

Tài liệu tham khảo

84


ii

LỜI CẢM ƠN
Với lòng kính trọng và biết ơn sâu sắc em xin chân thành cảm
ơn thày PGS. TS. Tạ Duy Phượng đã hướng dẫn và chỉ bảo tận tình cho
em trong suốt quá trình làm luận văn. Thầy không chỉ truyền thụ những
tri thức khoa học mà còn chỉ dẫn cho em những phương pháp làm việc tốt
cùng những lời động viên khuyến khích kịp thời.
Em cũng xin gửi lời cảm ơn chân thành đến Ban giám hiệu, phòng

Đào tạo, khoa Toán - Tin Trường ĐHKH, Đại học Thái Nguyên đã tạo
điều kiện thuận lợi trong suốt quá trình học tập tại trường.
Xin chân thành cảm ơn gia đình, bạn bè đồng nghiệp và các
thành viên trong lớp cao học toán K6B đã luôn quan tâm, động viên, giúp
đỡ em trong suốt thời gian học tập và quá trình làm luận văn.
Thái Nguyên, 2014.
Nguyễn Thùy Dung


1

Mở đầu
Cùng với sự phát triển của máy tính điện tử, tin học ngày càng
xâm nhập sâu hơn vào chương trình giảng dạy toán, thậm chí ở cấp phổ
thông. Một số thuật toán trong lý thuyết số đã được biết đến từ thời
Euclid. Tuy nhiên, thực thi chúng với các số lớn không dễ dàng nếu không
có máy tính điện tử. Cùng với sự phát triển của toán và tin học, nhiều
thuật toán mới ra đời, đáp ứng những đòi hỏi mới của thực tế (mật mã
hóa công khai, phân tích các số nguyên tố lớn,...). Vì vậy, ngành số học
thuật toán đã ra đời. Việc tổng hợp, nghiên cứu và xây dựng các chương
trình tính toán trong số học là một công việc thú vị và hữu ích. Để đáp
ứng nhu cầu học tập và giảng dạy, tác giả đã chọn đề tài “ Các thuật toán
cơ bản trong lý thuyết số”.
Luận văn bao gồm phần mở đầu, hai chương, kết luận và danh
mục các tài liệu tham khảo.
Chương 1 Các thuật toán cơ bản trong lý thuyết số
Trình bày các thuật toán cơ bản trong Lý thuyết số (tìm ước số chung lớn
nhất, bội số chung nhỏ nhất, tìm số dư và thương khi chia một số nguyên
cho một số nguyên khác, thuật toán Euclid phân tích một số ra thừa số
nguyên tố, thuật toán Lucas- Lehmer tìm số nguyên tố, thuật toán Miller

tìm số giả nguyên tố).


2

Chương 2 Lập trình và thực thi trên máy tính điện tử một số
thuật toán số học
Trình bày các chương trình có sẵn hoặc tự lập trình cho các thuật toán
đã nêu trong chương 1. Thực thi trên máy tính điện tử khoa học (Vinacal
570ES Plus II), chương trình Pascal và chương trình tính toán trên Maple.


3

Chương 1
Các thuật toán cơ bản trong lý
thuyết số
Chương này trình bày một số thuật toán cơ bản liên quan đến
ước chung lớn nhất, bội chung nhỏ nhất, tìm số nguyên tố, phân tích một
số ra thừa số nguyên tố. . . Các vấn đề trình bày trong chương này được
tham khảo và trích dẫn chủ yếu từ một số tài liệu [4], [5], [6].

1.1

Tìm thương và số dư
Cơ sở lý thuyết của phép chia với dư là định lý về phép chia có

dư. Định lý này được ứng dụng trong giải thuật Euclid tìm ước chung lớn
nhất của hai số nguyên khác 0.
Định lý về phép chia với dư: Với hai số tự nhiên a và b bất kì (a > b),

bao giờ cũng tìm được duy nhất các số q và r sao cho a = qb + r, trong
đó 0 ≤ r < b.
Khi r = 0 ta nói a chia hết cho b hay b chia hết a. Ta cũng nói a là bội số
của b hay b là ước số của a.
Các số nguyên trong định lý được gọi như sau:


4

q được gọi là thương khi chia a cho b.
r được gọi là số dư khi chia a cho b.
b được gọi là số chia.
a được gọi là số bị chia.
Phép toán tìm q và r được gọi là phép chia với dư.
Chứng minh
Trước tiên ta nhớ lại
Tiên đề Archimede Với mọi số thực x > 0 và mọi số thực y thì tồn tại
một số tự nhiên n sao cho nx > y .
Hệ quả Với mọi số thực x < 0 và mọi số thực y thì tồn tại một số tự
nhiên n sao cho nx < y .
Nguyên lý sắp thứ tự tốt Mọi tập con khác rỗng các số tự nhiên đều
có phần tử bé nhất.
Chứng minh định lý gồm hai phần: đầu tiên chứng minh sự tồn tại của q
và r, thứ hai, chứng minh tính duy nhất của q và r.
Sự tồn tại
Xét tập hợp S = {a − nb, n ∈ Z}.
Ta khẳng định rằng S chứa ít nhất một số nguyên không âm. Có hai trường
hợp như sau.
Nếu b < 0, thì −b > 0, và theo tính chất Archimede, có một số nguyên n
sao cho −bn ≥ −a, nghĩa là a − bn ≥ 0.

Nếu b > 0, thì cũng theo tính chất Archimede, có một số nguyên n sao
cho bn ≥ −a, nghĩa là a − b (−n) = a + bn ≥ 0.
Như vậy S chứa ít nhất một số nguyên không âm. Theo nguyên lý sắp thứ
tự tốt, trong S có một số nguyên không âm nhỏ nhất, ta gọi số ấy là r.
a−r
Đặt q =
, thì q và r là các số nguyên và a = qb + r. Ta còn phải
b


5

chỉ ra rằng 0 ≤ r < |b|. Tính không âm của r là rõ ràng theo cách chọn r.
Ta sẽ chứng tỏ dấu bất đẳng thức thứ hai.
Giả sử ngược lại r ≥ |b|. Vì b = 0, r > 0 nên b > 0 hoặc b < 0.
Nếu b > 0, thì r ≥ b suy ra a − qb ≥ b. Từ đó a − qb − b ≥ 0, lại dẫn tới

a − (q + 1) b ≥ 0.
Đặt r = a − (q + 1) b thì r ∈ S và r = a − (q + 1) b = r − b < r, điều
này mâu thuẫn với tính chất r là phần tử không âm nhỏ nhất của S .
Nếu b < 0 thì r ≥ −b do đó a − qb ≥ −b. Từ đó suy ra rằng a − qb + b ≥ 0,
tiếp tục suy ra r = a−(q − 1) b ≥ 0. Do đó, r ∈ S và vì r = r+b với b < 0
ta có r = a − (q − 1) b < r, mâu thuẫn với giả thiết r là số nguyên không
âm nhỏ nhất trong S . Như vậy ta đã chứng minh sự tồn tại của q và r.
Tính duy nhất
Giả sử rằng tồn tại q , q , r, r với 0 ≤ r, r < |b| sao cho a = q + r và

a = q + r . Không mất tính tổng quát giả sử q ≤ r .
Từ hai đẳng thức trên ta có b q − q = r − r .
Nếu b > 0 thì r ≤ r và r < b ≤ b + r , và như vậy r − r < b. Còn nếu


b < 0 thì r ≤ r và r < −b ≤ −b + r, và do đó − r − r < −b. Trong cả
hai trường hợp ta có r − r < |b| .
Mặt khác đẳng thức b q − q

=

r−r

chứng tỏ rằng |b| chia hết

r − r , do đó |b| ≤ r − r hoặc r − r = 0. Nhưng vì r − r ≤ |b| ,
nên chỉ có thể r = r . Thay vào đẳng thức b q − q = r − r

ta có

bq = bq và vì b khác 0, nên q = q . Tính duy nhất đã được chứng minh.
Thuật toán chia Để chia một số tự nhiên a cho một số tự nhiên d (a > d),
ta thực hiện theo ví dụ sau:
Ví dụ 1.1 Chia a = 1542014 cho d = 135.
Giải Phân tích số a = 1542014 theo cơ số 10 ta được:


6

a = 1542014 = 1540000 + 2000 + 000 + 10 + 4.
Lấy số 154 (1540000) chia cho 135 được 1, dư 1919 (190000). Hạ 2 (2000)
được 192. Chia 192 (192000) cho 135 được 1 dư 57 (57000). Hạ 0 (000)
được 570. Chia 570 (57000) cho 135 được 4 dư 30 (3000). Hạ 1 (10) được


301. Chia 301 (3010) cho 135 được 2 dư 31 (310). Hạ nốt 4 được 314 chia
135 được 2 dư 44.
Vậy a = 1542014 = 135 × 11422 + 44.
Thuật toán chia được thực hiện trong Bảng 1 dưới đây. Thuật toán này
đã được lập trình để máy tính tự động thực hiện tính toán.

1 5 4 2 0 1 4 1 3 5
1 9 2
1 1 4 2 2
5 7 0
3 0 1
3 1 4
4 4
Bảng 1

1.2

Thuật toán Euclid phân tích một số ra thừa số
nguyên tố
Số nguyên tố là số nguyên lớn hơn 1, không chia hết cho số

nguyên dương nào ngoài 1 và chính nó. Số nguyên lớn hơn 1 không phải
là số nguyên tố được gọi là hợp số.
Định lí 1.1 Mọi số tự nhiên đều có duy nhất một phân tích thành tích
của các thừa số nguyên tố, tức là mọi số tự nhiên a đều có thể viết được
duy nhất dưới dạng a = pα1 1 pα2 2 ...pαnn , trong đó p1 , ..., pn là các số nguyên


7


tố, αi là các lũy thừa của pi .
Định lí 1.2 Mọi hợp số n đều có ước nguyên tố p ≤



n.

Thuật toán Thuật toán đơn giản nhất phân tích một số a ra thừa số
nguyên tố là ta lần lượt kiểm tra số đó có là bội của các số nguyên tố pi
(pi lần lượt bằng 2, 3, 5, 7, 11, 13, 17, 19, 23,...) không. Nếu có, ta được

a = bpαi i . Tiếp tục kiểm tra số xem b có là bội của pi+1 hay không, trong
đó pi+1 là số nguyên tố ngay sau pi trong bảng số nguyên tố.
Sàng Eratosthenes là một giải thuật cổ xưa để lập bảng tất cả các số
nguyên tố nhỏ hơn một số n cho trước. Giải thuật đầu tiên xóa số 1 ra
khỏi tập các số nguyên tố. Số tiếp theo số 1 là số 2, là số nguyên tố. Bắt
đầu từ số 2 xoá tất cả các bội của 2 ra khỏi bảng. Số đầu tiên không bị
xoá sau số 2 (số 3) là số nguyên tố. Tiếp theo lại xoá các bội của 3... Giải

thuật tiếp tục cho đến khi gặp số nguyên tố lớn hơn hoặc bằng n thì
dừng lại. Tất cả các số chưa bị xoá là số nguyên tố.
Ví dụ 1.2 Phân tích số 29601 ra thừa số nguyên tố.
Giải Rõ ràng 29601 không chia hết cho 2, cho 5, nhưng chia hết cho 3.

29601 = 9687 × 3. Ta lại có 9687 = 3289 × 3.
Vậy 29601 = 9687 × 3 = 3289 × 32 .
Vì 3289 không chia hết cho 3 nên ta kiểm tra xem 3289 có chia hết cho 7
không. Bấm máy ta được 3289 ÷ 7 = 469.8571429. Vậy 3289 không chia
hết cho 7.
Tiếp tục xem 3289 có chia hết cho 11 không. Ta có: 3289 = 299 × 11.

Vì 299 không chia hết cho 11 nên ta kiểm tra tiếp xem 299 có chia hết cho
13, 17, 19, 23 không. Cuối cùng ta được 29601 = 32 × 11 × 13 × 23.
Nhận xét Số 29601 không quá lớn và phân tích ra thừa số tương đối dễ
(vì 29601 có các ước số nhỏ, chỉ là 3, 11, 13, và 23). Tuy nhiên thuật toán


8

phân tích ra thừa số nguyên tố được thực hiện bằng tay cho số 29601 cũng
đã khá vất vả. Vì vậy hiện nay bài toán phân tích một số ra thừa số nguyên
tố, thường được thực hiện trên máy tính với những phần mềm dựa trên
các thuật toán phân tích nhanh một số ra thừa số nguyên tố.

1.3

Thuật toán tìm ước số chung lớn nhất
Nếu số nguyên a chia hết cho số nguyên d, a được gọi là bội của

d. Số nguyên dương d lớn nhất là ước của cả hai số nguyên a, b được gọi
là ước số chung lớn nhất, viết tắt là ƯSCLN, hay còn gọi tắt là ước chung
lớn nhất, viết tắt là ƯCLN, của a và b (tiếng Anh: Greatest Common
Divisor-GCD). Ta thường kí hiệu ƯCLN của a và b là (a, b). Trong trường
hợp cả hai số nguyên a và b đều bằng 0 thì chúng không có ƯCLN vì khi
đó mọi số tự nhiên khác 0 đều là ước chung của a và b. Nếu chỉ một trong
hai số a hoặc b bằng 0, số kia khác 0, thì ƯCLN của chúng bằng giá trị
tuyệt đối của số khác 0.
1.3.1 Thuật toán Euclid
Thuật toán Euclid là một giải thuật giúp tính ước số chung lớn nhất
(ƯSCLN) của hai số một cách hiệu quả. Giải thuật này đã được biết đến
từ khoảng năm 300 trước Công nguyên. Nhà toán học Hy Lạp Euclid đã

viết giải thuật này trong cuốn sách toán nổi tiếng Elements.
Trước tiên, ta nhớ lại tính chất sau. Với mọi số nguyên k ta có

(a, b) = (a + kb, b).

(1.3.1)

Thật vậy, giả sử (a, b) = d. Suy ra a = k1 d, b = k2 d trong đó (k1 , k2 ) = 1.
Ta có a + kb = k1 d + kk2 d = d (k1 + kk2 ). Dễ thấy (k1 , k2 ) = 1 nên

(k1 + kk2 , k2 ) = 1. Do đó (a + kb, b) = d. (1.3.1) được chứng minh.


9

Mô tả thuật toán Cho hai số nguyên không âm a và b không đồng thời
bằng 0; kiểm tra nếu b bằng 0 thì a là ước chung lớn nhất. Nếu không, áp
dụng phép chia liên tiếp như sau (a = r0 , b = r1 )

r0 = r1 q1 + r2 ,

0

r2 < r1 ,

r1 = r2 q2 + r3 ,

0

r3 < r2 ,


r2 = r3 q3 + r4 ,

0

r4 < r3 ,

...

...

rn−2 = rn−1 qn−1 + rn ,

0

rn < rn−1 ,

rn−1 = rn qn .
Các số r2 , r3 , ..., rn ≥ 0 và giảm dần. Vì vậy cuối cùng số dư bằng 0.
Áp dụng công thức (1.3.1) ta có

(a, b) = (r0 , r1 ) = (r1 , r2 ) = (r2 , r3 ) = ... = (rn−1 , rn ) = (rn , 0) = rn .
Do đó, ước chung lớn nhất của a và b là số dư cuối cùng khác 0 trong quá
trình chia lặp đi lặp lại ở trên.Thuật toán kết thúc và in ra kết quả là rn .
Ví dụ 1.3 Tìm ước chung lớn nhất của 330 và 140.
Theo thuật toán Euclid ta có

330 = 140.2 + 50,
140 = 50.2 + 40,
50 = 40.1 + 10,

40 = 10.4.
Trong ví dụ trên ta có : (330, 140) = (140, 50) = (50, 40) = (40, 10) = 10.
1.3.2 Thuật toán J. Stein
Năm 1967, dựa trên thuật toán Euclid, J. Stein đã xây dựng được một
thuật toán khá thuận tiện để tìm ƯCLN trong trường hợp các số đã cho
được viết dưới dạng nhị phân. Ưu điểm chủ yếu của thuật toán này là ta
không cần làm các phép tính chia (thực ra, ta có làm phép chia số chẵn


10

cho 2, nhưng trong cơ số 2 thì đó là phép dịch chuyển số đã cho sang phải
một vị trí). Thuật toán được thực hiện với các thao tác sau:
1) (a, 0) = a, trong trường hợp đặc biệt ta quy ước (0, 0) = 0.
2) (a, b) = (a − b, b).

a b
,
. Lặp lại bước này cho đến
2 2
khi ít nhất một trong hai số a, b lẻ để tìm k là số mũ của 2.
a
4) Nếu a chẵn, b lẻ thì (a, b) =
, b . Tương tự với trường hợp a lẻ, b chẵn.
2
5) Nếu a, b đều lẻ thì (a − b) chẵn và |a − b| < max(a, b).
a−b
a) Nếu a ≥ b thì (a, b) =
,b ,
2

b−a
b) Nếu a < b thì (a, b) =
,a .
2
6) Lặp lại bước 4 và 5 đến khi a = b(= c) hoặc b = 0. Thuật toán kết thúc
3) Nếu a, b là các số chẵn thì (a, b) = 2

và in ra: (a, b) = c. 2k .
Chứng minh
Giả sử (a, b) = d, suy ra a = k1 d, b = k2 d trong đó (k1 , k2 ) = 1.
Áp dụng (1.3.1) ta có:

(a, b) = (a − b, b) .

(1.3.2)

Nếu a, b là các số chẵn thì (a, b) = d = 2d , suy ra a = 2k1 d , b = 2k2 d
b
a
hay = k1 d , = k2 d . Do đó
2
2
a b
(a, b) = 2
,
.
(1.3.3)
2 2
a
Nếu a chẵn, b lẻ thì (a, b) = d, a = 2k 1 d, b = k2 d, suy ra = k 1 d,

2
b = k2 d. Vậy ta có:
a
a
, b = d hay (a, b) =
,b .
(1.3.4)
2
2
Nếu a, b đều lẻ thì a − b chẵn và |a − b| < max(a, b). Áp dụng (1.3.2) và
(1.3.3) ta có:

(a, b) =

|a − b|
,b .
2

(1.3.5)


Đồ án đầy đủ ở file: Đồ án Full












×