Algoritmus prvočinitele: C, Python Příklad
Co je primární faktorizace?
Prvotní faktor dané věci žádný číslo je faktor, který je a prvočíslo. Vynásobením faktorů získáte další číslo. Prvočíslo je dělitelné samo sebou nebo 1 .
Jinými slovy, prvočísla se určují tím, že se zjistí, která prvočísla se násobí a tvoří původní číslo.
Příklad: Prvočísla 10 jsou 2 a 5. Je to proto, že 2X5 =10 a obě 2,5 jsou prvočísla.
Hledání prvočinitelů pomocí iterace
Abychom našli prvočíslo daného čísla, nejprve iterujeme všechna čísla od 2 až po druhou odmocninu čísla a pak zkontrolujeme, zda je každé číslo prvočíslo. Dokud je původní číslo dělitelné tímto prvočíslem, přidáváme toto prvočíslo s každou iterací.
Příklad:
Každé prvočíslo větší než 40 je zapsáno v následujícím vzorci: n2+n+41. Můžeme tedy nahradit n všemi čísly, abychom našli odpovídající prvočinitel. např. 02+0+41=41, 12+1+41=43, 22+2+41=47,…
Jak vytisknout prvočíslo čísla?
- V této metodě budeme iterovat čísla od 2 až do druhé odmocniny čísla, jak bylo uvedeno v předchozí části.
- K tomu potřebujeme zkontrolovat modul původního čísla na každém z čísel od 2 do druhé odmocniny n .
- Potom najdeme seznam prvočísel, která jsou faktory n.
- Toto řešení je v časové složitosti 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
Sieve metoda spoléhá na ukládání nejmenšího prvočinitele čísel, což výrazně snižuje složitost při výpočtu prvočísel pro libovolné číslo. Algoritmus Sieve najde všechny primární faktory poněkud efektivně.
- Hlavním konceptem tohoto algoritmu je uložit nejmenší prvočinitel každého čísla až do maximálního čísla.
- Vezmeme nejmenší prvočíslo pro každé dané číslo a přidáme ho k množině prvočísel.
- Nakonec vydělíme tímto prvočíslem a tyto kroky opakujeme, dokud nedosáhneme 1.
- To vše se děje v časové složitosti O(log(n)), což výrazně zlepšuje efektivitu řešení.
- Což umožňuje vypočítat prvočinitele mnohem větších čísel, než s jakými jsme se mohli vypořádat pomocí předchozího přístupu.
Příklad:
Druhým způsobem je zkontrolovat, zda lze číslo zapsat jako 6n-1 nebo 6n+1, protože jakékoli prvočíslo jiné než 2 a 3 by se mělo zapsat do jednoho ze dvou vzorců. např. 5=6(1)-1, 19=6(3)+1,… .
Algoritmus:
Definujte pole pole pro uložení nejmenšího prvočísla každého čísla s hodnotou indexu jako počáteční hodnotou pro každý prvek řada.
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]
Python Prvotní faktory pomocí iterací
Zde vám ukážeme kód Python jazyk k nalezení prvočinitelů daného čísla iterativní metodou:
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 4
Python Prvotní faktory pomocí rekurze
Tato část zobrazuje kód v Python jazyk pomocí síto metody najít prvočinitele daného čísla.
import math High = (int)(1e5+7) array=[0 for i in range(High)] # function to generate all the smallest prime def Sieve(): #factors of the numbers until the maximum number 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): #We will keep dividing until we reach 1 if n == 1: return print((int)(array[n])) PrimeFactors((int)(n/array[n])) #Here we call the function after dividing it by this prime 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
Je to stejné řešení jako iterativní python, ale zapsané Jazyk C.
Požádáme uživatele, aby zadal číslo, pak pro každé číslo od 2 do druhé odmocniny tohoto čísla musíme zkontrolovat, zda je dělitelné tiskem všech výskytů tohoto faktoru.
#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
Toto je stejné řešení jako rekurzivní python, ale napsané v C.
Můžeme požádat uživatele o zadání čísla; potom vytvoříme pole prvočísel, které uchovává nejmenší prvočíselný faktor každého čísla. Nakonec zavoláme rekurzivní funkci Prvočinitele, která vydělí dané číslo jeho nejmenším prvočinitelem a vyvolá se, dokud nedosáhne jedničky.
#include <stdio.h> int Max = 100007; int array[100007]; void Sieve()//helping function to generate all the smallest //prime factors of the numbers until the maximum number { 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)//keep dividing until we reach 1 { return; } printf("%d\n",array[n]); PrimeFactors(n/array[n]);//call the function after dividing by //this prime } 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
- Jedním z nejzajímavějších faktů je, že jakékoli sudé číslo jiné než 2 může být součtem dvou prvočísel.
- Například: 4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3 … atd.
- Dalším faktem je, že neexistují žádná po sobě jdoucí prvočísla jiná než 2 a 3, protože jediné sudé prvočíslo je číslo 2.
- Všechna prvočísla kromě 2 a 3 lze také zapsat v následujícím tvaru: 6 * n + 1 nebo 6 * n – 1, kde n je kladné celé číslo.
- Sada prvočinitelů čísla je jedinečná.
- Číslo 1 není ani prvočíslo, ani složené.
- Prvotřídní rozklad čísel může pomoci vyřešit problémy, jako je dělitelnost, zjednodušení zlomků a hledání společných jmenovatelů různých zlomků.
- Jedním ze vzrušujících využití prvočíselného rozkladu je také prolomení tajných kódů, které jsou založeny na číslech.