Primfaktoralgoritm: C, Python Exempelvis

⚡ Smart sammanfattning

Primfaktoralgoritmen sönderdelar ett positivt heltal till en produkt av primtal med hjälp av försöksdivision upp till kvadratroten, eller en Eratosthenes-sil-variant som lagrar varje minsta primfaktor.

  • 🧮 Definition: Primfaktorer för ett heltal är de primtal vars produkt är lika med det; 10 delas upp i 2 och 5.
  • 🔁 Rättegångsavdelning: Att iterera från 2 upp till sqrt(n) och dividera när modulen är noll körs på O(sqrt(n)) tid.
  • 🧰 Siktmetod: Att lagra den minsta primfaktorn för varje värde upp till en viss gräns minskar faktoriseringen till ungefär O(log n) per fråga.
  • 🐍 Python Code: Iterativ och rekursiv Python implementationer skriver ut varje primfaktor för ett angett tal.
  • 💻 C Code: Matchande iterativa och rekursiva C-program visar samma logik med hjälp av stdio och en förberäknad array.
  • 🔐 Användningsområden: Primtalsfaktorisering möjliggör delbarhetskontroller, bråkförenkling, gemensamma nämnare och talbaserade kryptografiska nycklar.

Prime Factor Algoritm

Vad är en Prime Factorization?

Primtalsfaktorn för ett tal är en faktor som i sig själv är en primtal, endast delbar med 1 och sig själv.

Exempel: Primfaktorerna till 10 är 2 och 5, eftersom 2 × 5 = 10.

Hitta de primära faktorerna med iteration

Iterera från 2 upp till sqrt(n) och kontrollera delbarheten. Medan n är delbart med den aktuella kandidaten, dividera och skriv ut.

Exempel: varje primtal större än 40 passar in i n2+n+41, så n = 0, 1, 2 ger 41, 43, 47.

Hur skriver man ut en primtalsfaktor för ett tal?

  • Iterera tal från 2 upp till sqrt(n).
  • Kontrollera modulen för n mot varje kandidat; en rest av noll betyder att kandidaten är en primfaktor.
  • Samla alla primtal som dividerar n.
  • Rutinen körs i O(sqrt(n)) tidskomplexitet.

Algoritm:

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

Sållalgoritm

Siktmetoden lagrar den minsta primfaktorn för varje tal upp till en maximal gräns, vilket kraftigt minskar faktoriseringskostnaden efter förberäkning.

  • Anteckna den minsta primfaktorn för varje heltal upp till maxgränsen.
  • Ta det minsta primtalet och lägg det till faktormängden.
  • Dividera talet med primtalet och upprepa tills det når 1.
  • Varje fråga körs i ungefär O(log n).

Exempel: Ett primtal annat än 2 och 3 passar formen 6n-1 eller 6n+1. Till exempel, 5 = 6(1)-1 och 19 = 6(3)+1.

Algoritm: definiera en array som lagrar den minsta primfaktorn för varje tal, med index som initialvärde för varje 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]

Relaterade artiklar

Python Primära faktorer som använder iteration

Följande Python Koden hittar primfaktorer med hjälp av den iterativa försöksdivisionsmetoden:

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)

Produktion:

Enter the number you want: 4
2
2

Python Primära faktorer som använder rekursion

Ocuco-landskapet Python Koden nedan använder siktmetoden för att hitta primfaktorerna för ett givet tal.

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)

Produktion:

Enter the number you want: 4
2
2

C Prime Factors-program med iteration

Samma iterativa lösning skriven i C: ange ett tal, kontrollera sedan delbarheten för varje kandidat från 2 upp till sqrt(n) och skriv ut varje förekomst av en primtalfaktor.

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

Produktion:

Enter the number you want: 2
2

C Prime Factors-program som använder rekursion

C Prime Factors-program som använder rekursion

Den rekursiva C-versionen speglar Python ett: bygg en matris av de minsta primfaktorerna, och använd sedan rekursiv dividering med den faktorn tills 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;
}

Produktion:

Enter the number you want: 2
2

Några intressanta fakta om primtal

  • Alla jämna tal utom 2 kan skrivas som summan av två primtal (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Det finns inga på varandra följande primtal förutom 2 och 3, eftersom 2 är det enda jämna primtalet.
  • Varje primtal utom 2 och 3 passar formen 6n + 1 eller 6n − 1, där n är ett positivt heltal.
  • Mängden primfaktorer för ett tal är unik.
  • Talet 1 är varken primtal eller sammansatt.
  • Primtalsfaktorisering hjälper till med delbarhet, bråkförenkling och att hitta gemensamma nämnare.
  • Primtalsfaktorisering ligger också till grund för talbaserade kryptografiska koder.

Vanliga frågor

Primtalsfaktorisering uppdelar ett heltal i en produkt av primtal, till exempel 12 = 2 × 2 × 3. Primtalsfaktorerna är unika för varje heltal över ett.

Om n har en faktor större än sqrt(n), är dess par mindre och skulle redan finnas. Allt som passerar sqrt(n) upprepar arbetet.

Provdivisionen körs i O(sqrt(n)). Sikten förberäknar minsta primfaktorer i O(N log log N) och besvarar sedan varje faktorisering med ungefär O(log n).

Använd silen när du faktoriserar många tal inom en känd övre gräns. En förberäkning låter varje senare fråga köras i ungefär O(log n).

Nej. Talet 1 är varken primtal eller sammansatt, så det förekommer aldrig i en lista över primtalsfaktorer. Primtalsfaktorisering använder primtal större än eller lika med 2.

Primtalsfaktorisering driver delbarhetstest, bråkförenkling, minsta gemensamma nämnare och största gemensamma nämnare, samt kryptografi med offentlig nyckel som RSA, där det är svårt att faktorisera en stor produkt av två primtal.

AI-system tillämpar primtalsfaktorisering på talteoretiska funktioner, kryptografisk nyckelanalys och säker federerad inlärning. Postkvant ML-forskning studerar även faktoriseringsresistens.

Ja. GitHub Copilot och liknande AI-assistenter automatiserar standardinställningar för trial-division och sieve-rutiner, även om utvecklare fortfarande verifierar komplexitet och edge-fall som n = 1.

Sammanfatta detta inlägg med: