Prosti brojevi

1

Prosti brojevi

offline
  • igor86  Male
  • Stručni saradnik
    Web programiranje
  • Pridružio: 24 Maj 2006
  • Poruke: 1633

Hajde ovako.
Ko ima primjere programa, koji pronalaze proste brojeve. Naravno, nista lakse? Ali cemo ici ka tome da se uz kod programa stave i rezultati dobijeni uz njega. Ici ka brzini izvrsavanja programa.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Nemam ni jedan primer, ali evo jedne ideje. Prvo, osim 2, sve parne brojeve preskačeš pa inkrement u for/while petlji izgleda i+=2. Malo sam mozgao i stvarno mi ništa ne pada na pamet.



offline
  • Pridružio: 18 Dec 2003
  • Poruke: 7953
  • Gde živiš: Graceland

Najbolji algoritam je tzv. prosejavanje...

1 ne racunas, uzmes prvi sledeci:
2, odatle izbacujes svaki drugi: 4, 6, 8, 10..., uzimas prvi sledeci neizbaceni:
3, odatle izbacujes svako treci neizbaceni: 6, 9, 15... uzimas prvi sledeci:
5, izbacujes svaki peti...

offline
  • Pridružio: 16 Jun 2005
  • Poruke: 2392
  • Gde živiš: Beograd

@Leggy

To se zove eratostenovo sito, i meni je poznato kao najefikasniji algoritam. Moze se izvesti npr. ovako:

  1. #include <stdio.h>
  2.  
  3. void upis(int n,int *a){
  4. int i=2;
  5. for(;--n;a++,i++) *a=i;}
  6.  
  7. void sito(int n,int *a){
  8. int i=2,j,k=0,l=n;
  9. for(i=*a;--n;k++){
  10.    for(j=i;j<l;j+=i) *(a+j)=0;
  11.    if(*(a+k)) printf("%i ",*(a+k));}}
  12.  
  13. void main(){
  14. int n,a[100];
  15. scanf("%i",&n);
  16. upis(n,a);
  17. sito(n,a);
  18. }


Ovo ovako napamet...

offline
  • Pridružio: 23 Jan 2004
  • Poruke: 43

Davno sam još pisao o Eratostenovom situ ovde na forumu... Samo da nađem temu!

Evo je: [Link mogu videti samo ulogovani korisnici]
Koristan sadržaj: [Link mogu videti samo ulogovani korisnici]

Jedino što tad nisam dobrio pročitao temu, pa je ispalo da nije potrebno ovo, ali eto, može sad nekom poslužiti!

Dopuna: 08 Feb 2007 20:53

Citat:
Jump to: navigation, search

In mathematics, the sieve of Atkin is a fast, modern algorithm for finding all prime numbers up to a specified integer. It is an optimized version of the ancient sieve of Eratosthenes: the Atkin sieve does some preliminary work and then marks off multiples of primes squared, rather than multiples of primes.


[Link mogu videti samo ulogovani korisnici]

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Problem kod njega su veliki nizovi koji pre ili kasnije postanu poprilično praznjikavi, pa sam mislio da je bolje generisati ih (u letu).

offline
  • igor86  Male
  • Stručni saradnik
    Web programiranje
  • Pridružio: 24 Maj 2006
  • Poruke: 1633

Evo mog primjera

  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. main(){
  5.  
  6.    int n;
  7.    scanf("%i",&n);
  8.    int niz[n],i,j;
  9.    
  10.    // Punjenje niza
  11.    for(i=0; i <= n ; i++) {
  12.       niz[i] = 1;
  13.    }
  14.    
  15.    // Logika
  16.    for (i=2; i <= sqrt(n); i++ )
  17.       if (niz[i] == 1)
  18.          for (j=i; j <= (n / i);j++ )
  19.             niz[i*j] = 0;
  20.    
  21.    // Ispis
  22.    for(i=0; i <= n ; i++) {
  23.       if (niz[i] == 1)
  24.          printf("%d \n", i);
  25.    }
  26.  
  27. }


Jako brzo radi, samo hocu napraviti da radi na nivou bita, a ne na nivou byta.

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Napravi da je bool niz[n]. Malo manje zauzima a radi ono što ti treba.

offline
  • Pridružio: 23 Jan 2004
  • Poruke: 43

Koliko ja znam C nema bool kao tip podataka! Ali može da stavi byte...

  1. $ time ./prosti 1000000 > /dev/null
  2.  
  3. real    0m0.183s
  4. user    0m0.152s
  5. sys     0m0.008s
  6.  
  7.  
  8. $ time primes 1 1000000 > /dev/null
  9.  
  10. real    0m0.090s
  11. user    0m0.028s
  12. sys     0m0.000s


Program primes je program koji isto traži sve proste brojeve u intervalu i ispisuje ih. Iz ovog što sam priložio se vidi da primes radi brže, a on koristi Eratostenovo sito. Do duše primes koristi veliki broj prethodno izračunatih prostih brojeva, pa je vrlo verovatno da zbog toga brže radi, ali nisam se dublje upuštao u kod.

btw. modifikovao sam igorov program da prima n kao parametar radi lakšeg merenja.

offline
  • Pridružio: 21 Nov 2007
  • Poruke: 14

Svaki broj n deljiv je brojem 1, samim sobom i nekim brojem iz intervala od 2 do n div 2 ( pri cemu je div operacija celobrojnog deljenja).

Prema tome, n je deljivo sa [1],[2,n div 2],[n]

Prost broj p je broj koji je deljiv iskljucivo brojem 1 i samim sobom.

Prema tome, p je deljivo sa [1],[p]

Zadatak glasi:

Stampati sve proste brojeve od 1 do n, pri cemu n unosi korisnik.


Da bi smo resili ovaj zadatak moramo uvesti petlju koja ce da vrti sve prirodne brojeve od 1 do n.Algoritam potom za svaki prirodni broj iz tog intervala proverava da li taj konkretni prirodni broj ima bar jednog delitelja u intervalu od 2 do n div 2. Ukoliko postoji bar jedan delitelj u tom intervalu, za konkretan prirodni broj, broj nije prost. Ukoliko ne postoji ni jedan delitelj u intervalu od 2 do n div 2 broj je prost i mozemo izvrsiti njegovo stampanje.


(Operacija div u C++, oznacava se sa / samo sto se vrsi nad celobrojnim operandima.Operacija moduo u C++ je predstavljena simbolom %, i rezultat te operacije je ostatak celobrojnog deljenja nad operandima nad kojima se operacija izvrsava. Tako broj i ce biti deljiv brojem j ukoliko je ispunjen uslov i % j == 0 ).


  1. int main()
  2. {
  3.   int n;
  4.   cin>> n;
  5.   bool ind = false;
  6.   int i = 1;
  7.   while( i <= n )
  8.   {
  9.     if( i <=3 )
  10.        cout<< i;
  11.     int j=2;
  12.     while( j <= i/2 )
  13.         if(( i % j) != 0 )
  14.                j = j +1;
  15.         else
  16.                ind = true;
  17.     if ( ! ind )
  18.         cout<< i;
  19.     i = i+1;     
  20.   }
  21.   return 0;
  22. }       

Ko je trenutno na forumu
 

Ukupno su 987 korisnika na forumu :: 61 registrovanih, 3 sakrivenih i 923 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: acatomic, advokat84, amadeus, Apok, Banovo Brdo, Ben Roj, Black Luster Soldier, bojan581, bojanM84, bojcistv, Boris BM, boromir, BtR-45, burevestnik, BZ, Centauro, Chainsaw, chervoncy, d.arsenal321, Demi87, DJUNTA, doktor097, Dolinc, dozorni, Drugsparrow, Dzoni2412, ElvisP, france93, gregorxix, Igor Antonic, istina, Ivan001, jackreacher011011, lucko1, mackenzie, mdp92, Mi lao shu, MiG-29M2, MIKI63, Mskok, Natuzzi, nekdo, niksa517, NMNJ, NNPD, nobutado, Pekman, procesor, raso76, redstar72, Relixiran, skvara, Sr.Stat., Srki94, Toper, Zeljo980, zlaya011, zmajbre, Zrcalo, Žoržo, šakalakazu