Na stronie Centralnej Komisji Egzaminacyjnej ( CKE ) możemy znaleźć wykaz algorytmów, których znajomość jest wymagana. Ostatnio pisałem na temat algorytmu, który sprawdza, czy dana liczba jest liczbą pierwszą. Wpis postanowiłem udostępnić na wykop.pl i zauważyłem, że wywołał on dyskusję, mimo że nie wypadł pozytywnie pod kątem ocen ( 3x wykop / 8x zakop ) ale akurat to mało istotne. Dziś poruszę kolejny algorytm jakim jest umiejętność rozkładu danej liczby na czynniki pierwsze.
Algorytm został przygotowany na liczby, przy których komputer się nie napoci- jeżeli jesteś naprawdę dobry w te klocki pozostaw w komentarzu swoją opinię ale oprócz tego lepszy, bądź ciekawszy sposób rozwiązania, który będzie dobry dla komputera przy obliczaniu nawet 3^758930-2.
Zaczynając od teorii …
Rozkład liczby naturalnej na czynniki pierwsze jest bardzo złożony obliczeniowo, co stanowi podstawę kryptografii asymetrycznej (patrz np. klucz RSA).”
2.Jeżeli n>1 wtedy
zmienna pomocnicza i=1
dopóki i<=pierwiastek kwadratowy z n
dopóki !(n mod i)
wypisz „i * ”
jeżeli n=1 przerwij, a i zwiększ o 1
w przeciwnym wypadku
wypisz „niewłaściwe dane” i zakończ algorytm
#include <iostream> #include <math.h> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { unsigned long n; cout << "Rozklad liczby naturalnej na czynniki pierwszen" "Podaj n = "; cin >> n; cout << endl; if (n > 1) { cout << n << " = "; int i = 2; while (i <= (unsigned long)sqrt((double)n)) { while (!(n % i)) { n /= i; cout << i << " x "; } if (n == 1) break; i ; } if (n > 1) cout << n; } else cout << "Niewlasciwe danen"; cout << endl << endl; system("PAUSE"); return 0; }