Algoritmus prvočinitele: C, Python Příklad

⚡ Chytré shrnutí

Algoritmus prvočísla rozkládá libovolné kladné celé číslo na součin prvočísel pomocí zkušebního dělení až do druhé odmocniny nebo varianty Eratosthenova síta, která ukládá všechny nejmenší prvočísla.

  • 🧮 Definice: Prvočísla, jejichž součin se rovná tomuto číslu, jsou prvočísla, jejichž součin se rovná tomuto číslu; 10 se dělí na 2 a 5.
  • 🔁 Zkušební oddělení: Iterace od 2 do sqrt(n) a dělení, kdykoli je modul nulový, probíhá za čas O(sqrt(n)).
  • 🧰 Metoda sítování: Uložení nejmenšího prvočísla pro každou hodnotu až do určité meze zkrátí faktorizaci na přibližně O(log n) na dotaz.
  • 🐍 Python Code: Iterativní a rekurzivní Python implementace vypíší každý prvodělitel zadaného čísla.
  • 💻 C Code: Porovnávání iteračních a rekurzivních programů v jazyce C demonstruje stejnou logiku s použitím stdio a předpočítaného pole.
  • 🔐 Použití: Prvočíslová faktorizace umožňuje kontrolu dělitelnosti, zjednodušování zlomků, společné jmenovatele a kryptografické klíče založené na číslech.

Algoritmus prvočinitele

Co je primární faktorizace?

Prvotní dělitel čísla je dělitel, který je sám o sobě prvočíslo, dělitelné pouze 1 a samo sebou.

Příklad: Prvočísla 10 jsou 2 a 5, protože 2 × 5 = 10.

Hledání prvočinitelů pomocí iterace

Iterujte od 2 až do sqrt(n) a ověřte dělitelnost. Pokud je n dělitelné aktuálním kandidátem, vydělte a vypište.

Příklad: každé prvočíslo větší než 40 pasuje na n2+n+41, takže n = 0, 1, 2 dává 41, 43, 47.

Jak vytisknout prvočíslo čísla?

  • Iteruje čísla od 2 až do sqrt(n).
  • Porovnejte modul n s každým kandidátem; nulový zbytek znamená, že kandidát je prvočíslem.
  • Sesbírejte všechna prvočísla, která dělí n.
  • Rutina běží s časovou složitostí O(sqrt(n)).

Algoritmus:

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íťový algoritmus

Metoda Sieve ukládá nejmenšího prvodělitele každého čísla až do maximální hranice, čímž po předběžném výpočtu prudce snižuje náklady na faktorizaci.

  • Zapište nejmenšího prvočísla jako dělitele každého celého čísla až do maximální limity.
  • Vezměte to nejmenší prvočíslo a přidejte ho k množině faktorů.
  • Vydělte číslo tímto prvočíslem a opakujte, dokud nedosáhnete 1.
  • Každý dotaz se provede za přibližně O(log n).

Příklad: Prvočíslo jiné než 2 a 3 odpovídá tvaru 6n-1 nebo 6n+1. Například 5 = 6(1)-1 a 19 = 6(3)+1.

Algoritmus: definovat řada který ukládá nejmenšího prvočísla každého čísla, přičemž index je počáteční hodnotou pro každý prvek.

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]

Související články

Python Prvotní faktory pomocí iterací

Následující Python Kód vyhledává prvočísla pomocí iterační metody pokus-dělení:

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)

Výstup:

Enter the number you want: 4
2
2

Python Prvotní faktory pomocí rekurze

Jedno Python Níže uvedený kód používá metodu síta k nalezení prvočíselných dělitelů daného čísla.

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)

Výstup:

Enter the number you want: 4
2
2

C Program Prime Factors pomocí iterace

Stejné iterativní řešení napsané v CZadejte číslo, poté pro každého kandidáta od 2 do sqrt(n) ověřte dělitelnost a vypište každý výskyt prvočísla.

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

Výstup:

Enter the number you want: 2
2

C Program primárních faktorů pomocí rekurze

C Program primárních faktorů pomocí rekurze

Rekurzivní verze v jazyce C zrcadlí Python jedna: sestavit pole nejmenších prvočíslů a poté rekurzivně dělit tímto činitelem, dokud n nedosáhne 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;
}

Výstup:

Enter the number you want: 2
2

Několik zajímavých faktů o prvočíslech

  • Jakékoli sudé číslo jiné než 2 lze zapsat jako součet dvou prvočísel (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Neexistují žádná po sobě jdoucí prvočísla kromě 2 a 3, protože 2 je jediné sudé prvočíslo.
  • Každé prvočíslo kromě 2 a 3 odpovídá tvaru 6n + 1 nebo 6n − 1, kde n je kladné celé číslo.
  • Množina prvočíslů čísla je jedinečná.
  • Číslo 1 není ani prvočíslo, ani složené.
  • Prvočíslo jako faktor pomáhá s dělitelností, zjednodušováním zlomků a hledáním společných jmenovatelů.
  • Prvočíslová faktorizace je také základem kryptografických kódů založených na číslech.

Nejčastější dotazy

Prvočíslová faktorizace rozdělí celé číslo na součin prvočísel, například 12 = 2 × 2 × 3. Prvočísla jsou jedinečná pro každé celé číslo nad jedničkou.

Pokud má n dělitel větší než sqrt(n), jeho dvojice je menší a již by byla nalezena. Cokoli za sqrt(n) opakuje práci.

Zkušební dělení probíhá v čase O(sqrt(n)). Síto předem vypočítá nejmenší prvočinitele v čase O(N log log N) a poté odpoví na každou faktorizaci přibližně v čase O(log n).

Síto použijte při faktorizaci mnoha čísel v rámci známé horní hranice. Jeden předvýpočet umožňuje, aby každý další dotaz proběhl za přibližně O(log n).

Ne. Číslo 1 není ani prvočíslo, ani složené číslo, takže se nikdy neobjeví v seznamu prvočíslů. Prvočísla se rozkládají na součiny a používají se prvočísla větší nebo rovna 2.

Prvočísla se používají jako faktorizace, což je klíčové pro testy dělitelnosti, zjednodušování zlomků, nejmenší základní složeninu (NZS) a nejvýznamnější dělitelnou kombinaci (NSC) a kryptografii s veřejným klíčem, jako je RSA, kde je faktorizace velkého součinu dvou prvočísel obtížná.

Systémy umělé inteligence aplikují prvočíselnou faktorizaci na funkce teorie čísel, analýzu kryptografických klíčů a bezpečné federované učení. Výzkum postkvantového strojového učení se také zabývá odolností vůči faktorizaci.

Ano. GitHub Copilot a podobní AI asistenti automatizují standardizované postupy pro zkušební dělení a prosévání, i když vývojáři stále ověřují složitost a okrajové případy, jako je n = 1.

Shrňte tento příspěvek takto: