Tải bản đầy đủ (.doc) (53 trang)

Về một số thuật toán số học và ứng dụng

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 (464.22 KB, 53 trang )

1

Bộ giáo dục và đào tạo
Trờng đại học Vinh
---------------------------------------------

Phạm mạnh Quyết

Về một số thuật toán
số học và ứng dụng

Luận văn thạc sĩ toán học

Vinh - 2006


2

Bộ giáo dục và đào tạo
Trờng đại học Vinh
-----------------------------------------------------

Phạm Mạnh quyết

Về một số thuật toán
số học và ứng dụng

Chuyên ngành: Đại số & Lý thuyết số
Mã số: 60 46 05
Luận văn thạc sĩ toán học
Ngời hớng dẫn khoa học


PGS.TS. Nguyễn Thành Quang
Vinh - 2006


3

Lời cảm ơn
Luận văn đợc thực hiện và hoàn thành tại Trờng Đại học Vinh, dới sự hớng dẫn tận
tình của PGS. TS Nguyễn Thành Quang. Nhân dịp này, tác giả xin bày tỏ lòng biết
ơn và kính trọng sâu sắc tới thầy giáo hớng dẫn PGS. TS Nguyễn Thành Quang,
ngời đã đặt ra phơng hớng nghiên cứu và hớng dẫn tác giả hoàn thành luận văn
này.
Trong quá trình học tập và viết luận văn, tác giả đã nhận đợc sự giúp đỡ và dạy
bảo tận tình của GS. TS. Nguyễn Quốc Thi, PGS. TS. Nguyễn Quý Dy, PGS. TS. Ngô
Sỹ Tùng, PGS. TS. Lê Quốc Hán, TS. Mai Văn T, TS. Chu Trọng Thanh và các thầy
giáo trong chuyên ngành Đại số & Lí thuyết số, Khoa Toán và Khoa Đào tạo Sau đại
học Trờng Đại học Vinh. Tác giả xin trân trọng cảm ơn sự giúp đỡ quý báu đó.
Tác giả xin chân thành cảm ơn học viên cao học toán khóa 12 về những trao
đổi bổ ích trong nhiều chứng minh chi tiết của luận văn.
Tác giả xin chân thành cảm ơn Sở Giáo dục và Đào tạo Nghệ An, Phòng Giáo
dục huyện Quỳnh Lu và Trờng THCS Quỳnh Hồng Quỳnh Lu đã tận tình giúp đỡ
về tinh thần và vật chất để tác giả có thể hoàn thành luận văn này.
Tác giả xin chân thành cảm ơn các học viên cao học Khóa XXII Toán về
những trao đổi bổ ích trong nhiều chứng minh chi tiết.
Luận văn không tránh khỏi nhiều thiếu sót, tác giả mong muốn nhận đợc sự
giúp đỡ chỉ bảo của các thầy cô giáo và các bạn đồng nghiệp.


4


Mở đầu
Ngày nay máy tính đã thâm nhập vào hầu hết các lĩnh vực
khoa học và đời sống. Nhiều chương trình ứng dụng đã được phát
triển liên quan tới quản lý dự liệu, in ấn, đồ họa, xử lý ảnh
Riêng đối với ngành toán đã có những sản phẩm mang tính phổ
dụng như Mathematica, Matlat, Maple và nhiều chương trình
chuyên dụng cho từng bộ môn toán học. Những phần mềm trên giúp
ích rất nhiều cho việc giảng dạy toán, học toán cũng như việc
ứng dụng toán trong các ngành kỹ thuật, kinh tế và vì thế tại
các nước phát triển chúng đã trở thành cẩm nang của nhiều sinh
viên và các nhà khoa học. Maple cho ta một công cụ tốt để triển
khai các thuật toán có độ phức tạp cao mà không có mẹo mực thủ
công nào có thể thay thế được. Maple có đặc tính ưu việt là có
ngôn ngữ
câu lệnh rất giống với ngôn ngữ toán học thông
thường, dễ sử dụng, đòi hỏi cấu hình của máy không lớn, đáp ứng
nhu cầu tính toán của nhiều đối tượng.
Maple là một hệ phần mềm chuyên dụng cho công việc tính
toán bao gồm các tính toán thuần tuý bằng ký hiệu toán học, các
tính toán số và các tính toán bằng đồ thị. Sản phẩm này do
Trường Đại học Tổng hợp Waterloo (Canada) và Trường Đại học kỹ
thuật Zurich (ETZ) xây dựng và đưa vào thương mại đầu tiên năm
1985. Qua nhiều lần cải tiến Maple đã được phổ biến rộng rãi
trên thế giới. Maple đã tạo ra cho chúng ta cách tiếp cận mới
với toán học sinh động và sáng tạo hơn.
Nhằm góp phần đẩy mạnh ứng dụng công nghệ thông tin vào
đổi mới phương pháp giảng dạy và nghiên cứu toán học ở nhà
trường phổ thông, mục tiêu của luận văn bước đầu tìm hiểu và
giới thiệu về các thuật toán trong số học, sử dụng các phần mềm
tin học để thực hiện một số tính toán cụ thể và tính toán hình

thức. Sau một thời gian tìm hiểu và sử dụng, chúng tôi quyết
định chọn phần mềm tính toán Maple để thực hiện một số tính
toán về phương diện đại số và số học.
Với những lý do trên, chúng tôi chọn hướng đề tài của luận
văn Về một số thuật toán số học và ứng dụng. Cấu trúc của
luận văn gồm 3 chương cùng với phần mở đầu, kết luận và danh
mục 10 tài liệu tham khảo.
Chương 1, giới thiệu về một số kiến thức cơ sở về số học
thuật toán. Trong nhiều con đường khác nhau để đi vào số học,
ta có thể chọn con đường thuật toán: các định lý, khái niệm của
số học được trình bày cùng với các thuật toán xây dựng chúng,
trong đó các thuật toán có kèm theo đánh giá sơ bộ về độ phức
tạp. Nội dung chủ yếu đề cập trong chương 1 là: Thuật toán, Độ
phức tạp của thuật toán, Sơ lược về Maple.


5

Lời cảm ơn
Luận văn đợc thực hiện và hoàn thành tại Trờng Đại học Vinh, dới sự hớng dẫn tận
tình của PGS. TS Nguyễn Thành Quang. Nhân dịp này, tác giả xin bày tỏ lòng biết
ơn và kính trọng sâu sắc tới thầy giáo hớng dẫn PGS. TS Nguyễn Thành Quang,
ngời đã đặt ra phơng hớng nghiên cứu và hớng dẫn tác giả hoàn thành luận văn
này.
Trong quá trình học tập và viết luận văn, tác giả đã nhận đợc sự giúp đỡ và dạy
bảo tận tình của GS. TS. Nguyễn Quốc Thi, PGS. TS. Nguyễn Quý Dy, PGS. TS. Ngô
Sỹ Tùng, PGS. TS. Lê Quốc Hán, TS. Mai Văn T, TS. Chu Trọng Thanh và các thầy
giáo trong chuyên ngành Đại số & Lí thuyết số, Khoa Toán và Khoa Đào tạo Sau đại
học Trờng Đại học Vinh. Tác giả xin trân trọng cảm ơn sự giúp đỡ quý báu đó.
Tác giả xin chân thành cảm ơn học viên cao học toán khóa 12 về những trao đổi bổ

ích trong nhiều chứng minh chi tiết của luận văn.
Tác giả xin chân thành cảm ơn Sở Giáo dục và Đào tạo Nghệ An, Phòng Giáo dục
huyện Quỳnh Lu và Trờng THCS Quỳnh Hồng Quỳnh Lu đã tận tình giúp đỡ về tinh thần
và vật chất để tác giả có thể hoàn thành luận văn này.
Tác giả xin chân thành cảm ơn các học viên cao học Khóa XXII Toán về những trao
đổi bổ ích trong nhiều chứng minh chi tiết.
Luận văn không tránh khỏi nhiều thiếu sót, tác giả mong muốn nhận đợc sự giúp đỡ
chỉ bảo của các thầy cô giáo và các bạn đồng nghiệp.


6

Mở đầu
Ngày nay máy tính đã thâm nhập vào hầu hết các lĩnh vực khoa học và đời sống. Nhiều chơng trình ứng dụng đã đợc phát triển liên quan tới quản lý dự liệu, in ấn, đồ họa, xử lý ảnh Riêng
đối với ngành toán đã có những sản phẩm mang tính phổ dụng nh Mathematica, Matlat, Maple và
nhiều chơng trình chuyên dụng cho từng bộ môn toán học. Những phần mềm trên giúp ích rất nhiều
cho việc giảng dạy toán, học toán cũng nh việc ứng dụng toán trong các ngành kỹ thuật, kinh tế và vì
thế tại các nớc phát triển chúng đã trở thành cẩm nang của nhiều sinh viên và các nhà khoa học.
Maple cho ta một công cụ tốt để triển khai các thuật toán có độ phức tạp cao mà không có mẹo mực
thủ công nào có thể thay thế đợc. Maple có đặc tính u việt là có ngôn ngữ câu lệnh rất giống với
ngôn ngữ toán học thông thờng, dễ sử dụng, đòi hỏi cấu hình của máy không lớn, đáp ứng nhu cầu
tính toán của nhiều đối tợng.
Maple là một hệ phần mềm chuyên dụng cho công việc tính toán bao gồm các tính toán
thuần tuý bằng ký hiệu toán học, các tính toán số và các tính toán bằng đồ thị. Sản phẩm này do Trờng Đại học Tổng hợp Waterloo (Canada) và Trờng Đại học kỹ thuật Zurich (ETZ) xây dựng và đa
vào thơng mại đầu tiên năm 1985. Qua nhiều lần cải tiến Maple đã đợc phổ biến rộng rãi trên thế
giới. Maple đã tạo ra cho chúng ta cách tiếp cận mới với toán học sinh động và sáng tạo hơn.
Nhằm góp phần đẩy mạnh ứng dụng công nghệ thông tin vào đổi mới phơng pháp giảng dạy
và nghiên cứu toán học ở nhà trờng phổ thông, mục tiêu của luận văn bớc đầu tìm hiểu và giới thiệu
về các thuật toán trong số học, sử dụng các phần mềm tin học để thực hiện một số tính toán cụ thể và
tính toán hình thức. Sau một thời gian tìm hiểu và sử dụng, chúng tôi quyết định chọn phần mềm tính

toán Maple để thực hiện một số tính toán về phơng diện đại số và số học.
Với những lý do trên, chúng tôi chọn hớng đề tài của luận văn Về một số thuật toán số học
và ứng dụng. Cấu trúc của luận văn gồm 3 chơng cùng với phần mở đầu, kết luận và danh mục 10
tài liệu tham khảo.
Chơng 1, giới thiệu về một số kiến thức cơ sở về số học thuật toán. Trong nhiều con đờng
khác nhau để đi vào số học, ta có thể chọn con đờng thuật toán: các định lý, khái niệm của số học đợc trình bày cùng với các thuật toán xây dựng chúng, trong đó các thuật toán có kèm theo đánh giá
sơ bộ về độ phức tạp. Nội dung chủ yếu đề cập trong chơng 1 là: Thuật toán, Độ phức tạp của thuật
toán, Sơ lợc về Maple.
Chơng 2, giới thiệu một số vấn đề cơ sở của số học hiện đại: Số giả nguyên tố, Số
Carmichael, Số giả nguyên tố mạnh, Kiểm tra Miller, Mở rộng Galois của trờng số đại số. Kết quả
chính trong chơng 2 là đã chỉ ra đợc:
Số k các chữ số trong biểu diễn của số nguyên dơng n trong hệ cơ số g có bậc O-lớn của lnn
hay k = O(lnn) (xem định lý 1.2.9).
Thuật toán tính n! có độ phức tạp là O(n2ln2n), (xem định lý 1.2.10).
Chơng 3, giới thiệu thực hành tính toán trên Maple gồm: Thuật toán kiểm tra nguyên tố, Thuật
toán kiểm tra số giả nguyên tố, Thuật toán kiểm tra số Carmichael, Thuật toán kiểm tra số giả
nguyên tố mạnh, Tính toán đồng d theo Định lý Trung Quốc Chơng 3 của luận văn còn thực hiện
một số tính toán hình thức: Thiết lập các mở rộng đại số của trờng số hữu tỉ; Khai báo các mở rộng
đại số của trờng Galois có đặc số nguyên tố; Tính toán trên trờng Galois. Các thuật toán này đều đợc
chúng tôi kiểm tra trên phần mềm Maple. Chẳng hạn, trong chơng 3 của luận văn, chúng tôi quan
tâm tới


7
Giả thuyết. Tích của các số nguyên tố liên tiếp bắt đầu từ 3 trừ đi
2 là số nguyên tố. Nói khác đi, nếu ký hiệu pk là số nguyên tố thứ
k (kể từ số 3 trở đi) thì số

An = p1 p2 p3 ... pn 2


là số nguyên tố,

