Professional Documents
Culture Documents
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 .
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.
- 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.
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.
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
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
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;
}
}
}
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;
}
}
Đ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
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;
}
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 đó.
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.