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: