Alkutekijän algoritmi: C, Python esimerkki

⚡ Älykäs yhteenveto

Alkutekijäalgoritmi hajottaa minkä tahansa positiivisen kokonaisluvun alkulukujen tuloksi käyttämällä jakolaskua neliöjuureen asti tai Eratostheneen seulavarianttia, joka tallentaa jokaisen pienimmän alkutekijän.

  • 🧮 Määritelmä: Kokonaisluvun alkutekijät ovat alkulukuja, joiden tulo on yhtä suuri kuin kokonaisluku; 10 jakautuu luvuiksi 2 ja 5.
  • 🔁 Oikeudenkäyntiosasto: Iterointi 2:sta 2:een asti sqrt(n) ja jakaminen aina, kun moduuli on nolla, kestää O(sqrt(n)).
  • 🧰 Seulamenetelmä: Pienimmän alkutekijän tallentaminen jokaiselle arvolle tiettyyn rajaan asti lyhentää tekijöihinjaon noin O(log n) arvoon kyselyä kohden.
  • 🐍 Python Code: Iteratiivinen ja rekursiivinen Python toteutukset tulostavat syötetyn luvun jokaisen alkulukutekijän.
  • 💻 C Code: Iteratiivisten ja rekursiivisten C-ohjelmien yhteensovittaminen havainnollistaa samaa logiikkaa käyttämällä stdio-lauseketta ja esilaskettua taulukkoa.
  • 🔐 Käyttö: Alkulukujen tekijöihin jakaminen mahdollistaa jaollisuustarkistukset, murtolukujen sievennyksen, yhteiset nimittäjät ja lukupohjaiset kryptografiset avaimet.

Prime Factor -algoritmi

Mikä on ensisijainen faktorointi?

Luvun alkutekijä on tekijä, joka itse on alkutekijä alkuluku, jaollinen vain ykkösellä ja itsellään.

Esimerkiksi: Luvun 10 alkutekijät ovat 2 ja 5, koska 2 × 5 = 10.

Ensisijaisten tekijöiden löytäminen iteraatiolla

Iteroi luvusta 2 ylöspäin lukuun sqrt(n) ja tarkista jaollisuus. Vaikka n on jaollinen nykyisellä ehdokkaalla, jaa ja tulosta.

Esimerkiksi: jokainen yli 40:n alkuluku sopii n:ään2+n+41, joten n = 0, 1, 2 antaa 41, 43, 47.

Kuinka tulostaa luvun alkutekijä?

  • Iteroi lukuja 2:sta sqrt(n):ään asti.
  • Tarkista n:n moduuli kutakin ehdokasta vasten; nolla-jäännös tarkoittaa, että ehdokas on alkulukutekijä.
  • Kerää kaikki alkuluvut, jotka jakavat n:n.
  • Rutiini suoritetaan O(sqrt(n)) aikakompleksisuudessa.

algoritmi:

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

Seula-algoritmi

Sieve-menetelmä tallentaa jokaisen luvun pienimmän alkutekijän maksimirajaan asti, mikä vähentää jyrkästi tekijöihinjaon kustannuksia esilaskennan jälkeen.

  • Merkitse muistiin jokaisen kokonaisluvun pienin alkutekijä ylärajaan asti.
  • Ota pienin alkuluku ja lisää se tekijäjoukkoon.
  • Jaa luku kyseisellä alkuluvulla ja toista, kunnes luku on 1.
  • Jokainen kysely suoritetaan noin O(log n):ssä.

Esimerkiksi: Muu alkuluku kuin 2 ja 3 on muotoa 6n⁻¹ tai 6n+1. Esimerkiksi 5 = 6(1)⁻¹ ja 19 = 6(3)+1.

algoritmi: määritellä ryhmä joka tallentaa kunkin luvun pienimmän alkutekijän käyttäen indeksiä jokaisen alkion alkuarvona.

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]

Aiheeseen liittyvät artikkelit

Python Ensisijaiset tekijät iteraatiolla

Seuraavat Python koodi löytää alkutekijät iteratiivisella jakolaskumenetelmällä:

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)

lähtö:

Enter the number you want: 4
2
2

