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.

  • 🧮 Definicja: Czynniki pierwsze liczby całkowitej to liczby pierwsze, których iloczyn jest jej równy; 10 dzieli się na 2 i 5.
  • 🔁 Wydział Sądowy: Iterowanie od 2 do sqrt(n) i dzielenie za każdym razem, gdy moduł wynosi zero, odbywa się w czasie O(sqrt(n)).
  • 🧰 Metoda sitowa: Przechowywanie najmniejszego czynnika pierwszego dla każdej wartości do określonej granicy redukuje faktoryzację do około O(log n) na zapytanie.
  • 🐍 Python Code: Iteracyjne i rekurencyjne Python Implementacje drukują każdy czynnik pierwszy wprowadzonej liczby.
  • 💻 C Code: Dopasowanie iteracyjnych i rekurencyjnych programów C odbywa się za pomocą tej samej logiki, wykorzystując stdio i wstępnie obliczoną tablicę.
  • 🔐 Zastosowania: Rozkład na czynniki pierwsze umożliwia sprawdzanie podzielności, upraszczanie ułamków, znajdowanie wspólnych mianowników i stosowanie kluczy kryptograficznych opartych na liczbach.

Algorytm czynnika pierwszego

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

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

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.

FAQ

Rozkład na czynniki pierwsze polega na rozbiciu liczby całkowitej na iloczyn liczb pierwszych, na przykład 12 = 2 × 2 × 3. Czynniki pierwsze są unikalne dla każdej liczby całkowitej większej od jedynki.

Jeśli n ma czynnik większy niż sqrt(n), jego para jest mniejsza i zostałaby już znaleziona. Wszystko po sqrt(n) powtarza działanie.

Dzielenie próbne przebiega w czasie O(sqrt(n)). Sito wstępnie oblicza najmniejsze czynniki pierwsze w czasie O(N log log N), a następnie odpowiada na każdą faktoryzację w czasie około O(log n).

Użyj sita przy rozkładaniu wielu liczb w obrębie znanej górnej granicy. Jedno wstępne obliczenie pozwala na wykonanie każdego kolejnego zapytania z dokładnością około O(log n).

Nie. Liczba 1 nie jest ani liczbą pierwszą, ani liczbą złożoną, więc nigdy nie pojawia się na liście czynników pierwszych. Rozkład na czynniki pierwsze wykorzystuje liczby pierwsze większe lub równe 2.

Rozkład na czynniki pierwsze jest podstawą testów podzielności, upraszczania ułamków, NWW i NWW oraz kryptografii klucza publicznego, np. RSA, w której rozkład dużego iloczynu dwóch liczb pierwszych jest trudny.

Systemy sztucznej inteligencji stosują rozkład na czynniki pierwsze do funkcji teorii liczb, analizy kluczy kryptograficznych i bezpiecznego uczenia federacyjnego. Badania nad uczeniem maszynowym postkwantowym badają również odporność na faktoryzację.

Tak. GitHub Copilot i podobne rozwiązania wspomagające AI automatyzują szablonowe procedury podziału prób i przesiewania, choć programiści nadal weryfikują złożoność i przypadki skrajne, takie jak n = 1.

Podsumuj ten post następująco: