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.
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
- Graf datastruktur och Algorithms
- Resande säljare Problem
- Bisektionsmetodalgoritm
- Skoksorteringsalgoritm
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
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.