với mọi n > 2.
Trong tuyển tập 30 năm báo Toán học và Tuổi trẻ, Nhà xuất bản Giáo dục, Hà Nội, 1997 viết
rằng: Bằng cách thử ta thấy các số A3 , A4 , A5 , A6 , A7 đều là số nguyên tố. Tuy nhiên muốn kiểm
tra A8 thì cần phải làm 300 phép chia và để kiểm tra A 9 cần tới 1300 phép chia, tức là mất vài buổi
làm tính.
Với Maple, luận văn kiểm định đợc giả thuyết trên nhờ lệnh
ifactor (phân tích một số ra thừa số nguyên tố):
[> ifactor(3*5*7*11*13*17*19*23 2);
(1673196523)
[> ifactor(3*5*7*11*13*17*19*23*29 2);
(43)(167)(450473)
Nh vậy, số A8 = 3.5.7.11.13.17.19. 23 2 là số nguyên tố và số A9 =
3.5.7.11.13.17.19. 23.29 2 là hợp số và ta có câu trả lời phủ
định cho giả thuyết trên.
Trong thời gian tới, với các khả năng tính toán và biểu diễn tuyệt vời
của các phần mềm tin học, cộng với công sức và tài năng s phạm của
ngời thầy (một điều kiện không thể thiếu), chúng ta hy vọng sẽ tạo
ra những đổi mới cơ bản và toàn diện giáo dục toán học phổ thông và
đại học ở nớc ta. Luận văn này của chúng tôi mong muốn đợc đóng góp
một phần vô cùng nhỏ bé trong công cuộc vận động hết sức to lớn đó.
Luận văn đợc thực hiện và hoàn thành tại Trờng Đại học Vinh, dới sự hớng dẫn nghiêm túc
của PGS. TS. Nguyễn Thành Quang. Nhân dịp này, tác giả xin bày tỏ lòng biết ơn sâu sắc và kính
trọng tới Thầy giáo hớng dẫn PGS.TS Nguyễn Thành Quang.
Tác giả xin bày tỏ lòng biết ơn tới: GS.TS. Nguyễn Quốc Thi, PGS. TS. Nguyễn Quý Dy,
PGS. TS. Ngô Sỹ Tùng, PGS. TS. Lê Quốc Hán, TS. Mai Văn T, TS. Chu Trọng Thanh và các thầy
giáo, cô giáo trong Tổ Đại số, Khoa Toán, Khoa Đào tạo Sau đại học - Trờng Đại học Vinh, đã tận
tình giúp đỡ tác giả trong quá trình học tập và viết luận văn.
Tác giả xin chân thành cảm ơn Sở Giáo dục và Đào tạo Nghệ An, Phòng Giáo dục huyện

Quỳnh Lu và Trờng THCS Quỳnh Hồng Quỳnh Lu đã tận tình giúp đỡ về tinh thần và vật chất để
tác giả có thể hoàn thành luận văn này.
Tác giả xin chân thành cảm ơn các học viên cao học Khóa XXII Toán về những trao đổi bổ
ích trong nhiều chứng minh chi tiết.
Luận văn không tránh khỏi nhiều thiếu sót, tác giả mong muốn nhận đợc sự giúp đỡ chỉ bảo
của các thầy cô giáo và các bạn đồng nghiệp.
Tác giả


8

Chơng 1
CáC KIếN THứC chuẩn bị
1.1. Thuật toán
1.1.1. Định nghĩa. Thuật toán là một quy tắc để với những dự liệu ban đầu đã cho, tìm đợc
lời giải sau một khoảng thời gian hữu hạn.
Ví dụ. Cho n số X[1] , X[2] , ..., X[n]. Tìm m, j sao cho:
M = X[ j ] = max X[k], 1 k n
và j là lớn nhất có thể. Điều đó có nghĩa là cần tìm cực đại của các số đã cho và chỉ số lớn
nhất trong các số đạt cực đại.
Với mục tiêu tìm số cực đại với chỉ số lớn nhất, ta xuất phát từ giá trị X[n]. Bớc thứ
nhất, ta xem m = X[n] và j = n. Tiếp theo, ta so sánh X[n] với X[n-1]. Trong trờng hợp n -1
= 0 tức n = 1, thuật toán kết thúc.
Nếu X[n -1] X[n], ta chuyển sang so sánh X[n] với X[n-2]. Trong trờng hợp ngợc
lại, X[n-1] chính là số cực đại trong hai số đã xét, và ta phải thay đổi m và j: Đặt m = X[n
-1], j = n - 1. Với cách làm nh trên, ở mỗi bớc ta luôn nhận đợc số cực đại trong những số đã
xét. Bớc tiếp theo là so sánh nó với số đứng trớc, hoặc kết thúc thuật toán trong trờng hợp
không còn số nào đứng trớc nó.
Thuật toán trên đây đợc ghi lại nh sau:
Thuật toán M tìm cực đại:

M1 : [Bớc xuất phát] Đặt j n, k n - 1, m X[n].
M2 : [Đã kiểm tra xong ] Nếu k = 0, thuật toán kết thúc.
M3 : [So sánh ] Nếu X[k] m, chuyển sang M5.
M4 : [Thay đổi m ] Đặt j k, m X[k] (Tạm thời m đang là cực đại )
M5 : [Giảm k] Đặt k k-1, quay về M2.
Dấu dùng để chỉ một phép toán là phép thay chỗ (replacement).
Trên đây ta ghi một thuật toán bằng ngôn ngữ thông thờng. Trong trờng hợp thuật
toán đợc viết bằng ngôn ngữ của máy tính ta có một chơng trình.


9

Trong thuật toán M đầu vào (input) là các số X[1] , X[2] , ..., X[n].
Trong thuật toán M đầu ra (ouput) là m và j.
Ta thấy thuật toán mô tả ở trên thỏa mãn yêu cầu của thuật toán nói chung, đó là:
1. Tính hữu hạn: Thuật toán cần phải kết thúc sau một số hữu hạn bớc. Khi thuật toán dừng
làm việc ta phải thu đợc cho vấn đề đặt ra. Thuật toán M rõ ràng thoả mãn điều kiện này, vì ở
mỗi bớc ta luôn chuyển từ việc xét một số sang số đứng trớc nó, và số các số là hữu hạn.
2.Tính xác định: ở mỗi bớc, thuật toán cần phải xác định tức chỉ rõ việc cần làm.
Ngoài ra còn phải xét đến tính hiệu quả của thuật toán. Sẽ không xét những thuật toán
mà thời gian thực hiện nó vợt quá khả năng làm việc của chúng ta; mà chỉ quan tâm đến
những thuật toán có thể sử dụng thật sự trên máy tính.
1.1.2. Độ phức tạp của thuật toán.
Thời gian làm việc của máy tính khi chạy một thuật toán nào đó không chỉ phụ thuộc
vào thuật toán mà còn phụ thuộc vào máy tính đợc sử dụng. Để có một chuẩn chung, ta sẽ đo
độ phức tạp của thuật toán bằng số các phép tính phải làm khi thực hiện thuật toán. Độ phức
tạp của thuật toán là một hàm phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào.
Khi làm việc máy tính dùng hệ đếm cơ số 2; để biểu diễn một số ta chỉ dùng hai kí
hiệu 0 và 1 mỗi kí hiệu là một bít (viết tắt của chữ binary digit). Một số nguyên n đợc biểu
diễn bơỉ k chữ số 1 và 0 đợc gọi là một số k - bit. Độ phức tạp của thuật toán đợc đo bằng số

các phép tính bit.
Để ớc lợng cho độ phức tạp của thuật toán ta dùng khái niệm bậc O - lớn.
1.1.3. Định nghĩa. Giả sử f ( n) và g ( n) là hai hàm xác định trên tập số nguyên dơng. Ta
nói f ( n) có bậc O- lớn của g ( n) , và viết f ( n) = O ( g (n)) hoặc f = O ( g ) , nếu tồn tại
một số C > 0 sao cho với n đủ lớn, các hàm f ( n) và g ( n) đều dơng, đồng thời

f ( n) < Cg (n) .
1.1.4. Nhận xét.
1) Giả sử f ( n) là đa thức: f ( n) = ad n d + ad 1n d 1 + L + a1n + a0 , trong đó ad > 0
. Khi đó, ta có f ( n) = O (n d ).
2) Nếu f1 ( n) = O ( g (n)), f 2 ( n) = O ( g (n)) thì f1 + f 2 = O ( g ).
3) Nếu f1 = O ( g1 ), f 2 = O ( g 2 ) thì f1 f 2 = O ( g1g 2 ).


10

f ( n)
thì f = O ( g ) .
n g ( n)

4) Nếu tồn tại giới hạn hữu hạn lim
5) Với mọi số > 0, log n = O (n ).

1.1.5. Định nghĩa. Một thuật toán đợc gọi là có độ phức tạp đa thức, hoặc có thời gian đa
thức, nếu số các phép tính cần thiết khi thực hiện thuật toán không vợt quá O (log d n) , trong
đó n là độ lớn của đầu vào và d là số nguyên dơng nào đó. Nói cách khác nếu đầu vào là các
số k- bit thì thời gian thực hiện thuật toán là O ( k d ) , tức là tơng đơng với một đa thức của k.
Các thuật toán với thời gian O ( n ) , > 0 , đợc gọi là các thuật toán với độ phức tạp
mũ, hoặc thời gian mũ.
Nếu có một thuật toán nào đó có độ phức tạp O ( g ) , thì cũng có thể nói nó độ phức