Python Ensisijaiset tekijät rekursiolla

Python Alla oleva koodi käyttää seulamenetelmää tietyn luvun alkulukutekijöiden löytämiseen.

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)

lähtö:

Enter the number you want: 4
2
2

C Prime Factors -ohjelma käyttäen iteraatiota

Sama iteratiivinen ratkaisu kirjoitettuna CSyötä luku ja tarkista sitten jokaisen ehdokkaan jaollisuus 2:sta sqrt(n):ään asti ja tulosta kaikki alkulukutekijän esiintymät.

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

lähtö:

Enter the number you want: 2
2

C Prime Factors -ohjelma, jossa käytetään rekursiota

C Prime Factors -ohjelma, jossa käytetään rekursiota

Rekursiivinen C-versio peilaa Python yksi: muodosta pienimpien alkutekijöiden taulukko ja toista sitten jakaminen tällä tekijällä, kunnes n saavuttaa luvun 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;
}

lähtö:

Enter the number you want: 2
2

Mielenkiintoisia faktoja alkuluvuista

  • Mikä tahansa parillinen luku kuin 2 voidaan kirjoittaa kahden alkuluvun summana (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Muita peräkkäisiä alkulukuja kuin 2 ja 3 ei ole, koska 2 on ainoa parillinen alkuluku.
  • Jokainen alkuluku lukuun 2 ja 3 ei ole muotoa 6n + 1 tai 6n − 1, missä n on positiivinen kokonaisluku.
  • Luvun alkutekijöiden joukko on ainutlaatuinen.
  • Luku 1 ei ole alkuluku eikä yhdistetty luku.
  • Alkulukuihin jakaminen auttaa jaollisuudessa, murtolukujen sieventämisessä ja yhteisten nimittäjien löytämisessä.
  • Alkulukujen tekijöihin jakaminen on myös numeropohjaisten kryptografisten koodien perusta.

UKK

Alkulukuun jakaminen jakaa kokonaisluvun alkulukujen tuloksi, esimerkiksi 12 = 2 × 2 × 3. Alkulukutekijät ovat yksilölliset jokaiselle kokonaisluvulle, joka on suurempi kuin yksi.

Jos n:n tekijä on suurempi kuin sqrt(n), sen pari on pienempi ja se olisi jo löydetty. Mikä tahansa sqrt(n):n jälkeen toistuva työ.

Koejakolasku suoritetaan funktiossa O(sqrt(n)). Seula laskee esiasennossa pienimmät alkutekijät funktiossa O(N log log N) ja vastaa sitten jokaiseen tekijöihinjakoon suunnilleen funktiossa O(log n).

Käytä seulaa, kun jaat useita lukuja tekijöihin tunnetun ylärajan sisällä. Yksi esilaskenta antaa jokaisen myöhemmän kyselyn suorittua noin O(log n):ssä.

Ei. Luku 1 ei ole alkuluku eikä yhdistetty luku, joten se ei koskaan esiinny alkulukujen luettelossa. Alkulukujen jakaminen tekijöihin käyttää alkulukuja, jotka ovat suurempia tai yhtä suuria kuin 2.

Alkulukujen tekijöihin jakaminen ohjaa jaollisuustestejä, murtolukujen yksinkertaistamista, pienintä yhteistä laskentaa (PKY) ja suurta yhteistä laskentaa (GCD) sekä julkisen avaimen kryptografiaa, kuten RSA:ta, jossa kahden alkuluvun suuren tulon tekijöihin jakaminen on vaikeaa.

Tekoälyjärjestelmät soveltavat alkutekijöihin jakoa lukuteoreettisiin ominaisuuksiin, kryptografiseen avainanalyysiin ja turvalliseen federoituun oppimiseen. Postkvanttikoneoppimisen tutkimus tutkii myös tekijöihinjaon vastustuskykyä.

Kyllä. GitHub Copilot ja vastaavat tekoälyavustajat automatisoivat mallipohjia koe-erikoisjako- ja seulontarutiineille, vaikka kehittäjät tarkistavat edelleen monimutkaisuuden ja reunatapaukset, kuten n = 1.

Tiivistä tämä viesti seuraavasti: