You are on page 1of 6

Báo cáo bài tập lớn DSA chủ đề :

SỐ NGUYÊN TỐ
1.Định nghĩa
-Số nguyên tố (prime numbers) là số tự nhiên lớn hơn 1 và không thể được biểu diễn thành tích của hai
số tự nhiên nhỏ hơn khác 1 .

-Hợp số (Composite numbers) là số nguyên lớn hơn 1 và có nhiều hơn 2 ước.

VD: 5 là số nguyên tố vì 5 chỉ chia hết cho 1 và 5. Tuy nhiên, 6 là hợp số vì 6 chia hết cho 1, 2, 3 và 6.

2.Tính chất
- 2 là số nguyên tố chẵn duy nhất và nhỏ nhất.

- Không tồn tại số nguyên tố nào lớn hơn 5 có thể có chữ số tận cùng là 5.

- Tất cả các số nguyên tố lớn hơn các số nguyên tố đơn vị (2, 3, 5, 7) đều phải có tận cùng là 1, 3, 7 hoặc
9.

- Tích của hai số nguyên tố không bao giờ là một số chính phương.

- Ước tự nhiên nhỏ nhất (khác số 1) của 1 số tự nhiên là một số nguyên tố.

- Ước bé nhất (là số dương khác 1) của 1 hợp số b nào đó là một số nguyên tố không vượt quá căn bậc
hai của b.

- Tập hợp các số nguyên tố là vô hạn.

- Nếu tăng hoặc giảm 1 đơn vị ở một số nguyên tố lớn hơn 3 thì một trong hai kết quả sẽ luôn chia hết
cho 6.

- Viết 1 số thành tích của các os nguyên tố được gọi là phân tích nguyên tố của số đó và là sự phân tích
duy nhất.

3.Các phương pháp xác định số nguyên tố


a. Thuật toán “ngây thơ”
Ta sẽ duyệt hết tất cả các số từ 1 đến N và đếm số ước của N. Nếu số ước của N là 2 thì N là số nguyên
tố , nếu không thì N không là số nguyên tố

bool isPrime(int n) {
for (int i = 2; i < n; i++)
if (n % i == 0) {
// n chia hết cho số khác 1 và chính nó.
return false;
}
return n > 1;
}

Độ phức tạp của thuật toán: Độ phức tạp của thuật toán là O(N) do ta phải duyệt hết các số từ 1 đến N.

b. Một thuật toán tốt hơn


Xét hai số nguyên dương N và D thỏa mãn N chia hết cho D và D nhỏ hơn √ N . Khi đó N ∕ D phải lớn
hơn √ N . N cũng chia hết cho N ∕ D . Vì thế, nếu N có ước nhỏ hơn √ N thì N cũng có ước lớn hơn √ N
Do đó, ta chỉ cần duyệt đến √ N

bool isPrime(int n) {
for (int i = 2; i*i <= n; i++)
if (n % i == 0) return false;
return n > 1;
}

Độ phức tạp của thuật toán: Độ phức tạp của thuật toán là O(√ N ) do ta phải duyệt từ 1
đến √N

c. Sàng Eratosthenes (Sieve of Eratosthenes)


Sàng Eratosthenes dùng để tìm các số nguyên tố nhỏ hơn hoặc bằng số nguyên NN nào
đó. Nó còn có thể được sử dụng để kiểm tra một số nguyên nhỏ hơn hoặc bằng NN hay
không.

Nguyên lí hoạt động của sàng là vào mỗi lần duyệt, ta chọn một số nguyên tố và loại ra
khỏi sàng tất cả các bội của số nguyên tố đó mà lớn hơn số đó. Sau khi duyệt xong, các số
còn lại trong sàng đều là số nguyên tố.
Mã giả (Pseudo Code): dùng để tìm các số nguyên tố nhỏ hơn hoặc bằng N

Đánh dấu tất cả các số đều là số nguyên tố.

Với mỗi số nguyên tố nhỏ hơn √N đánh dấu các bội lớn hơn nó là số nguyên tố
void sieve(int N) {
bool isPrime[N+1];
for(int i = 0; i <= N;++i) {
isPrime[i] = true;
}
isPrime[0] = false;
isPrime[1] = false;
for(int i = 2; i * i <= N; ++i) {
if(isPrime[i] == true) {
// Mark all the multiples of i as composite numbers
for(int j = i * i; j <= N; j += i)
isPrime[j] = false;
}
}
}

Độ phức tạp của thuật toán:


Khi i = 2, vòng lặp trong lặp N/2 lần.
Khi i = 3, vòng lặp trong lặp N/3 lần.
Khi i = 5, vòng lặp trong lặp N/5 lần.

Độ phức tạp tổng : N.(1/2 + 1/3 + 1/5 + …) = O(NlogN).
d. Phân tích thừa số nguyên tố với sàng Eratosthenes
Đầu tiên hãy xem xét thuật toán phân tích ra thừa số nguyên tố trong O(√N).
vector<int> factorize(int n) {
vector<int> res;
for (int i = 2; i * i <= n; ++i) {
while (n % i == 0) {
res.push_back(i);
n /= i;
}
}
if (n != 1) {
res.push_back(n);
}
return res;
}

Tại mỗi bước ta phải tìm số nguyên tố nhỏ nhất mà N chia hết cho số đó. Do đó, ta phải
biến đổi sàng Eratosthenes để tìm được số mình mong muốn trong O(1).
int minPrime[n + 1];
for (int i = 2; i * i <= n; ++i) {
if (minPrime[i] == 0) { //if i is prime
for (int j = i * i; j <= n; j += i) {
if (minPrime[j] == 0) {
minPrime[j] = i;
}
}
}
}
for (int i = 2; i <= n; ++i) {
if (minPrime[i] == 0) {
minPrime[i] = i;
}
}

