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.
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
- Struktura dat grafu a Algorithms
- Cestování prodavač problém
- Algoritmus bisekční metody
- Algoritmus třídění bucket
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
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.


