Saringan Algoritma Eratosthenes: Python, C++ Example

Saringan Eratosthenes merupakan saringan bilangan prima yang paling sederhana. Ini merupakan algoritma bilangan prima untuk mencari semua bilangan prima dalam limit tertentu. Ada beberapa saringan bilangan prima. Misalnya- Saringan Eratosthenes, Saringan Atkin, Saringan Sundaram, dll.

Kata "saringan” artinya alat yang menyaring zat. Jadi, algoritma saringan di Python dan bahasa lain mengacu pada algoritma untuk menyaring bilangan prima.

Algoritma ini menyaring bilangan prima dengan pendekatan berulang. Proses penyaringan dimulai dengan bilangan prima terkecil. Bilangan prima adalah bilangan asli yang lebih besar dari 1 dan hanya memiliki dua pembagi, yaitu 1 dan bilangan itu sendiri. Bilangan yang bukan bilangan prima disebut bilangan komposit.

Dalam saringan metode Eratosthenes, bilangan prima kecil dipilih terlebih dahulu, dan semua kelipatannya disaring. Prosesnya berjalan berulang-ulang dalam rentang tertentu.

Sebagai contoh:

Mari kita ambil rentang angka dari 2 hingga 10.

Saringan Algoritma Eratosthenes

Setelah menerapkan Saringan Eratosthenes, itu akan menghasilkan daftar bilangan prima 2, 3, 5, 7

Saringan Algoritma Eratosthenes

Saringan Algoritma Eratosthenes

Berikut algoritma Saringan Eratosthenes:

Langkah 1) Buatlah daftar angka dari 2 hingga rentang n yang diberikan. Kita mulai dengan 2 karena merupakan angka prima pertama dan terkecil.

Langkah 2) Pilih angka terkecil pada daftar, x (awalnya x sama dengan 2), telusuri daftar tersebut, dan saring angka komposit yang sesuai dengan menandai semua kelipatan angka yang dipilih.

Langkah 3) Kemudian pilih bilangan prima berikutnya atau bilangan terkecil yang tidak diberi tanda pada daftar dan ulangi langkah 2.

Langkah 4) Ulangi langkah sebelumnya hingga nilai x lebih kecil atau sama dengan akar kuadrat dari n (x<=Saringan Algoritma Eratosthenes).

Catatan: Alasan matematisnya cukup sederhana. Kisaran bilangan n dapat difaktorkan sebagai-

n=a*b

Sekali lagi, n =Saringan Algoritma Eratosthenes*Saringan Algoritma Eratosthenes

= (faktor lebih kecil dari Saringan Algoritma Eratosthenes) * (faktor lebih besar dari Saringan Algoritma Eratosthenes)

Jadi setidaknya salah satu darinya faktor utama atau keduanya harus <=Saringan Algoritma Eratosthenes. Jadi, melintasi ke Saringan Algoritma Eratosthenes akan cukup.

Langkah 5) Setelah keempat langkah tersebut, angka-angka tak bertanda yang tersisa akan menjadi semua bilangan prima pada rentang n yang diberikan.

Contoh:

Mari kita ambil contoh dan lihat cara kerjanya.

Untuk contoh ini, kita akan mencari daftar bilangan prima dari 2 hingga 25. Jadi, n=25.

Langkah 1) Pada langkah pertama, kita akan mengambil daftar angka dari 2 hingga 25 karena kita memilih n=25.

Saringan Algoritma Eratosthenes

Langkah 2) Kemudian kita pilih angka terkecil pada daftar, x. Awalnya x=2 karena merupakan bilangan prima terkecil. Kemudian kita menelusuri daftar dan menandai kelipatan 2.

Kelipatan 2 untuk nilai n yang diberikan adalah: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24.

Saringan Algoritma Eratosthenes

Catatan: Warna biru menunjukkan nomor yang dipilih, dan warna merah muda menunjukkan kelipatan yang dihilangkan

Langkah 3) Kemudian kita pilih bilangan terkecil berikutnya yang belum diberi tanda, yaitu 3, dan ulangi langkah terakhir dengan menandai kelipatan 3.

Saringan Algoritma Eratosthenes

Langkah 4) Kami ulangi langkah 3 dengan cara yang sama sampai x=Saringan Algoritma Eratosthenes atau 5.

Saringan Algoritma Eratosthenes

Langkah 5) Angka sisanya yang tidak diberi tanda adalah bilangan prima dari 2 sampai 25.

Saringan Algoritma Eratosthenes

Kode Semu

Begin
	Declare a boolean array of size n and initialize it to true
	For all numbers i : from 2 to sqrt(n)
     		IF bool value of i is true THEN
         			i is prime
         			For all multiples of i (i<n)
             			mark multiples of i as composite
Print all unmarked numbers
End

Saringan Eratosthenes C/C++ Contoh kode

#include <iostream>
#include <cstring>
using namespace std;
void Sieve_Of_Eratosthenes(int n)
{
    // Create and initialize a boolean array
    bool primeNumber[n + 1];
    memset(primeNumber, true, sizeof(primeNumber));
    for (int j = 2; j * j <= n; j++) {
        if (primeNumber[j] == true) {
            // Update all multiples of i as false
            for (int k = j * j; k <= n; k += j)
                primeNumber[k] = false;
        }
    } 
    for (int i = 2; i <= n; i++)
        if (primeNumber[i])
            cout << i << " ";
}
int main()
{
    int n = 25;
    Sieve_Of_Eratosthenes(n);
    return 0;
} 

Keluaran:

2 3 5 7 11 13 17 19 23

Saringan Eratosthenes Python Contoh Program

def SieveOfEratosthenes(n):
# Create a boolean array
	primeNumber = [True for i in range(n+2)]
	i = 2
	while (i * i <= n):
		if (primeNumber[i] == True):
			# Update all multiples of i as false
			for j in range(i * i, n+1, i):
				primeNumber[j] = False
		i += 1
	for i in range(2, n):
		if primeNumber[i]:
			print(i)
n = 25
SieveOfEratosthenes(n)

Keluaran:

2
3
5
7
11
13
17
19
23

Saringan Tersegmentasi

Kita telah melihat bahwa Saringan Eratosthenes diperlukan untuk menjalankan loop melalui seluruh rentang angka. Jadi, dibutuhkan ruang memori O(n) untuk menyimpan angka-angka tersebut. Situasinya menjadi rumit ketika kita mencoba menemukan bilangan prima dalam rentang yang sangat besar. Tidak mungkin untuk mengalokasikan ruang memori yang begitu besar untuk n yang lebih besar.

Algoritma ini dapat dioptimalkan dengan memperkenalkan beberapa fitur baru. Idenya adalah membagi rentang angka menjadi segmen yang lebih kecil dan menghitung bilangan prima dalam segmen tersebut satu per satu. Ini adalah cara yang efisien untuk mengurangi kompleksitas ruang. Metode ini disebut saringan tersegmentasi.

Optimasi dapat dicapai dengan cara berikut:

  1. Gunakan saringan sederhana untuk mencari bilangan prima dari 2 sampai Saringan Tersegmentasi dan menyimpannya dalam array.
  2. Bagilah rentang [0…n-1] menjadi beberapa segmen dengan ukuran paling banyak Saringan Tersegmentasi
  3. Untuk setiap segmen, ulangi melalui segmen tersebut dan tandai kelipatan bilangan prima yang ditemukan pada langkah 1. Langkah ini memerlukan O(Saringan Tersegmentasi) maksimal.

Saringan biasa memerlukan ruang memori tambahan O(n), sedangkan saringan tersegmentasi memerlukan O(Saringan Tersegmentasi), yang merupakan peningkatan besar untuk n yang besar. Metode ini juga memiliki kekurangan karena tidak meningkatkan kompleksitas waktu.

Analisis Kompleksitas

Kompleksitas Ruang:

Saringan sederhana algoritma eratosthenes membutuhkan ruang memori O(n). Dan saringan tersegmentasi membutuhkan
O(Analisis Kompleksitas) ruang tambahan.

Kompleksitas Waktu:

Kompleksitas waktu dari algoritma saringan eratosthenes reguler adalah O(n*log(log(n))). Alasan di balik kompleksitas ini dibahas di bawah ini.

Untuk bilangan n tertentu, waktu yang diperlukan untuk menandai bilangan komposit (yaitu, bilangan nonprima) adalah konstan. Jadi, jumlah kali loop dijalankan sama dengan-

n/2 + n/3 + n/5 + n/7 + ……∞

= n * (1/2 + 1/3 + 1/5 + 1/7 +…….∞)

Perkembangan harmonik dari jumlah bilangan prima dapat dikurangkan sebagai log(log(n)).

(1/2 + 1/3 + 1/5 + 1/7 +…….∞) = log(log(n))

Jadi, kompleksitas waktunya akan menjadi-

T(n) = n * (1/2 + 1/3 + 1/5 + 1/7 + ……∞)

= n * catatan(catatan(n))

Oleh karena itu kompleksitas waktunya adalah O(n * log(log(n)))

Selanjutnya, Anda akan mempelajari tentang Segitiga Pascal

Ringkasan

  • Saringan Eratosthenes menyaring bilangan prima dalam batas atas tertentu.
  • Pemfilteran suatu bilangan prima dimulai dari bilangan prima terkecil yaitu “2”. Hal ini dilakukan secara berulang.
  • Iterasi dilakukan hingga akar kuadrat dari n, dimana n adalah rentang bilangan yang diberikan.
  • Setelah perulangan tersebut, bilangan yang tersisa adalah bilangan prima.