Algorytm czynnika pierwszego: C, Python Przykład
⚡ Inteligentne podsumowanie
Algorytm czynników pierwszych rozkłada dowolną dodatnią liczbę całkowitą na iloczyn liczb pierwszych, stosując dzielenie próbne do pierwiastka kwadratowego, lub odmianę algorytmu Sito Eratostenesa, która przechowuje każdy najmniejszy czynnik pierwszy.
Co to jest faktoryzacja pierwsza?
Pierwszy czynnik liczby to czynnik, który sam w sobie jest Liczba pierwsza, podzielna tylko przez 1 i samą siebie.
Przykład: czynniki pierwsze liczby 10 to 2 i 5, ponieważ 2 × 5 = 10.
Znajdowanie czynników pierwszych za pomocą iteracji
Iteruj od 2 do sqrt(n) i sprawdź podzielność. Dopóki n jest podzielne przez bieżącego kandydata, wykonaj dzielenie i wydrukuj.
Przykład: każda liczba pierwsza większa niż 40 pasuje do n2+n+41, więc n = 0, 1, 2 daje 41, 43, 47.
Jak wydrukować czynnik pierwszy liczby?
- Iteruj liczby od 2 do sqrt(n).
- Sprawdź moduł n dla każdego kandydata; reszta zerowa oznacza, że kandydat jest czynnikiem pierwszym.
- Zbierz wszystkie liczby pierwsze dzielące n.
- Procedura działa ze złożonością czasową O(sqrt(n)).
Algorytm:
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
Algorytm sita
Metoda sita przechowuje najmniejszy czynnik pierwszy każdej liczby aż do określonej granicy maksymalnej, znacznie obniżając koszt faktoryzacji po obliczeniach wstępnych.
- Zapisz najmniejszy czynnik pierwszy każdej liczby całkowitej do maksymalnej granicy.
- Weź najmniejszą liczbę pierwszą i dodaj ją do zbioru czynników.
- Podziel liczbę przez tę liczbę pierwszą i powtarzaj, aż dojdziesz do 1.
- Każde zapytanie wykonuje się w czasie około O(log n).
Przykład: Liczba pierwsza inna niż 2 i 3 pasuje do postaci 6n-1 lub 6n+1. Na przykład 5 = 6(1)-1 i 19 = 6(3)+1.
Algorytm: zdefiniować szyk który przechowuje najmniejszy czynnik pierwszy każdej liczby, używając indeksu jako wartości początkowej dla każdego elementu.
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]
Powiązane artykuły
- Struktura danych wykresu i Algorithms
- Problem sprzedawcy podróży
- Algorytm metody Bisekcji
- Algorytm sortowania kubełkowego
Python Czynniki pierwsze przy użyciu iteracji
Poniższy Python kod znajduje czynniki pierwsze, używając iteracyjnej metody dzielenia prób:
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)
Wyjście:
Enter the number you want: 4 2 2
Python Czynniki pierwsze przy użyciu rekurencji
Python Poniższy kod wykorzystuje metodę sita w celu znalezienia czynników pierwszych danej liczby.
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)
Wyjście:
Enter the number you want: 4 2 2
Program czynników pierwszych w C przy użyciu iteracji
To samo rozwiązanie iteracyjne zapisane w C:wprowadź liczbę, a następnie dla każdego kandydata od 2 do sqrt(n) sprawdź podzielność i wydrukuj każde wystąpienie czynnika pierwszego.
#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; }
Wyjście:
Enter the number you want: 2 2
Program czynników pierwszych w C przy użyciu rekurencji
Rekurencyjna wersja C odzwierciedla Python 1: zbuduj tablicę najmniejszych czynników pierwszych, a następnie rekurencyjnie dziel przez ten czynnik, aż n osiągnie 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; }
Wyjście:
Enter the number you want: 2 2
Kilka interesujących faktów na temat liczb pierwszych
- Każdą liczbę parzystą różną od 2 można zapisać jako sumę dwóch liczb pierwszych (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
- Nie ma kolejnych liczb pierwszych poza 2 i 3, ponieważ 2 jest jedyną parzystą liczbą pierwszą.
- Każda liczba pierwsza oprócz 2 i 3 pasuje do postaci 6n + 1 lub 6n − 1, gdzie n jest liczbą całkowitą dodatnią.
- Zbiór czynników pierwszych danej liczby jest unikalny.
- Liczba 1 nie jest ani liczbą pierwszą, ani liczbą złożoną.
- Rozkład na czynniki pierwsze pomaga w podzielności, upraszczaniu ułamków i znajdowaniu wspólnych mianowników.
- Rozkład na czynniki pierwsze stanowi również podstawę kodów kryptograficznych opartych na liczbach.


