Algoritam primarnog faktora: C, Python Primjer
⚡ Pametni sažetak
Algoritam prostih faktora rastavlja bilo koji pozitivni cijeli broj na produkt prostih brojeva koristeći probno dijeljenje do kvadratnog korijena ili varijantu Eratostenova sita koja pohranjuje svaki najmanji prosti faktor.

Što je prosta faktorizacija?
Prosti faktor broja je faktor koji je sam po sebi glavni broj, djeljiv samo s 1 i samim sobom.
Primjer: Prosti djelitelji broja 10 su 2 i 5, budući da je 2 × 5 = 10.
Pronalaženje prostih faktora pomoću iteracije
Iteriraj od 2 do sqrt(n) i provjeri djeljivost. Dok je n djeljiv s trenutnim kandidatom, podijeli i ispiši.
Primjer: svaki prosti broj veći od 40 odgovara n2+n+41, pa n = 0, 1, 2 daje 41, 43, 47.
Kako ispisati prosti faktor broja?
- Iteriraj brojeve od 2 do sqrt(n).
- Provjerite modul n u odnosu na svakog kandidata; ostatak nula znači da je kandidat prosti faktor.
- Sakupi sve proste brojeve koji dijele n.
- Rutina se izvršava u vremenskoj složenosti O(sqrt(n)).
Algoritam:
Set a counter i to 2 While i <= sqrt(n): While n % i == 0: n = n / i print i i = i + 1 if n > 1: print n
Algoritam sita
Metoda sita pohranjuje najmanji prosti faktor svakog broja do maksimalne granice, oštro smanjujući trošak faktorizacije nakon predračuna.
- Zapišite najmanji prosti djelitelj svakog cijelog broja do maksimalne granice.
- Uzmi taj najmanji prosti broj i dodaj ga skupu faktora.
- Podijelite broj s tim prostim brojem i ponavljajte postupak dok ne dođete do 1.
- Svaki upit se izvršava za otprilike O(log n).
Primjer: Prost broj koji nije 2 i 3 odgovara obliku 6n-1 ili 6n+1. Na primjer, 5 = 6(1)-1 i 19 = 6(3)+1.
Algoritam: definirati poredak koja pohranjuje najmanji prosti djelitelj svakog broja, koristeći indeks kao početnu vrijednost za svaki element.
Set array[1] to 1 Set i to 2 While i*i <= max_number: If array[i] == i: Set j to i*i While j <= max_number: If array[j] == j: array[j] = i j = j + i i = i + 1 while the_number != 1: print array[the_number] the_number = the_number / array[the_number]
Vezani članci
- Struktura podataka grafikona i Algorithms
- Problem putujućeg trgovca
- Algoritam metode bisekcije
- Algoritam za sortiranje spremnika
Python Primarni faktori korištenjem iteracije
Sljedeće Python kod pronalazi proste faktore koristeći iterativnu metodu pokušaja i dijeljenja:
import math def PrimeFactors(n): for i in range(2, int(math.sqrt(n)) + 1, 1): while n % i == 0: # find all the occurrences of a prime factor print((int)(i)) n = n // i if n != 1: # if the number was originally a prime print((int)(n)) n = (int)(input("Enter the number you want: ")) PrimeFactors(n)
Izlaz:
Enter the number you want: 4 2 2
Python Primarni faktori korištenjem rekurzije
The Python Donji kod koristi metodu sita za pronalaženje prostih faktora zadanog broja.
import math High = (int)(1e5 + 7) array = [0 for i in range(High)] # generate smallest prime factors def Sieve(): for i in range(1, High): array[i] = i for i in range(2, math.ceil(math.sqrt(High))): if array[i] == i: for j in range(i * i, High, i): if array[j] == j: array[j] = i def PrimeFactors(n): # divide until we reach 1 if n == 1: return print((int)(array[n])) PrimeFactors((int)(n / array[n])) Sieve() n = (int)(input("Enter the number you want: ")) PrimeFactors(n)
Izlaz:
Enter the number you want: 4 2 2
Program C prostih faktora korištenjem iteracije
Isto iterativno rješenje napisano u CUpišite broj, zatim za svakog kandidata od 2 do sqrt(n) provjerite djeljivost i ispišite svaku pojavu prostog djelitelja.
#include <stdio.h> int main() { int n; printf("Enter the number you want: "); scanf("%d", &n); for (int i = 2; i * i <= n; i++) { while (n % i == 0) // find all the occurrences of a prime factor { printf("%d\n", i); n /= i; } } if (n != 1) // if the number was originally a prime { printf("%d", n); } return 0; }
Izlaz:
Enter the number you want: 2 2
Program C prostih faktora korištenjem rekurzije
Rekurzivna C verzija odražava Python Prvo: izgraditi niz najmanjih prostih faktora, a zatim rekurzivno dijeliti tim faktorom dok n ne dosegne 1.
#include <stdio.h> int Max = 100007; int array[100007]; void Sieve() // smallest prime factors up to Max { for (int i = 1; i < Max; i++) array[i] = i; for (int i = 2; i * i <= Max; i++) { if (array[i] == i) { for (int j = i * i; j < Max; j += i) { if (array[j] == j) array[j] = i; } } } } void PrimeFactors(int n) { if (n == 1) // divide until we reach 1 return; printf("%d\n", array[n]); PrimeFactors(n / array[n]); } int main() { Sieve(); int n; printf("Enter the number you want: "); scanf("%d", &n); PrimeFactors(n); return 0; }
Izlaz:
Enter the number you want: 2 2
Nekoliko zanimljivih činjenica o prostim brojevima
- Bilo koji paran broj osim 2 može se zapisati kao zbroj dvaju prostih brojeva (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
- Ne postoje uzastopni prosti brojevi osim 2 i 3, jer je 2 jedini paran prost broj.
- Svaki prosti broj osim 2 i 3 odgovara obliku 6n + 1 ili 6n − 1, gdje je n pozitivan cijeli broj.
- Skup prostih faktora broja je jedinstven.
- Broj 1 nije ni prost ni složen broj.
- Prosta faktorizacija pomaže kod djeljivosti, pojednostavljenja razlomaka i pronalaženja zajedničkih nazivnika.
- Faktorizacija prostih brojeva također je temelj kriptografskih kodova temeljenih na brojevima.

