Prime Factor Algoritme: C, Python Eksempel

โšก Smart oppsummering

En primtallsalgoritme dekomponerer ethvert positivt heltall til et produkt av primtall ved hjelp av prรธvedivisjon opp til kvadratroten, eller en Eratosthenes-sil-variant som lagrer hver minste primtallsfaktor.

  • ๐Ÿงฎ Definisjon: Primfaktorer av et heltall er primtallene hvis produkt er lik det; 10 deler seg i 2 og 5.
  • ๐Ÿ” Rettssaksavdeling: Iterering fra 2 opp til sqrt(n) og deling nรฅr modulen er null kjรธrer i O(sqrt(n)) tid.
  • ๐Ÿงฐ Siktmetode: ร… lagre den minste primfaktoren for hver verdi opp til en grense reduserer faktoriseringen til omtrent O(log n) per spรธrring.
  • ๐Ÿ Python Code: Iterativ og rekursiv Python Implementeringer skriver ut hver primfaktor i et angitt tall.
  • ๐Ÿ’ป C Code: Matchende iterative og rekursive C-programmer demonstrerer den samme logikken ved bruk av stdio og en forhรฅndsberegnet array.
  • ๐Ÿ” Bruksomrรฅder: Primfaktorisering driver delelighetssjekker, brรธkforenkling, fellesnevnere og tallbaserte kryptografiske nรธkler.

Prime Factor Algoritme

Hva er en Prime Factorization?

Primfaktoren til et tall er en faktor som i seg selv er en primtall, kun delelig med 1 og seg selv.

Eksempel: Primfaktorene til 10 er 2 og 5, siden 2 ร— 5 = 10.

Finne hovedfaktorene ved hjelp av iterasjon

Iterer fra 2 opp til sqrt(n) og sjekk deleligheten. Nรฅr n er delelig med den gjeldende kandidaten, divider og skriv ut.

Eksempel: Hvert primtall stรธrre enn 40 passer til n2+n+41, sรฅ n = 0, 1, 2 gir 41, 43, 47.

Hvordan skrive ut en primfaktor for et tall?

  • Iterer tall fra 2 opp til sqrt(n).
  • Sjekk modulen til n mot hver kandidat; en rest pรฅ null betyr at kandidaten er en primtallsfaktor.
  • Samle alle primtall som deler n.
  • Rutinen kjรธrer i O(sqrt(n)) tidskompleksitet.

algoritme:

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

Sil algoritme

Siktmetoden lagrer den minste primfaktoren for hvert tall opp til en maksimal grense, noe som reduserer faktoriseringskostnaden kraftig etter forberegning.

  • Registrer den minste primtallsfaktoren for hvert heltall opp til maksimumsgrensen.
  • Ta det minste primtallet og legg det til faktorsettet.
  • Del tallet med primtallet og gjenta til det nรฅr 1.
  • Hver spรธrring kjรธrer i omtrent O(log n).

Eksempel: Et annet primtall enn 2 og 3 passer pรฅ formen 6n-1 eller 6n+1. For eksempel er 5 = 6(1)-1 og 19 = 6(3)+1.

algoritme: definere en matrise som lagrer den minste primfaktoren for hvert tall, og bruker indeksen som startverdi for hvert 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]

Relaterte artikler

Python Hovedfaktorer ved bruk av iterasjon

Fรธlgende Python Koden finner primfaktorer ved hjelp av den iterative prรธvedelingsmetoden:

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)

Utgang:

Enter the number you want: 4
2
2

Python Hovedfaktorer ved bruk av rekursjon

Ocuco Python Koden nedenfor bruker silmetoden for รฅ finne primfaktorene til et gitt tall.

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)

Utgang:

Enter the number you want: 4
2
2

C Prime Factors-program ved hjelp av iterasjon

Den samme iterative lรธsningen skrevet i C: skriv inn et tall, og sjekk deretter deleligheten for hver kandidat fra 2 opp til sqrt(n) og skriv ut hver forekomst av en primtallsfaktor.

#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;
}

Utgang:

Enter the number you want: 2
2

C Prime Factors-program som bruker rekursjon

C Prime Factors-program som bruker rekursjon

Den rekursive C-versjonen speiler Python en: bygg matrisen med de minste primfaktorene, og bruk deretter rekursjon til รฅ dele med den faktoren til n nรฅr 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;
}

Utgang:

Enter the number you want: 2
2

Noen interessante fakta om primtall

  • Ethvert partall annet enn 2 kan skrives som summen av to primtall (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Det finnes ingen pรฅfรธlgende primtall annet enn 2 og 3, fordi 2 er det eneste partallet.
  • Alle primtall unntatt 2 og 3 passer pรฅ formen 6n + 1 eller 6n โˆ’ 1, hvor n er et positivt heltall.
  • Mengden av primfaktorer til et tall er unik.
  • Tallet 1 er verken primtall eller sammensatt.
  • Primtalsfaktorisering hjelper med delelighet, brรธkforenkling og รฅ finne fellesnevnere.
  • Primfaktorisering underbygger ogsรฅ tallbaserte kryptografiske koder.

Spรธrsmรฅl og svar

Primtalsfaktorisering deler et heltall opp i et produkt av primtall, for eksempel 12 = 2 ร— 2 ร— 3. Primtalsfaktorene er unike for hvert heltall over รฉn.

Hvis n har en faktor stรธrre enn sqrt(n), er faktorparet mindre og ville allerede blitt funnet. Alt som er forbi sqrt(n) gjentar arbeidet.

Prรธvedeling kjรธres i O(sqrt(n)). Silen forhรฅndsberegner de minste primtallsfaktorene i O(N log log N), og svarer deretter pรฅ hver faktorisering i omtrent O(log n).

Bruk silen nรฅr du faktoriserer mange tall innenfor en kjent รธvre grense. ร‰n forhรฅndsberegning lar hver senere spรธrring kjรธre i omtrent O(log n).

Nei. Tallet 1 er verken primtall eller sammensatt tall, sรฅ det vises aldri i en primtallsliste. Primtalsfaktorisering bruker primtall stรธrre enn eller lik 2.

Primtalsfaktorisering driver delelighetstester, brรธkforenkling, minste felles multiplum (MFM) og stรธrste felles multiplum (GCD), og offentlig nรธkkelkryptografi som RSA, der det er vanskelig รฅ faktorisere et stort produkt av to primtall.

AI-systemer bruker primtallsfaktorisering pรฅ tallteoretiske funksjoner, kryptografisk nรธkkelanalyse og sikker fรธderert lรฆring. Post-kvante maskinlรฆringsforskning studerer ogsรฅ faktoriseringsmotstand.

Ja. GitHub Copilot og lignende AI-assistenter automatiserer standardmetoder for prรธvedeling og siktrutiner, selv om utviklere fortsatt verifiserer kompleksitet og kanttilfeller som n = 1.

Oppsummer dette innlegget med: