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.

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
- Graf datastruktur og Algorithms
- Reisende selgerproblem
- Biseksjonsmetodealgoritme
- Bรธttesorteringsalgoritme
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
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.

