Rozkład na czynniki pierwsze

Rozłożenie liczby na czynniki pierwsze polega na zapisaniu jej w postaci iloczynu liczb pierwszychliczba pierwszaliczb pierwszych (np. 46 = 2 23). Już od starożytności wiadomo, że każda liczba naturalna większa niż jeden jest albo liczbą pierwszą, albo iloczynem liczb pierwszych (czyli tak zwaną liczbą złożonąliczba złożonaliczbą złożoną).

Metodę rozkładu liczby na czynniki pierwsze poznajemy już w szkole podstawowej, niedługo po opanowaniu tabliczki mnożenia. Jeśli chcesz przypomnieć sobie ten algorytm, zapoznaj się z e‑materiałem FaktoryzacjaPZeBttEDvFaktoryzacja.

Realizacja algorytmu w języku w C++

Napiszemy w języku C++ program rozkładający liczbę naturalną na czynniki pierwsze.

Specyfikacja problemu:

Dane:

  • liczba – liczba do rozłożenia na czynniki pierwsze; liczba naturalna większa od 1

Wynik:

Program wypisuje wszystkie czynniki pierwsze liczby liczba w jednym wierszu, po przecinku.

Zaczniemy od zdefiniowania zmiennej typu int. Użyjemy jej do przechowania wartości liczby rozkładanej na czynniki.

Linia 1. int liczba znak równości 24 średnik.

Następnie utworzymy pętlę for. Będzie ona działać aż do momentu, w którym zmienna liczba będzie równa 1. W pętli deklarujemy zmienną czynnik, która będzie oznaczała kolejne rozpatrywane przez nas potencjalne czynniki pierwsze. Będzie ona inkrementowana w każdej iteracji. Jej wartością początkową jest 2, ponieważ jest to najmniejsza liczba pierwsza.

Linia 1. for otwórz nawias okrągły int czynnik znak równości 2 średnik liczba zamknij nawias ostrokątny 1 średnik plus plus czynnik zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. zamknij nawias klamrowy.

Wewnątrz pętli for umieścimy pętlę while. Pętla while wykonuje się, dopóki reszta z dzielenia zmiennej liczba przez czynnik wynosi 0 (czyli dopóki zmienna czynnik jest podzielnikiem rozkładanej liczby).

Linia 1. for otwórz nawias okrągły int czynnik znak równości 2 średnik liczba zamknij nawias ostrokątny 1 średnik plus plus czynnik zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. while otwórz nawias okrągły liczba procent czynnik znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. cout otwórz nawias ostrokątny otwórz nawias ostrokątny czynnik otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów przecinek cudzysłów średnik. Linia 4. liczba prawy ukośnik znak równości czynnik średnik. Linia 5. zamknij nawias klamrowy. Linia 6. zamknij nawias klamrowy.

Mamy zatem program, który rozłoży daną liczbę na czynniki pierwsze:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. int liczba znak równości 24 średnik. Linia 8. for otwórz nawias okrągły int czynnik znak równości 2 średnik liczba zamknij nawias ostrokątny 1 średnik plus plus czynnik zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. while otwórz nawias okrągły liczba procent czynnik znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. cout otwórz nawias ostrokątny otwórz nawias ostrokątny czynnik otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów przecinek cudzysłów średnik. Linia 11. liczba prawy ukośnik znak równości czynnik średnik. Linia 12. zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy. Linia 14. zamknij nawias klamrowy.

Możemy jednak stworzyć bardziej optymalny algorytm. Zauważmy, że nie jest konieczne sprawdzanie wszystkich czynników, aż wartość liczba wyniesie 1.

Każda liczba złożona, ma maksymalnie jeden czynnik pierwszy większy od jej pierwiastka.

Przykład 1

Liczba 27, po rozkładzie na czynniki pierwsze, to 333. Żaden z czynników zatem nie jest większy od pierwiastka tej liczby, wynoszącego 5,196...

Przykład 2

Pierwiastek liczby 14 to 3,74..., a liczba ta po faktoryzacji to 27. Widzimy zatem, że tylko jeden czynnik pierwszy jest większy od jej pierwiastka.

W związku z tą obserwacją, możemy przerwać iterację w momencie, gdy czynnik podniesiony do kwadratu będzie większy od wartości liczba. Na końcu wypiszemy wartość zmiennej liczba, jeżeli jest ona większa od 1.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. int liczba znak równości 24 średnik. Linia 8. for otwórz nawias okrągły int czynnik znak równości 2 średnik czynnik asterysk czynnik otwórz nawias ostrokątny znak równości liczba średnik plus plus czynnik zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. while otwórz nawias okrągły liczba procent czynnik znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. cout otwórz nawias ostrokątny otwórz nawias ostrokątny czynnik otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów przecinek cudzysłów średnik. Linia 11. liczba prawy ukośnik znak równości czynnik średnik. Linia 12. zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy. Linia 15. if otwórz nawias okrągły liczba wykrzyknik znak równości 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. cout otwórz nawias ostrokątny otwórz nawias ostrokątny liczba średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy.

Słownik

faktoryzacja
faktoryzacja

rozkład liczby na czynniki pierwsze, czyli zapisanie dowolnej liczby naturalnej większej od 1 za pomocą iloczynu liczb pierwszych

liczba pierwsza
liczba pierwsza

liczba naturalna większa od 1, która ma tylko dwa dzielniki, dzieli się tylko przez 1 oraz przez samą siebie

liczba złożona
liczba złożona

liczba naturalna większa od 1 będąca iloczynem liczb pierwszych