Giới thiệu
Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số kiến thức cơ bản xung quanh số nguyên tố.
Một số tự nhiên p (p > 1) là số nguyên tố nếu p có đúng 02 ước số là 1 và p.
Ví dụ các số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23, …
Chúng ta cùng nhau thực hiện một số giải thuật cơ bản bằng ngôn ngữ Java để giải quyết các bài toán con sau:
- Kiểm tra xem một số tự nhiên
ncó phải là số nguyên tố hay không.
- Liệt kê các số nguyên tố nằm trong phạm vi
[1, n].
Kiểm tra tính nguyên tố
Giải thuật thứ nhất
Ý tưởng giải thuật
Chúng ta kiểm tra xem có tồn tại một số nguyên k (2 ≤ k ≤ n – 1) mà k là ước của n (n chia hết cho k) thì n không phải là số nguyên tố, ngược lại n là số nguyên tố.
Trên thực tế ta chỉ cần kiểm tra k từ 2 đến √n là được.
Bước 1.
Chúng ta tạo một Java Project trong Eclipse IDE và đặt tên là JavaAlgorithmBasicProject.
Chúng ta tiếp tục tạo package main và class Main.java cùng phương thức main() mặc định.

Bước 2.
Chúng ta tạo package algorithm và class SoNguyenTo.java.
Chúng ta tiếp tục tạo phương thức kiemTraSNTFirst() với:
- Tham số cho phương thức này là một số tự nhiên
n.
- Kiểu dữ liệu trả về là
boolean. Phương thức trả về kết quả: (i)truenếunlà số nguyên tố; (ii)falsenếu ngược lại.

Bước 3.
Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Những kỹ thuật lập trình cần chú ý:
- Phương thức để tính căn bậc 2 của một số tự nhiên n là
Math.sqrt().
- Phương thức để lấy phần nguyên của một số thập phân là
Math.round().
- Thư viện
Mathđịnh nghĩa các phương thức dùng tính toán các biểu thức toán học cơ bản. Các phương thức này đều là tĩnh nên được gọi trực tiếp bằng cú phápMath.phương_thức().
Bước 4.
Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTFirst() trong class Main.java như sau:

Bước 5.
Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai
Ý tưởng giải thuật
Chúng ta sẽ chỉ kiểm tra các số k có tính chất giống với một trong hai tính chất cơ bản sau của số nguyên tố:
- Trừ số 2 và các số nguyên tố là số lẻ.
- Trừ số 2, 3, các số nguyên tố có dạng
6k ± 1(vì số có dạng6k ± 2thì chia hết cho 2, số có dạng6k ± 3thì chia hết cho 3).
Bước 1.
Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Bước 2.
Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTSecond() trong class Main.java như sau:

Bước 3.
Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Liệt kê các số nguyên tố trong đoạn [1, N]
Giải thuật thứ nhất
Ý tưởng giải thuật
Chúng ta lần lượt xem xét các số m trong đoạn [1, n], rồi kiểm tra tính nguyên tố của m.
Bước 1.
Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Những kỹ thuật lập trình cần chú ý:
- Java cung cấp cho chúng ta một số kiểu dữ liệu lưu trữ tập hợp các phần tử bên cạnh kiểu dữ liệu mảng. Chúng ta thường sử dụng một số dạng sau: (i)
Listđể lưu trữ không giới hạn các phần tử có thể trùng nhau; (ii)Setđể lưu trữ không giới hạn các phần tử không trùng nhau; (ii)Mapđể lưu trữ không giới hạn các phần tử theo từng cặp . Chúng ta sẽ dần tìm hiểu cụ thể hơn trong những bài tiếp theo.
- Java cung cấp một phương pháp để xác định kiểu dữ liệu cho toàn bộ các phần tử trong danh sách: định nghĩa ngay từ ban đầu kiểu dữ liệu trong cặp dấu
<>. Ví dụ ở đây làList.
- Với tham số là một biến riêng lẻ, giá trị của tham số sẽ không bị thay đổi sau khi thực hiện phương thức.
- Với tham số là một danh sách, các phần tử của danh sách có thể bị thay đổi sau khi thực hiện phương thức.
Bước 2.
Chúng ta thực hiện thử nghiệm phương thức lietKeSNTFirst() trong class Main.java như sau:

Những kỹ thuật lập trình cần chú ý:
- Java cung cấp các dạng
Listkhác nhau để chúng ta sử dụng tùy theo trường hợp: (i)ArrayListđược sử dụng khi không quan tâm đến thứ tự trước sau của các phần tử; (ii)LinkedListđược sử dụng khi quan tâm đến thứ tự trước sau của các phần tử.
- Kiểu dữ liệu của các phần tử trong
Listđã được khai báo ban đầu thì không cần khai báo đối vớiArrayList<>.
- Số lượng phần tử của một danh sách là không giới hạn nên không cần khai báo trước số lượng phần tử ban đầu.
Bước 3.
Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai
Ý tưởng giải thuật
Chúng ta áp dụng sàng Eratosthenes (https://vi.wikipedia.org/wiki/S%C3%A0ng_Eratosthenes ) để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên n:
Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,…, n).
Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.
Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.
Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p. Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.
Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.
Bước 1.
Chúng ta thực hiện giải thuật bằng ngôn ngữ Java như sau:

Bước 2.
Chúng ta thực hiện thử nghiệm phương thức lietKeSNTSecond() trong class Main.java như sau:

Bước 3.
Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết
Trong bài này, chúng ta đã cùng nhau tìm hiểu một số giải thuật cơ bản xung quanh số nguyên tố và thực hiện bằng ngôn ngữ Java.
Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.
























