Bây giờ ta có thể phân tích một số ra thừa số nguyên tố trong O(logN).


vector<int> factorize(int n) {
vector<int> res;
while (n != 1) {
res.push_back(minPrime[n]);
n /= minPrime[n];
}
return res;
}

Điều kiện sử dụng phương pháp này là ta phải tạo được mảng có độ dài N phần tử.
Phương pháp này rất hữu ích khi ta phải phân tich nhiều số nhỏ ra thừa số nguyên tố. Ta
không cần thiết phải sử dụng phương pháp này trong mọi bài toán liên quan đến phân tích
một số ra thừa số nguyên tố. Ngoài ra, ta không thể sử dụng phương pháp này nếu N bằng
10   hay 10 2. Khi đó, ta chỉ có thể sử dụng thuật toán O(√N).
9 1

Tính chất thú vị: Nếu N= p 1q 1. p 2q 2… pnqn với p1,p2,…,pkp1,p2,…,pk là các số nguyên tố


thì N có (q1+1).(q2+1)…(qk+1)(q1+1).(q2+1)…(qk+1) ước phân biệt.
e. Sàng Eratosthenes trên đoạn
Đôi khi bạn phải tìm tất cả các số không phải trên đoạn [1;N] mà là trên
đoạn [L;R] với R lớn.
Điều kiện sử dụng phương pháp này là bạn có thể tạo mảng độ dài R−L+1 phần tử.
vector<bool> isPrime(R - L + 1, true); // x là số nguyên tố khi và chỉ khi
isPrime[x - l] == true

for (long long i = 2; i * i <= R; ++i) {


for (long long j = max(i * i, (L + i - 1) / i * i); j <= R; j += i) {
isPrime[j - L] = false;
}
}

if (1 >= L) { // Xét riêng trường hợp số 1


isPrime[1 - L] = false;
}

for (long long x = L; x <= R; ++x) {


if (isPrime[x - L]) {
// i là số nguyên tố
}
}

Độ phức tạp của thuật toán là O(√R∗k) với k à hằng số.

Lưu ý: Nếu bạn chỉ cần kiểm tra tính nguyên tố của một hay một vài số thì ta không nhất
thiết phải xây dựng sàng. Ta có thể sử dụng hàm sau để kiểm tra tính nguyên tố của một số.

bool isPrime(int n) {
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
}

// thuật toán xác suất kiểm tra xem 1 số có là số nguyên tố không


4. Ứng dụng của số nguyên tố
- Sử dụng trong mã hóa hoặc bảo mật cho công nghệ và internet
- Một số thuật toán mật mã hóa khóa công khai, chẳng hạn như RSA và trao đổi khóa
Diffie−Hellman được dựa trên số nguyên tố lớn (phổ biến nhất là số nguyên tố 2048 bit). RSA
dựa vào giả thiết rằng thực hiện phép nhân hai số lớn x và y dễ hơn nhiều so với khi tính x và y
(giả sử là hai số nguyên tố cùng nhau) nếu chỉ biết một tích xy.
-Số nguyên tố được sử dụng thường xuyên trong bảng băm.

Cũng như trong hàm băm, số nguyên tố được dùng trong kích thước của bảng băm dựa trên dò cấp hai
để đảm bảo rằng chuỗi dò bao phủ hết bảng đó.

Các ứng dụng khác:


+ Đại số trừu tượng: có thể đặt một số lượng số nguyên tố các điểm đó có kích thước lớn hay
dung để kiểm tra xem một đa thức có tối giản hay không dựa vào tính chia hết của các hệ số
cho một số nguyên tố và bình phương của nó.
+ Hình học: Có thể chia một đa giác lồi bất kỳ thành n đa giác lồi nhỏ hơn với diện tích và chu vi
bằng nhau khi n là lũy thừa của một số nguyên tố, nhưng chưa rõ tính chất này ra sao với các
giá trị khác của n.
+ Sinh học: Vòng đời của loài ve sầu Magicicada có mối liên hệ mật thiết tới số nguyên tố. Cụ
thể chu kỳ tiến hóa của loài này sẽ dành phần lớn thời gian sinh sống dưới dạng ấu trùng ở mặt
đất. Magicicada chỉ chui lên khỏi mặt đất sau 7, 13 hoặc 17 năm tiến hóa để biến thành ve sầu
và sinh sản sau đó chết sau vài tuần. Qua nhiều nghiên cứu, các nhà khoa đã học lý giải chu kỳ
sinh sản của loài ve sầu này có tính nguyên tố. Hay nói một cách dễ hiểu là chúng đã lên mặt
đất sinh sản đúng vào thời gian để tránh trùng khớp với chu kỳ của các loài động vật ăn thịt.
+Nghệ thuật: Trong thực tế, số nguyên tố cũng là một đề tài mang đến nhiều cảm hứng cho
nghệ thuật. Chúng chỉ là những con số khô khan nhưng đã nhiều lần trở thành đề tài để nhiều
văn nghệ sĩ sáng tác.

Ví dụ điển hình nhất đó chính là nhà soạn nhạc người Pháp Olivier Messiaen đã áp dụng số
nguyên tố để sáng tác những nhịp điệu độc đáo. Một số nhạc phẩm của ông lấy cảm hứng từ
số nguyên tố nổi tiếng có thể kể đến là La Nativité du Seigneur, Quatre études de rythme.
Bên cạnh đó cũng có nhiều nhà văn sử dụng những yếu tố liên quan tới số nguyên tố. Nhà văn
đã nhắc tới việc sử dụng tính nguyên tố để tạo ra mặt phẳng có ảnh hai chiều để liên lạc với
người ngoài hành tinh trong cuốn tiểu thuyết khoa học viễn tưởng Contact.

You might also like