1

Topic: Generate bilangan prima dengan algoritma Sieve of Eratosthenes

Bilangan prima adalah bilangan (>1) yang hanya habis dibagi oleh bilangan 1 dan bilangan itu sendiri, yakni: 2, 3, 5, 7, 11, 13, 17, ....

Untuk generate bilangan prima secara cepat, dapat dilakukan dengan menggunakan algo sieve of Eratosthenes, algo Eratosthenes ini cepet karena dia mengenerate bilangan prima dengan sebelumnya mencoret bilangan-bilangan yang bukan prima dan kelipatannya.

PunBB bbcode test

Untuk ilustrasi lebih mendatail mengenai cara kerjanya dapat dilihat lebih lengkap di http://en.wikipedia.org/wiki/Sieve_of_eratosthenes

Dibawah ini code generate bilangan prima yang < 10000000 dengan Sieve of Eratosthenes yang telah dimodifikasi, supaya lebih cepat.
Cara mempercepat:
- Coret semua yang habis dibagi 2 dengan operasi modulo
- Cek hanya untuk setengah dari kuadrat jumlah bilangan (jika akan mengenerate 10000 bilangan prima, tidak melakukan pemeriksaan dari 1-10000, tapi hanya dari 1-100 saja, karena jika bilangan awalnya bukan prima, maka kuadratnya juga pasti bukan prima)


/* Sieve of Eratosthenes + pruning++ , 3 times faster than Sieve of Erastosthenes*/
/* Displaying prime numbers lower than 10000000 */
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#define max1 10000000

long i,n,a,c,j; bool flag[max1];

int main()
{
    time_t begin = clock();
    c = sqrt(max1);
    flag[2] = true;
    for(i=3; i<=max1; i++) if(i%2==0) flag[i] = false; else flag[i] = true;
    for(i=2; i<=c; i++)
        if(flag[i]==true)
            for(j=i*i; j<max1; j+=i*2)
                flag[j] = false;
    for(i=2; i<=max1; i++)
        if(flag[i]==true) printf ("%ld\n", i);

    printf("%lf secs", double(clock()-begin) / CLOCKS_PER_SEC);

    return 0;
}

Last edited by StevenLuck (2009-07-22 16:23:46)