Faktorizace je proces převedení čísla na součin jeho faktorů, čili rozklad na prvočísla. Rozklad je dle základní věty aritmetiky jednoznačný. Předpokládá se, že faktorizace není jednoduchý problém, na čemž je založena bezpečnost některých šifrovacích algoritmů (například RSA). Prvočíselný rozklad má také využití při výpočtu největšího společného dělitele a nejmenšího společného násobku. Obě tyto hodnoty lze ovšem lépe vypočíst pomocí Euklidova algoritmu.
Příklady
Složitost faktorizace
Častou nejasností ohledně faktorizace je její složitost. Pokud se podíváme na klasický algoritmus, který postupně zkouší dělit číslo až do odmocniny, tak by se zdálo, že je složitost polynomiální (odmocnina). Toto ovšem není pravda, protože se složitost počítá na základě velikosti dat, což není velikost čísla v desítkové soustavě, ale počet míst nutných k zakódování čísla v binární soustavě. Skutečná složitost algoritmu je proto exponenciální.
Kód
01.
/**
02.
* Rozloží číslo n >= 2 na prvočíselné součinitele.
03.
* Součinitele vypíše na obrazovku (do konzole).
04.
*
05.
* @param n číslo, které chceme faktorizovat, n >= 2
06.
*/
07.
public
static
void
faktorizuj(
int
n) {
08.
09.
int
zbytek = n;
10.
for
(
int
i =
2
; i <= Math.sqrt(zbytek); i++) {
11.
// Pokud jsme vyzkoušeli všechna čísla menší než odmocnina ze zbytku
12.
// a žádné z nich nedělilo zbytek, je zbytek prvočíslo a můžeme
13.
// ho rovnou vypsat.
14.
15.
// Jinak zkoušíme dělit dalším potenciálním prvočinitelem, dokud
16.
// se to daří.
17.
while
(zbytek % i ==
0
) {
18.
zbytek = zbytek / i;
19.
System.out.print(i +
" "
);
20.
}
21.
}
22.
// Pokud je zbytek větší než 1, pak je to prvočíslo,
23.
// které je třeba vypsat také.
24.
if
(zbytek >
1
) {
25.
System.out.print(zbytek);
26.
}
27.
}
01.
/**
02.
* Rozlozi cislo n >= 2 na prvociselne soucinitele.
03.
* Soucinitele vypise na obrazovku (do konzole).
04.
*
05.
* @param n císlo, ktere chceme faktorizovat, n >= 2
06.
*/
07.
void
faktorizuj(
int
n) {
08.
09.
int
zbytek = n;
10.
for
(
int
i = 2; i <=
sqrt
(zbytek); i++) {
11.
// Pokud jsme vyzkouseli vsechna cisla mensi nez odmocnina ze zbytku
12.
// a zadne z nich nedelilo zbytek, je zbytek prvocislo a muzeme
13.
// ho rovnou vypsat.
14.
15.
// Jinak zkousime delit dalsim potencialním prvoèinitelem, dokud
16.
// se to dari.
17.
while
(zbytek % i == 0) {
18.
zbytek = zbytek / i;
19.
cout << i <<
" "
;
20.
}
21.
}
22.
// Pokud je zbytek vetsi nez 1, pak je to prvocislo,
23.
// ktere je treba vypsat take.
24.
if
(zbytek > 1) {
25.
cout << zbytek;
26.
}
27.
}
01.
/**
02.
* Rozlozi cislo n >= 2 na prvociselne soucinitele.
03.
* Soucinitele vypise na obrazovku (do konzole).
04.
*
05.
* @param $n cislo, ktere chceme faktorizovat, n >= 2
06.
*/
07.
function
faktorizuj(
$n
) {
08.
09.
$zbytek
=
$n
;
10.
for
(
$i
= 2;
$i
<= sqrt(
$zbytek
);
$i
++) {
11.
// Pokud jsme vyzkouseli vsechna cisla mensi nez odmocnina ze zbytku
12.
// a zadne z nich nedelilo zbytek, je zbytek prvocislo a muzeme
13.
// ho rovnou vypsat.
14.
15.
// Jinak zkousime delit dalsim potencialním prvoèinitelem, dokud
16.
// se to dari.
17.
while
(
$zbytek
%
$i
== 0) {
18.
$zbytek
=
$zbytek
/
$i
;
19.
echo
$i
.
" "
;
20.
}
21.
}
22.
// Pokud je zbytek vetsi nez 1, pak je to prvocislo,
23.
// ktere je treba vypsat take.
24.
if
(
$zbytek
> 1) {
25.
echo
$zbytek
;
26.
}
27.
}