tạp O ( h) với mọi hàm h > g.
Cũng có những thuật toán có độ phức tạp trung gian giữa đa thức và mũ. Chẳng hạn
thuật toán nhanh nhất đợc biết đến hiện nay để phân tích một số nguyên n ra thừa số nguyên
tố là thuật toán có độ phức tạp:
exp( log n log log n ) .


11

1.2. Sơ lợc về Maple
Ngày nay máy tính đã thâm nhập vào hầu hết các lĩnh vực khoa học và đời sống. Nhiều chơng trình ứng dụng đã đợc phát triển liên quan tới quản lý dự liệu, in ấn, đồ họa, xử lý ảnh Riêng
đối với ngành toán đã có những sản phẩm mang tính phổ dụng nh Mathematica, Matlat, Maple, và
nhiều chơng trình chuyên dụng cho từng bộ môn toán học. Những phần mềm trên giúp ích rất nhiều
cho việc giảng dạy toán, học toán cũng nh việc ứng dụng toán trong các ngành kỹ thuật, kinh tế và vì
thế tại các nớc phát triển chúng đã trở thành cẩm nang của nhiều sinh viên và các nhà khoa học.
Maple cho ta một công cụ tốt để triển khai các thuật toán có độ phức tạp cao mà không có mẹo mực
thủ công nào có thể thay thế đợc. Maple có đặc tính u việt là có ngôn ngữ câu lệnh rất giống với
ngôn ngữ toán học thông thờng, dễ sử dụng, đòi hỏi cấu hình của máy không lớn, đáp ứng nhu cầu
tính toán của nhiều đối tợng.
Maple là một hệ phần mềm chuyên dụng cho công việc tính toán bao gồm các tính toán
thuần tuý bằng ký hiệu toán học, các tính toán số và các tính toán bằng đồ thị. Sản phẩm này do Trờng Đại học Tổng hợp Waterloo (Canada) và Trờng Đại học kỹ thuật Zurich (ETZ) xây dựng và đa
vào thơng mại đầu tiên năm 1985. Qua nhiều lần cải tiến Maple đã đợc phổ biến rộng rãi trên thế
giới. Dới đây chúng tôi giới thiệu sơ lợc các tính năng của Maple thông qua một số tính toán cụ thể
về phơng diện đại số và số học.

1.2.1. Các quy định chung của Maple.
a) Cụm xử lý (Execution group).
Cụm xử lý là thành phần tính toán cơ bản trong môi trờng làm việc của Maple. Mọi
tính toán đều thực hiện trong cụm xử lý. Trong cụm xử lý có chứa lệnh của Maple cùng với
kết quả tính toán, kể cả đồ thị, Trong Maple có thể nhận biết một cụm xử lý bằng dấu

ngoắc vuông [ bên trái của dấu nhắc lệnh >:
[>
b) Lệnh của Maple.
Lệnh của Maple đợc đa vào trang công tác sau dấu nhắc lệnh (command prompt)
trong các cụm xử lý. Lệnh thực hiện các phép toán và các biểu thức số học đợc viết trực tiếp
nh khi nhập văn bản thông thờng. Ví dụ, để tính 99 + 452 ta viết câu lệnh nh sau:
[> 99+452;
Tiếp đến, nhấn phím [Enter] cho thực hiện lệnh, ta sẽ thấy kết quả là: 551
Ký hiệu của các phép toán trong Maple:
Phép nhân đợc biểu thị bởi dấu *
Phép chia đợc biểu thị bởi dấu /
Phép luỹ thừa đợc biểu thị bởi dấu ^
Phép khai căn bậc hai đợc biểu thị bởi dấu Sqrt ( viết tắt của square root).


12

Kết thúc của dòng lệnh phải là dấu chấm phẩy ; hoặc dấu hai chấm : và lệnh đợc thực
hiện bằng cách nhấn phím [ Enter] khi con trỏ ở cuối dòng lệnh. Nếu dòng lệnh kết thúc
bằng dấu chấm phẩy thì kết quả của nó sẽ đợc hiển thị trên màn hình sau khi lệnh đợc thực
hiện. Nếu kết quả tính toán là những biểu thức cồng kềnh chiếm nhiều chỗ hoặc là những kết
quả tính toán trung gian không cần cho hiển thị, thì ta kết thúc câu lệnh bằng dấu hai chấm.
Nếu có nhiều dòng lệnh trong một cụm xử lý thì việc nhấn phím [Enter] sau một dòng
lệnh nào đó (trong số các lệnh) cũng tức là thực hiện tất cả các dòng lệnh trong cụm xử lý
đó.
Lệnh của Maple có 2 loại: trơ và trực tiếp. Lệnh trực tiếp cho ta ngay kết quả của
lệnh; còn lệnh trơ chỉ cho ra biểu thức tợng trng và khi cần biết giá trị đích thực của biểu
thức đó ta phải dùng thêm lệnh lấy giá trị của biểu thức Value (%). Maple ngầm hiểu ký
hiệu % là biểu thức ngay trớc đó. Lệnh trơ và lệnh trực tiếp sai khác nhau chỉ ở chữ cái đầu
tiên. Lệnh trực tiếp có chữ cái đầu là chữ thờng, còn lệnh trơ có chữ cái đầu là chữ hoa. Các

lệnh trơ cho phép ta tiết kiệm thời gian nhờ tránh đợc các tính toán trung gian không cần
thiết.
c) Kết quả của Maple.
Sau khi nhấn phím [Enter] ở cuối dòng lệnh trong một cụm xử lý thì kết quả tính toán
sẽ đợc hiện ra ngay dới dòng lệnh. Kết quả của lệnh sẽ là số, giá trị logic: đúng (true) sai
(false), biểu thức toán học, hoặc là đồ thị.
Ghi nhớ : Cuối dòng lệnh phải là dấu chấm chấm phẩy ; hoặc dấu hai chấm : Nếu không
có một trong hai dấu kết thúc của dòng lệnh này thì máy sẽ báo lỗi (Error) và không thực
hiện tính toán.

Muốn thực hiện dòng lệnh nào thì đa con trỏ về sau dấu kết thúc dòng lệnh đó và
nhấn phím [Enter].

Thực hiện dòng lệnh theo đúng trình tự trớc sau vì một số tính toán trong các bớc
sau có thể yêu cầu kết quả từ các bớc trớc.
1.2.2. Một vài lệnh số học phổ thông
1) Tính giai thừa. Ta tính 99! giai thừa bằng lệnh sau:
[> 99!;
Sau khi nhấn phím [Enter] cho thực hiện lệnh, ta sẽ thấy hiện ra kết quả:


13
9332621544944152681699238856266700490715968264381621468592963895
2175999932299115608941463976156518286256979208272237582511852109
168640000000000000000000000

2) Tìm ớc số chung lớn nhất. Để tìm ớc số chung lớn nhất (most grand commn divisor) của
hai số nguyên ta dùng lệnh gcd (. , . ). Ví dụ tìm CLN của 5524 và 120, ta dùng lệnh nh sau:
[> gcd(5524,120 );
24

3) Tìm bội số chung nhỏ nhất. Để tìm bội số chung nhỏ nhất (smallest commn multiple)
của hai số nguyên ta dùng lệnh lcm (. , . ).
Ví dụ: Tìm BCNN của 5524 và 120, ta dùng lệnh có cú pháp nh sau:
[> lcm(18230,3224);
29386760
Tìm BCNN của nhiều số:
[> lcm(1234,2345,3456,4567);
22836668964480
4) Phân tích thành thừa số nguyên tố (Decomposition into prime factor).
Muốn phân tích một số ra thừa số nguyên tố ta dùng lệnh ifactor(.).
[>ifactor(720);
(2) (2) (2) (2)(3)(3)(5)
[> ifactor(9993);
(3) (3331)
5) Phân tích số Fermat.
n

Nhà Toán học Fermat dự đoán: số F n = 2 2 + 1 là số nguyên tố với mọi số tự nhiên
n. Điều này đúng với n = 0, 1, 2, 3, 4. Tuy nhiên, vào năm 1732 Euler chỉ ra với n = 5 thì
điều này không đúng: Số F5 có ớc nguyên tố là 641. Với Maple ta có thể tiếp tục công việc
của Euler một cách nhanh chóng. Thật vậy, với n = 6 ta có
[>ifactor( 2^(2^6) + 1);
(67280421310721)(274177)

Với n = 7 ta có
[>ifactor( 2^(2^7) + 1);
(5704689200685129054721)(59649589127497217)

Muốn thiết lập lại tích của các thừa số ta dùng lệnh khai triển (Expansion) biểu thức trên có
cú pháp nh sau:

[>expand(%);


14
340282366920948463463374607431768211457

(Maple ngầm hiểu ký hiệu % là biểu thức ngay trớc đó).
6) Tìm số nguyên tố đứng trớc hoặc sau ngay một số cho trớc.
Muốn tìm số nguyên tố đứng trớc một số tự nhiên cho trớc ta dùng lệnh prevprime ( .
);
Ví dụ: Tìm số nguyên tố đứng trớc ngay số 3335
[prevprime(3335);
3331

Muốn tìm số nguyên tố đứng sau ngay một số tự nhiên cho trớc ta dùng lệnh
nextprime ( . );
7) Tìm nghiệm nguyên của phơng trình (To solve equation on set of integers).
Để tìm nghiệm nguyên của phơng trình ta dùng lệnh isolve với cú pháp nh sau:
[>isolve (eqns, vars);
Trong đó: eqns tập các phơng trình,
vars - tập các tên biến vô định.
Lệnh isolve (giải phơng trình trên tập các số nguyên) cho phép tìm nghiệm nguyên tơng ứng với mọi ẩn tham gia trong các phơng trình. Tập tên các biến vô định (vars) đợc sử
dụng biểu diễn nghiệm, các biến này có giá trị nguyên. Nếu ta không chỉ rõ biến này, hoặc
khai báo không đủ thì chơng trình sẽ tạo ra các tên:
-

N1, - N2, Nếu ta khai báo thừa (nhiều hơn biến vô định thực tế) thì cũng không sao, ch -

ơng trình sẽ không đụng chạm đến các biến thừa.
Nếu phơng trình không có nghiệm nguyên (hoặc Maple không có khả năng tìm

nghiệm) thì máy khai báo NULL hoặc không trả lời. Xem ví dụ sau:
[>isolve( x + y + z = 0,{a.b,c,d});
{z= a, y = b, x = - a b}

[>isolve( 3*x - 4*y = 7);
{y = 2 + 3N1, x = 5 + 4N1 }

[>isolve(x+2*y + 3*z = 4,{a});
{y = - N2, x = 4 3a - 2-N2, z = a}

Trong thí dụ này ta chỉ khai báo tên một tham số tự do {a} mà phơng trình có hai biến tự do,
nên chơng trình tự động sinh ra thêm một tham số tự do nữa là _- N2.
[>isolve(x+2*y+3*z=4,{a,b});
{y = b, x = 4 3a - 2b, z = a}

8) Tìm thơng và d (quotient and remainder).


15

irem Tìm phần d nguyên

Lệnh

Iquo - Tìm thơng nguyên
Cú pháp
Tham biến

irem (m, n)


irem (m, n, q )

Iquo(m, n)

iquo(m, n, r )

m, n -

biểu thức

q, r -

tên

Nếu m, n là hai số nguyên thì lệnh irem tính phần d của m khi chia cho n và nếu có
sự tham gia của biến q thì nó sẽ gán cho thơng. Tơng tự, lệnh iquo tính thơng khi chia m
cho n và nếu có sự tham gia của biến thứ ba r thì nó đợc gán cho phần d. Ví dụ muốn tìm
d của phép chia 1234567 cho 54321 ta dùng lệnh
[>irem(1234567, 54321, q );
39505

Nếu muốn biết thơng của phép chia này ta dùng lệnh xem giá trị của biến q
[>q;
22

Ngoài ra ta có thể thực hiện các lệnh sau để tìm d
[>iquo(1234567, 54321, r ) ;
22

[>r;

39505

9) Tính toán truy hồi
Dùng Maple có thể tính giá trị của các biểu thức theo công thức truy hồi. Cú pháp của
lệnh này là:
[>rsolve (eqns, fcns) ;
Trong đó, enqs là phơng trình, fcns là tên hàm mà lệmh rsolve phải tìm. Ví dụ, tìm công thức
cho hàm f(k) sau đây theo truy hồi:
f(n) = - 3 f(n-1) - 2 f(n -2)
với các giá trị ban đầu f(0) và f(1) bất kỳ, bằng lệnh
[>rsolve(f(n)=- 3*f(n-1) 2*f(n -2),f(k));
Ta có ngay kết quả tính f(k) thông qua các giá trị ban đầu:

(2f(0) + f(1)) (-1)k + ( - f(0) - f(1)) ( -2) k .


16

Nếu muốn có công thức của f(k) với giá trị ban đầu cho trớc thì phải khai báo giá trị ấy vào
eqns. Thí dụ ta khai báo f(1) = f(2) = 1, nh sau:
[>rsolve(f(n)=-3*f(n-1) 2*f(n -2),f(1. .2) = 1,{f});
Cho ngay kết quả:

{f(n) = - 3(-1) n + (-2) n }.

Ví dụ: Tính số hạng f(n) của dãy Fibonacci có công thức
{ f(n) = f(n -1) + f( n -2) }
với điều kiện ban đầu là: f(1) = f(2) = 1.
[>rsolve(f(n)= f(n-1) + f(n-2), f(1. .2) = 1,{f});


(1
f ( n) =

1
2
1
2
5)(
) n (1
5)(
)n
5
5
5 1)
5 + 1)
+
.
5 1
5 +1

10) Giải hệ phơng trình tuyến tính với ba ẩn và một tham số

ax + 3 y + 3 z = 10

x y + az = 2
3 x 2 y + z = 6

bằng lệnh:
[>solve({a*x+3*y+3*z=10,x-y+a*z=2,3*x-2*y+z=6},{x,y,z});
cho kết quả


{ x = ( 5 + 19a) / a(a + 4), y = ( 16a 2 + 3a + 15) / a(4 + a), x = ( 5 + 19a) / a(a + 4)}
1.2.3. Maple với vẽ đồ thị hàm số.
Muốn vẽ đồ thị ta dùng lệnh vẽ (Plot) với cú pháp thông thờng. Với Maple các bài
toán khó về đồ thị sẽ trở nên đơn giản.
Ví dụ. (Đề thi HS giỏi miền Bắc năm 1967). Vẽ đồ thị của hàm số:

y=

x3 x2 2x
3

x +1

Trên miền x [ 4;5], y [5;12] đợc Maple thực hiện bằng lệnh
[> plot(abs(x^3-x^2-2*x)/3-abs(x+1),x=-4..5,y=-5..12);


17

1.2.4. Các tính toán số học phức tạp.
Đây chính là nội dung sẽ đợc đề cập đến trong các chơng sau của luận văn này. Các
lệnh tính toán phức tạp trong Lý thuyết số sẽ đợc hỗ trợ trong Maple bởi gói công cụ chuyên
dụng cho lĩnh vực này. Rất nhiều lệnh sẽ không thực hiện hoặc sẽ thực hiện sai nếu nh ta
không mở sẵn gói công cụ đó. Vì vậy, mỗi khi mở máy thực hành tính toán, việc đầu tiên ta
nên làm là gọi nó ra bằng lệnh:
[> with (numtheory) ;


18


Chơng 2
Biểu diễn số nguyên và các thuật toán số học
2.1. Độ phức tạp của thuật toán trong việc biểu diễn số nguyên
Mặc dù đã quen thuộc với cách biểu diễn số nguyên trong cơ số tuỳ ý, chúng tôi nhắc lại vấn đề đó để thuận tiện cho việc trình bày thuật
toán và độ phức tạp của thuật toán trong việc biểu diễn các số nguyên.

2.1.1. Định lý. Giả sử g là số nguyên lớn hơn 1. Khi đó, mọi số tự nhiên n 0 có thể viết
duy nhất dới dạng

n = a k g k + a k 1 g k 1 + + a1 g + a 0
trong đó a j là các số nguyên, 0 a j g 1, j = 0,1,..., k và hệ số đầu tiên a k 0.
Chứng minh. Ta thực hiện liên tiếp phép chia n cho g :
n = gq0 + a0 , 0 a0 g 1
Nếu q 0 > g , thì ta tiếp tục chia q 0 cho g để đợc

q0 = gq1 + a1 ,0 a1 g 1 .
Tiếp tục quá trình trên, ta có
q1 = gq2 + a2 , 0 a2 g 1
q2 = gq3 + a3 , 0 a3 g 1
..............................................
qk 1 = g.0 + ak , 0 < ak g 1 .
Vì g > 1 , nên ta có

n > q o > q1 > ... > q k 1 > q k = 0.
Vì vậy, quá trình trên phải kết thúc với q k = 0. Thay các q j lần lợt theo các a j và g
ta sẽ thu đợc cách viết cần có của n .
Giả sử ta còn có

n = bl g l + bl 1 g l 1 + + b1 g + b0

trong đó b j là các số nguyên, 0 b j g 1, j = 0,1,..., l và hệ số đầu tiên bl 0. Khi đó,
từ đẳng thức

a k g k + a k 1 g k 1 + + a1 g + a 0 = bl g l + bl 1 g l 1 + + b1 g + b0
cho ta a 0 = b0 , vì đó là số d trong phép chia n cho g . Giả sử ta đã có

a 0 = b0 , a1 = b1 ,..., a s 1 = bs 1 .
Thế thì ta đợc

a k g k + + a s g s = bl g l + + bs g s .


19

Từ đó ta có

a k g k s + + a s +1 g + a s = bl g l s + + bs +1 g + bs .
Lại nh trên ta đợc a s = bs . Giả sử k > l , tức khắc ta có

a k g k l + + a l +1 g l +1 = 0 .
Đẳng thức này trái với điều kiện a k 0. Vì vậy, k = l và a j = b j , j = 0,1,..., k .



2.1.2. Hệ cơ số. Từ định lý trên đây, cho phép chỉ bằng g ký hiệu biểu thị g số tự nhiên
đầu tiên 0,1,..., g 1 , ta có thể biểu diễn đợc mọi số tự nhiên. Các ký hiệu này đợc gọi là
các chữ số trong hệ cơ số g . Cho n là số tự nhiên khác không, khi đó

n = a k g k + a k 1 g k 1 + + a1 g + a 0
trong đó a j là các số nguyên, 0 a j g 1, j = 0,1,..., k với hệ số đầu tiên a k 0.

Ta viết (a k a k 1 ...a1 a 0 ) g để chỉ số n trong hệ cơ số g . Các hệ số a j đợc gọi là các chữ số
của n trong hệ cơ số g .
Nhận xét. Nếu số nguyên n biểu diễn trong hệ cơ số g có k chữ số thì

g k 1 < n < g k .
Do đó, số chữ số của n đợc tính theo công thức

log n
k = [log g n] + 1 =
+1
log g
trong đó ký hiệu log để chỉ logarit cơ số e. Trong hệ cơ số tuỳ ý, ta có k = O (log n).
2.1.3. Hệ đếm thập phân. Hệ cơ số 10 đợc gọi là hệ thập phân. Trong tiếng Việt tên của tất
cả các số từ 1 cho tới một triệu gồm có 14 từ, chỉ các số 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100,
1000, 10 000, 1000 000. Ngoài ra, để cho dễ đọc một số từ đã đợc biến thể khi ghép: một
thành mốt, năm thành lăm, mời thành mơi. Cơ sở của cách tạo từ ở đây là số 10 và vì
vậy hệ thống danh pháp của chúng ta là hệ đếm thập phân. Sỡ dĩ số 10 có vai trò đặc biệt là
vì hai bàn tay chúng ta có 10 ngón. Chẳng hạn, đối với số 1994 trong hệ thập phân, ta có:
1994 = 1.103 + 9.102 + 9.10 + 4.
2.1.4. Hệ đếm nhị phân. Hệ cơ số 2 đợc gọi là hệ nhị phân. Hệ nhị phân có rất nhiều ứng
dụng, do chỉ dùng hai kí hiệu 0 và 1 và việc tính toán với các số trong hệ này rất đơn giản.
Máy tính sử dụng cách viết nhị phân, lí do là vì trong máy tính ngời ta dựa trên một nguyên
tắc vật lý đơn giản gọi là nguyên tắc Sáng, Tắt: bóng đèn sáng chỉ số 1, bóng đèn tắt chỉ
số 0. Ta dùng bít để chỉ chữ số nhị phân 0 và1. Một ký hiệu 0 hoặc 1 đợc gọi là một bít
(viết tắt của chữ binary digit). Một số nguyên biểu diễn bởi k chữ số 1 và 0 đợc gọi là một
số k-bit. Số tự nhiên n sẽ là một số k-bit với k = [log2n] + 1.


20


Chẳng hạn đối với số 1994 trong hệ thập phân, có
(1994)10 = (11111001010)2.
Trong máy tính, bên cạnh hệ cơ số 2, ngời ta còn dùng hệ cơ số 8 hoặc cơ số
16. Lý do chủ yếu là vì chuyển một số trong cơ số 2 sang cơ số 8, ta chỉ việc nhóm từ phải
sang trái từng khối ba chữ số, rồi chuyển số đợc viết trong khối đó
sang dạng thập phân. Số
(11111001010)2
đợc tách thành các nhóm1, 110, 010, 100, 110. Từ đó ta đợc
(11111001010)2 = (16236)8.
Máy tính nào cũng có giới hạn về độ lớn của các số có thể đa vào tính toán. Giới hạn
đó đợc gọi là cỡ từ của máy, ký hiệu bởi . Cỡ từ thờng là một luỹ thừa của 2, chẳng hạn
235. Để thực hiện các phép tính số học với những số nguyên lớn hơn cỡ từ, ta làm nh sau:
Muốn đa một số n > vào máy, ta viết n dới dạng cơ số g và khi đó n đợc biểu diễn
bằng những số không vợt quá cỡ từ. Ví dụ, nếu cỡ từ của máy là 2 35 thì có thể đa một số có
độ lớn cỡ 2350-1, ta chỉ cần dùng 10 số nhỏ hơn cỡ từ của máy, bằng cách biểu diễn n trong
cơ số 235. Nh đã nói ở trên việc chuyển một số từ cơ số 2 sang cơ số 2 35 đợc thực hiện bằng
cách nhóm từng khối 35 chữ số.
2.1.5. Thuật toán nhân nhanh hai số.
Trong những thập kỷ gần đây của thế kỷ XX, ngời ta tìm ra những thuật toán nhân với
độ phức tạp bé hơn nhiều so với cách nhân thông thờng. Ta sử dụng tính
chất phân phối của phép nhân đối với phép cộng các số nguyên:
Nếu a = a1 + a2 , b = b1 + b2 , thì ab = a1b1 + a 2 b2 + a 2 b1 + a1b2 .
Điều đáng chú ý ở đây là, thay cho việc nhân hai số nguyên n bít, ta thực hiện việc
phép nhân các số có số chữ số nhỏ hơn, cùng với một số phép cộng. Thực ra điều này không
có gì mới, ngay trong quan niệm ban đầu phép nhân a với b là phép cộng b lần số a. Tuy
nhiên để có một thuật toán nhân nhanh, ta không thể cộng b lần số a, mà phải tìm đợc một
cách tối u nào đó để tách b và a thành những phần nhỏ hơn. Thuật toán dới đây, cho ta một
cách để làm việc phân chia nh vậy.
2.1.6. Thuật toán Karatuba, Ofman (xem[ 5]).
Giả sử muốn nhân hai số nguyên 2n bit


a = ( a 2 n 1 a 2 n 2 ...a1 a 0 ) 2
b = (b2 n 1b2n 2 ...b1b0 ) 2 .
Ta viết a = 2 n A1 + A0 , b = 2 n B1 + B0 , trong đó

A1 = (a 2 n 1 a 2 n 2 ...a n ) 2 , A0 = (a n 1 a n 2 ... a1 a 0 ) 2


21

B1 = (b2n 1b2 n 2 ...bn ) 2 , B0 = (bn 1bn 2 ... b1b0 ) 2 .
Khi đó, ta có:

ab = (2 2 n + 2 n ) A1 B1 + 2 n ( A1 A0 )( B1 B0 ) + ( 2 n + 1) A0 B0 .
Nh vậy phép nhân các số 2n bit đợc đa về việc nhân các số n bit, cùng với phép cộng,
trừ và dịch chuyển ( nhân một số với một luỹ thừa bậc n của 2 đợc thực hiện bằng cách dịch
số đó sang trái n vị trí).
2.1.7. Định lý. Thuật toán Karatuba - Ofman có độ phức tạp là O ( n log 2 3 ).
Chứng minh. Gọi M(n) là số các phép tính bit tối đa cần thiết khi thực hiện nhân hai số
nguyên n bit bằng thuật toán Karatuba - Ofman. Từ công thức
ab = (22 n + 2n ) A1B1 + 2n ( A1 A0 )( B1 B0 ) + (2n + 1) A0 B0 ,
đã nói ở trên, ta có:

M (2n) 3M (n) + Cn,
trong đó C là một hằng số không phụ thuộc vào n. Đặt c = max(C , M (2)). Bằng quy nạp,
chứng minh đợc rằng
M (2k ) c(3k 2k ).
Từ đó ta có:

M (n) = M (2 log 2 n ) M (2 [ log 2 n ] +1 ) c(3[ log 2 n ] +1 2 [ log 2 n ] +1 ) 3c3[ log 2 n ] +1 3cn log 2 n .

Định lý đợc chứng minh.



2.1.8. Định lý (xem [4]). Với mọi

> 0 , tồn tại thuật toán nhân sao cho số phép tính bít

M(n) cần thiết để nhân hai số n bit thỏa mãn bất đẳng thức

M (n) < C ( )n1+

với hằng số

C ( ) nào đó độc lập với n.

2.1.9. Định lý. Giả sử số nguyên dơng n biểu diễn trong cơ số g tuỳ ý có k chữ số. Khi đó

k = O(lnn).
Chứng minh. Vì số nguyên dơng n biểu diễn trong cơ số g tuỳ ý có k chữ số nên:

n = ( a k-1a k-2 ...a 1a 0 ) g
trong đó a k-1 0 , 0 a j g-1 , j= 1,2,..., k-1.
Suy ra

n = a k -1 g k -1 + a k -2 g k - 2 + ...+ a 1g + a 0 g k -1


22
k

Ta sẽ chứng minh n < g . Thật vậy, vì 0 a j g-1 , j= 1,2,..., k-1. nên

n = a k -1 g k-1 + a k -2 g k -2 + ...+ a 1g + a 0
(g-1)g k -1 +..+ (g-1)g + g-1
k

= g -g
k

k-1

+ g k-1 - ... + g 2 - g + g - 1
k

= g -1Vậy

g k-1 n < g k .
Suy ra

k = [log g n] + 1 = [ ln n ln g ] + 1 .

Từ đó suy ra k = O(lnn). Định lý đợc chứng minh.



Nhận xét Từ các quy tắc của các
phép tính số học ta thấy :
1. Để cộng hai số nguyên lần lợt có k, h bit ta cần O(max{k,h}) phép tính bit.
2. Để nhân hai số nguyên lần lợt có k, h bit ta cần O(kh) phép tính bit và số các chữ số của

tích đó không vợt quá tổng các chữ số của mỗi thừa số cộng một.
Thật vậy, giả sử :

n = ( a k-1a k-2 ...a 1a 0 ) 2
m = ( a h-1a h-2 ...a1a 0 ) 2
hai số nguyên lần lợt có k, h bit và giả sử k h. Ta có:

m + n = (a k -1a k - 2 ...a1a 0 ) 2 + (b h -1b h - 2 ...b1b 0 ) 2
= a k -1 2 k-1 + a k - 2 2 k - 2 + ...+ a 0 +b h -1 2 h-1 + b h - 2 2 h - 2 + ... + b 0
= a k -1 2k-1 + a k - 2 2k - 2 + ...+ a h 2h + (a h-1 + b h-1 )2 h-1 +...+ (a 0 + b0 )
Nh vậy để cộng m và n ta chỉ cần làm việc với các chữ số của nó. Từ đó ta có để cộng
hai số nguyên lần lợt có k, h bit ta cần O(k) = O(max{k,h}) phép tính bit. Tơng tự :

mn = a k-1 b h-1 2k+h-2 + ...+ a 0 b 0 .


23

Từ đó suy ra để nhân hai số nguyên lần lợt có k, h bit ta cần O(max{k,h}) phép tính
bit và các chữ số của tích đó không vợt quá tổng các chữ số của mỗi thừa số cộng một.
2.1.10. Thuật toán tính n! có độ phức tạp là O(n2ln2n).
Chứng minh. Để tính n! ta cần phải thực hiện (n - 2) phép nhân j ! với (j + 1) , với j =
2,3... ,n-1. Ta thấy số chữ số của j ! ít hơn số chữ số của j.j.j...j = j i . Ta ký hiệu k(j) là
số bit (số chữ số trong hệ nhị phân) của j. Theo nhận xét vừa nêu trên, ta có:

k( j2 ) 2k( j) +1
k( j3 ) = k( j2 .j)
k( j2 )k( j) +1
3k( j) +2.
k( ji ) = k( ji 1 j)

k( ji 1 ) +k( j) +1
jk( j) + j 1
< jk( j) + j = j(k( j) +1)
n(k(n) +1).
Nh vậy, nếu n là số k-bit ( k(n) = k) thì j ! là số O( n(k + 1)) bit. Tại mỗi bớc
(B2,...,Bn-1) ta nhân số (j + 1) có O(k)- bit (do j + 1 n) với số j ! có O(n(k + 1)) bit nên
số phép tính bit mỗi bớc không quá nk(k + 1). Vì (n-2) bớc nên theo định lý 2.1.9 ta có số
phép tính bit là O((n-2)nk(k + 1)) = O(n2k2). Theo định lý 2.1.9 ta có số phép tính bit cần
thiết để thực hiện thuật toán tính n! là O(n2ln2n). Định lý đợc chứng minh.
2.1.11. Mệnh đề. Thuật toán nhân hai ma trận vuông cấp n theo quy tắc thông thờng có độ
phức tạp O(n3m2) nếu mỗi phần tử của ma trận là những số O(m) bit.
Chứng minh. Giả sử A = (aij )n và B = (bij )n là hai ma trận vuông cấp n và C =AB =
(cij )n . Ta có :
n

cij = a ik b kj
k =1

Nh vậy để tính cij ta cần n phép nhân
hai số O(m) bit aik với bkj và n 1 phép cộng các tích đó . Theo nhận xét , ta cần O(nm2+ (n
1 )m) = O(nm2) phép tính bit. Vì có n2 phần tử cij nên thuật toán nhân hai ma trận vuông
cấp n theo quy tắc thông thờng có độ phức tạp O(n2nm2) = O(n3m2).


24

2.2. thuật toán kiểm tra nguyên tố
2.2.1. Định nghĩa. 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ó (không có ớc thực sự). Một số nguyên lớn hơn 1 và không phải là số
nguyên tố đợc gọi là hợp số.

2.2.2. Định lý. ứớc nhỏ nhất khác 1 của một số tự nhiên lớn hơn 1 là số nguyên tố.
Chứng minh. Giả sử a là một số tự nhiên lớn hơn 1 và p là ớc nhỏ nhất khác 1 của a . Nếu
p là hợp số, khi đó p có một ớc thực sự q sao cho 1 < q < p . Vì p là ớc của a nên q
cũng là ớc của a , điều này mâu thuẫn với giả thiết p là ớc nhỏ nhất khác 1 của a .
2.2.3. Định lý. Có vô hạn số nguyên tố.
Chứng minh. Giả sử chỉ có hữu hạn các số nguyên tố p1 ,..., p k (k 1) , ta đặt
a = p1 p 2 ... p k + 1 .
Theo định lý 2.2.2, ớc nhỏ nhất p khác 1 của a là số nguyên tố. Vì chỉ có hữu hạn các số
nguyên tố ở trên, cho nên p = p j nào đó. Từ đó suy ra, số nguyên tố p là ớc của 1. Ta gặp
phải một mâu thuẫn. g
Ngay từ thời cổ đại, ngời ta đã biết rằng tập hợp các số nguyên tố là vô hạn. Có rất
nhiều chứng minh khác nhau của sự kiện đó. Không chỉ quan tâm đến tập hợp các số nguyên
tố, trong nhiều vấn đề của lý thuyết và ứng dụng, ngời ta còn cần biết có hữu hạn hay vô hạn
số nguyên tố biểu thị trong một dạng nào đó. Chẳng hạn, cho số n lấy các giá trị nguyên dơng, có Giả thuyết: Tập hợp các số nguyên tố dạng n 2 + 1 là vô hạn.
2.2.4. Giả thuyết Goldbach.
Biểu diễn một số nguyên dới dạng nào đó luôn luôn là bài toán thu hút sự quan tâm
của nhiều ngời. Hơn nữa, nhiều khi cần trả lời câu hỏi: có bao nhiêu cách. Một câu hỏi thuộc
hớng trên là một giả thuyết lớn sau:
Giả thuyết Goldbach. Mọi số nguyên chẵn lớn hơn 2 đều có thể viết dới dạng tổng của hai
số nguyên tố.
Giả thuyết Goldbach là một trong những giả thuyết nổi tiếng nhất của toán học. Giả
thuyết này đợc C. Goldbach phát biểu trong bức th gửi Euler năm 1742. Ngời ta đã kiểm tra
đợc rằng giả thuyết đúng với các số nguyên chẵn không quá 1000000, thế nhng câu trả lời
cho trờng hợp tổng quát vẫn là một bài toán mở.
Bài toán xác định một số cho trớc có phải là số nguyên tố hay không, có nhiều ứng
dụng trong thực tiễn. Đối với những số nhỏ, bài toán đó là đơn giản. Tuy nhiên khi làm việc
với số lớn (có khoảng 100 chữ số thập phân trở lên) ta cần phải tìm ra một thuật toán hữu
hiệu để có thể thực hiện trên máy tính trong khoảng thời gian chấp nhận đợc. Định lý sau đây
cho một thuật toán đơn giản để xác định các số nguyên tố.
2.2.5. Định lý. Mọi hợp số n đều có ớc nguyên tố không vợt quá n .



25

Chứng minh. Vì n là hợp số nên ta có thể viết n = ab, trong đó a, b là các số nguyên
với 1 < a b < n. Rõ ràng ta phải có a hoặc b không vợt quá n .
Giả sử đó là a , khi đó ớc nguyên tố của a cũng chính là ớc nguyên tố của n.
Từ định lý trên, ta có thuật toán sau đây để tìm ra các số nguyên tố nhỏ hơn hoặc bằng
số n > 1 cho trớc.
2.2.6. Sàng Eratosthenes. Trớc tiên, ta viết dãy số từ 1 đến n . Trong dãy đó gạch đi số 1, vì
nó không phải là số nguyên tố. Số nguyên tố đầu tiên là 2. Tiếp đến ta gạch tất cả những số
trong dãy chia hết cho 2. Số đầu tiên không chia hết cho 2 là 3. Số 3 là số nguyên tố. Ta lại
gạch các số chia hết cho 3 còn lại trong dãy. Tiếp tục nh thế, ta gạch khỏi dãy những số chia
hết cho một trong các số nguyên tố bé hơn hoặc bằng n . Theo định lý trên, những số còn
lại của dãy không bị gạch là tất cả các số nguyên tố không vợt quá n. Thật vậy, những số
này không có ớc nguyên tố nhỏ hơn hoặc bằng căn bậc hai của nó, cho nên phải là số nguyên
tố.
Sàng Eratosthenes cho ta một thuật toán xác định mọi số nguyên tố không vợt quá
một số cho trớc. Tuy nhiên sẽ rất khó khăn khi ta phải làm việc với các số lớn. Nguyên nhân
là vì thuật toán có độ phức tạp quá lớn: ta phải thực hiện phép chia cho tất cả các số nguyên
tố không vợt quá căn n. Bây giờ ta hãy xét về độ phức tạp của thuật toán nói trên.

2.2.7. Thuật toán kiểm tra số nguyên tố trong Maple
Muốn kiểm tra một số có phải nguyên tố không ta dùng lệnh:
[>isprime(a);
Ví dụ :
[> isprime(289309129039);
false

[> isprime(3023057);

true

Lệnh sau đây đợc dùng để lấy số nguyên tố lớn nhất nhỏ hơn
số n cho trớc.
[> prevprime(n);
Ví dụ :


×