Rozkład liczby na czynniki pierwsze
Dowiedz się jak rozłożyć dowolną liczbę całkowitą na iloczyn jej najmniejszych dzielników (czynników pierwszych).
Rozkład na czynniki pierwsze (Faktoryzacja)
Zgodnie z podstawowym twierdzeniem arytmetyki, każdą liczbę złożoną można przedstawić w postaci iloczynu liczb pierwszych. Ten proces nazywamy rozkładem na czynniki pierwsze lub faktoryzacją.
Na przykład:
12 = 2 * 2 * 3100 = 2 * 2 * 5 * 513 = 13(liczba pierwsza ma tylko jeden czynnik – samą siebie)
Rozkład przydaje się w wielu zadaniach maturalnych, do znajdowania NWD/NWW w pamięci, upraszczania ułamków i łamania prostych szyfrów.
Jak działa algorytm?
Sposób działania jest bardzo naturalny – przypomina ręczne dzielenie kreską na lekcjach matematyki.
- Zaczynamy od najmniejszej możliwej liczby pierwszej:
i = 2. - Dopóki nasza liczba
ndzieli się przezibez reszty:- Wypisujemy
i(znaleźliśmy czynnik!). - Dzielimy
nprzezii przypisujemy wynik z powrotem don.
- Wypisujemy
- Jeśli
nnie dzieli się już przezi, to zwiększamyio 1 (czyli sprawdzamy kolejną potencjalną liczbę pierwszą). - Pętlę przerywamy, gdy sprawdziliśmy już dzielniki do pierwiastka z
n. Jeśli na sam koniecnjest większe od 1, oznacza to, że ostatnim, największym czynnikiem jest samo pozostałen(np. przypadek liczby pierwszej).
Dzięki zastosowaniu sprawdzania tylko do pierwiastka z n (identycznie jak w algorytmie na sprawdzanie liczby pierwszej), osiągamy świetną złożoność O(√n).
Kod Algorytmu
Python
def rozklad(n):
czynniki = []
i = 2
# Sprawdzamy dzielniki do pierwiastka z n
while i * i <= n:
# Dopóki n dzieli się przez i, to 'i' jest naszym czynnikiem
while n % i == 0:
czynniki.append(i) # Zapisujemy czynnik
n = n // i # Dzielimy n przez i
i += 1
# Jeśli na końcu zostało nam n większe od 1,
# to jest to ostatni czynnik (liczba pierwsza).
if n > 1:
czynniki.append(n)
return czynniki
# Testowanie
print(f"Czynniki 100: {rozklad(100)}")
print(f"Czynniki 13: {rozklad(13)}")C++
#include <iostream>
using namespace std;
void rozklad(int n) {
cout << "Czynniki liczby " << n << ": ";
int i = 2;
// Sprawdzamy dzielniki do pierwiastka
while (i * i <= n) {
while (n % i == 0) {
cout << i << " ";
n = n / i;
}
i++;
}
// Jeśli z liczby zostało coś większego niż 1, wypisujemy
if (n > 1) {
cout << n << " ";
}
cout << endl;
}
int main() {
rozklad(100);
rozklad(13);
return 0;
}[!TIP] Dla dociekliwych: Gdzie omijanie liczb złożonych? Może zastanawiać Cię, dlaczego zwiększając w pętli
io 1 (czylii++), sprawdzamy po drodze liczby takie jak 4, 6 czy 8. Przecież czynniki mają być pierwsze! Otóż algorytm automatycznie się przed tym zabezpiecza. Zanimiosiągnie wartość 4, my już całkowicie i do oporu podzieliliśmy naszą liczbęnprzez 2 w pętliwhile. Więc kiedyi=4, tonna sto procent przez 4 się już nie podzieli! Kod sam "omija" działanie dla liczb złożonych, bo ich czynniki pierwsze zostały wyciągnięte znjuż wcześniej.
