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.

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
- Graafin tietorakenne ja Algorithms
- Matkustavan myyjän ongelma
- Bisection Method Algorithm
- Kauhan lajittelualgoritmi
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
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.

