Algorytm liczby pierwsze
Algorytm liczby pierwsze
Prosiłbym o podpowiedzi/rozwiązanie do następującego zadania: Algorytm wypisujący liczby pierwsze, których iloczyn jest równy zadanej liczbie \(\displaystyle{ n>0}\)
Ostatnio zmieniony 11 mar 2011, o 16:37 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Powód: Poprawa wiadomości.
-
- Użytkownik
- Posty: 5101
- Rejestracja: 11 mar 2011, o 16:31
- Płeć: Mężczyzna
- Lokalizacja: 52°16'37''N 20°52'45''E
- Podziękował: 4 razy
- Pomógł: 1001 razy
Algorytm liczby pierwsze
Gdybym umiał napisać program, który szybko rozkłada liczbę na czynniki pierwsze, to raczej nie chwaliłbym się tym na forum, tylko bym korzystał. Dlatego nie licz na satysfakcjonującą odpowiedź.
Na szczęście jest spora szansa że nikt nie potrafi, więc nasze pieniądze w bankach wydają się bezpieczne.
Na szczęście jest spora szansa że nikt nie potrafi, więc nasze pieniądze w bankach wydają się bezpieczne.
-
- Użytkownik
- Posty: 52
- Rejestracja: 24 maja 2010, o 21:36
- Płeć: Mężczyzna
- Lokalizacja: Gdańsk
- Podziękował: 14 razy
- Pomógł: 2 razy
Algorytm liczby pierwsze
Skoro masz napisać algorytm, a nie program, to wielkość \(\displaystyle{ n}\) nie ma znaczenia.
Tak więc podpowiedź Afisha + Google i tyle.
Tak więc podpowiedź Afisha + Google i tyle.
Algorytm liczby pierwsze
Eratostenesowym sitkiem wycedziłem liczby pierwsze do pierwiastka z N
Korzystając z sita sprawdzam podzielność tylko przez liczby pierwsze < sqrt(N)
Jeżeli nie dzieli się przez żadną z nich to znaczy, że N jest liczbą pierwszą
Jeżeli znalazłem liczbę K przez którą N się dzieli, sprawdzam czy N/K jest liczbą pierwszą
W teście na pierwszość oczywiście korzystam z utworzonego już sita jako źródła podzielników
Na ideone.com 1000 razy test(4294049777) zająło 0,2 sekundy
1000 razy test(1073217479) 0,1 sekundy mHNVQ
Korzystając z sita sprawdzam podzielność tylko przez liczby pierwsze < sqrt(N)
Jeżeli nie dzieli się przez żadną z nich to znaczy, że N jest liczbą pierwszą
Jeżeli znalazłem liczbę K przez którą N się dzieli, sprawdzam czy N/K jest liczbą pierwszą
W teście na pierwszość oczywiście korzystam z utworzonego już sita jako źródła podzielników
Na ideone.com 1000 razy test(4294049777) zająło 0,2 sekundy
1000 razy test(1073217479) 0,1 sekundy mHNVQ
Algorytm liczby pierwsze
a co z np. 999974077=15161*65957Afish pisze:Można też tym
Brent trochę to ulepszył, rzadziej rozkłada ręce.
Wtedy czasem rho pomaga ale czy zawsze?-- 14 marca 2011, 01:23 --Testowanie pierwszości można zrealizować np. tak:
Kod: Zaznacz cały
int CzyPierwsza(int n){ // zwraca 1 jeżeli N jest liczbą pierwszą
// bez mnożenia i dzielenia !!!
int a,b,k=n-1,s=n-1, z=n-2;
while(z>1){
a=s;k=0;b=z;
while(b){
if(b&1){
k+=a;
if(k>=n) k-=n;
}
a+=a;
if(a>=n) a-=n;
b>>=1;
}
if(k==0) return 0;
s=k;
z--;
}
return k+1==n;
}