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.

  • 🧮 Definicija: Prosti faktori cijelog broja su prosti brojevi čiji je produkt jednak njemu; 10 se dijeli na 2 i 5.
  • 🔁 Sudski odjel: Iteriranje od 2 do sqrt(n) i dijeljenje kad god je modul nula traje O(sqrt(n)).
  • 🧰 Metoda sita: Pohranjivanje najmanjeg prostog faktora za svaku vrijednost do određene granice smanjuje faktorizaciju na otprilike O(log n) po upitu.
  • 🐍 Python Code: Iterativno i rekurzivno Python implementacije ispisuju svaki prosti faktor unesenog broja.
  • 💻 C Code: Usklađivanje iterativnih i rekurzivnih C programa demonstrira istu logiku koristeći stdio i unaprijed izračunato polje.
  • 🔐 Koristi: Faktorizacija prostih brojeva omogućuje provjere djeljivosti, pojednostavljenje razlomaka, zajedničke nazivnike i kriptografske ključeve temeljene na brojevima.

Algoritam primarnog faktora

Š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

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

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.

Pitanja i odgovori

Prosta faktorizacija rastavlja cijeli broj na produkt prostih brojeva, na primjer 12 = 2 × 2 × 3. Prosti faktori su jedinstveni za svaki cijeli broj veći od jedan.

Ako n ima faktor veći od sqrt(n), njegov par je manji i već bi bio pronađen. Sve nakon sqrt(n) ponavlja rad.

Probno dijeljenje se izvodi u O(sqrt(n)). Sito unaprijed izračunava najmanje proste faktore u O(N log log N), a zatim odgovara na svaku faktorizaciju u otprilike O(log n).

Koristite sito prilikom faktorizacije više brojeva unutar poznate gornje granice. Jedan predračun omogućuje da se svaki kasniji upit izvrši za otprilike O(log n).

Ne. Broj 1 nije ni prost ni složen broj, pa se nikada ne pojavljuje na popisu prostih faktora. Faktorizacija prostih brojeva koristi proste brojeve veće ili jednake 2.

Faktorizacija prostih brojeva pokreće testove djeljivosti, pojednostavljenje razlomaka, NZB i NZD te kriptografiju javnog ključa poput RSA, gdje je faktorizacija velikog umnoška dvaju prostih brojeva teška.

AI sustavi primjenjuju faktorizaciju prostih brojeva na teorijske značajke brojeva, analizu kriptografskih ključeva i sigurno federirano učenje. Postkvantno strojno učenje također proučava otpornost na faktorizaciju.

Da. GitHub Copilot i slični AI asistenti automatiziraju standardne rutine za probno dijeljenje i prosijavanje, iako programeri i dalje provjeravaju složenost i rubne slučajeve poput n = 1.

Sažmite ovu objavu uz: