Algoritmul factorului prim: C, Python Exemplu

Ce este o factorizare primฤƒ?

Factorul prim al unui dat Orice numฤƒrul este factorul care este a numฤƒr prim. Factorii atunci cรขnd sunt รฎnmulศ›iศ›i vฤƒ oferฤƒ un alt numฤƒr. Un numฤƒr prim este divizibil cu el รฎnsuศ™i sau cu 1.

Cu alte cuvinte, factorii primi sunt determinaศ›i prin gฤƒsirea numerelor prime care se รฎnmulศ›esc รฎmpreunฤƒ pentru a forma numฤƒrul original.

Exemplu: Factorii primi ai lui 10 sunt 2 ศ™i 5. Acest lucru se datoreazฤƒ faptului cฤƒ 2X5 =10 ศ™i ambele 2,5 sunt numere prime.

Gฤƒsirea factorilor primi folosind iteraศ›ie

Pentru a gฤƒsi factorii primi ai unui numฤƒr dat, mai รฎntรขi repetฤƒm โ€‹โ€‹toate numerele de la 2 pรขnฤƒ la rฤƒdฤƒcina pฤƒtratฤƒ a numฤƒrului, apoi verificฤƒm dacฤƒ fiecare numฤƒr este prim. Atรขta timp cรขt numฤƒrul original este รฎmpฤƒrศ›it la acest prim, continuฤƒm sฤƒ adฤƒugฤƒm acest prim cu fiecare iteraศ›ie.

Exemplu:

Fiecare numฤƒr prim mai mare de 40 se scrie cu urmฤƒtoarea formulฤƒ: n2+n+41. Deci, putem รฎnlocui n cu toate numerele pentru a gฤƒsi factorul prim corespunzฤƒtor. de exemplu, 02+0+41=41, 12+1+41=43, 22+2+41=47,...

Cum se imprimฤƒ un factor prim al unui numฤƒr?

  • รŽn aceastฤƒ metodฤƒ, vom repeta numerele de la 2 pรขnฤƒ la rฤƒdฤƒcina pฤƒtratฤƒ a numฤƒrului, aศ™a cum sa menศ›ionat รฎn secศ›iunea anterioarฤƒ.
  • Pentru aceasta, trebuie sฤƒ verificฤƒm modulul numฤƒrului iniศ›ial pe fiecare dintre numerele de la 2 pรขnฤƒ la rฤƒdฤƒcina pฤƒtratฤƒ a lui n .
  • Apoi, gฤƒsim lista numerelor prime care sunt factori ai lui n.
  • Aceastฤƒ soluศ›ie este รฎn complexitatea de timp O(Sqrt(n)).

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

Algoritmul Sieve

Metoda Sieve se bazeazฤƒ pe stocarea celui mai mic factor prim al numerelor, ceea ce reduce semnificativ complexitatea atunci cรขnd se calculeazฤƒ factorii primi pentru orice numฤƒr. Algoritmul Sieve gฤƒseศ™te toศ›i factorii primi oarecum eficient.

  • Conceptul principal al acestui algoritm este de a stoca cel mai mic factor prim al fiecฤƒrui numฤƒr pรขnฤƒ la numฤƒrul maxim.
  • Luฤƒm cel mai mic prim pentru fiecare numฤƒr dat ศ™i รฎl adฤƒugฤƒm la setul de factori primi.
  • รŽn cele din urmฤƒ, รฎmpฤƒrศ›im la acest numฤƒr prim ศ™i repetฤƒm โ€‹โ€‹aceศ™ti paศ™i pรขnฤƒ ajungem la 1.
  • Toate acestea se realizeazฤƒ รฎn complexitatea timpului O(log(n)), รฎmbunฤƒtฤƒศ›ind foarte mult eficienศ›a soluศ›iei.
  • Ceea ce face posibilฤƒ calcularea factorilor primi ai unor numere mult mai mari decรขt cei cu care am fi putut sฤƒ ne ocupฤƒm folosind abordarea anterioarฤƒ.

Exemplu:

A doua modalitate este de a verifica dacฤƒ numฤƒrul poate fi scris ca 6n-1 sau 6n+1, deoarece orice numฤƒr prim, altul decรขt 2 ศ™i 3, ar trebui scris รฎn una dintre cele douฤƒ formule. de exemplu, 5=6(1)-1, 19=6(3)+1,... .

algoritm:

Definiศ›i o matrice pentru a stoca cel mai mic factor prim al fiecฤƒrui numฤƒr cu valoarea indexului ca valoare iniศ›ialฤƒ pentru fiecare element al mulศ›ime.

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 Factori primi folosind iteraศ›ia

Aici, vom afiศ™a un cod รฎn Python limbaj pentru a gฤƒsi factorii primi ai unui numฤƒr dat รฎntr-o metodฤƒ iterativฤƒ:

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)

ieศ™ire:

Enter the number you want: 4
4

Python Factori primi care folosesc recursiunea

Aceastฤƒ secศ›iune aratฤƒ un cod รฎn Python limbฤƒ folosind metoda sitฤƒ pentru a gฤƒsi factorii primi ai unui numฤƒr dat.

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)

ieศ™ire:

Enter the number you want: 4
2
2

Programul de factori primi C folosind iteraศ›ia

Este aceeaศ™i soluศ›ie ca cea iterativฤƒ python, dar scrisฤƒ รฎn Limbajul C.

Cerem utilizatorului sฤƒ introducฤƒ numฤƒrul, apoi pentru fiecare numฤƒr de la 2 la rฤƒdฤƒcina pฤƒtratฤƒ a acestui numฤƒr, trebuie sฤƒ verificฤƒm dacฤƒ este divizibil prin imprimarea tuturor apariศ›iilor acestui factor.

#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;
}

ieศ™ire:

Enter the number you want: 2
2

C Programul de factori primi care utilizeazฤƒ recursiunea

C Programul de factori primi care utilizeazฤƒ recursiunea

Aceasta este aceeaศ™i soluศ›ie ca cea recursivฤƒ python, dar scrisฤƒ รฎn C.

Putem cere utilizatorului sฤƒ introducฤƒ numฤƒrul; apoi, construim tabloul de numere prime care stocheazฤƒ cel mai mic factor prim al fiecฤƒrui numฤƒr. รŽn cele din urmฤƒ, numim funcศ›ia recursivฤƒ Factori primi, care รฎmparte numฤƒrul dat la cel mai mic factor prim al sฤƒu ศ™i se reaminteศ™te pรขnฤƒ cรขnd ajunge la unu.

#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;
}

ieศ™ire:

Enter the number you want: 2
2

Cรขteva fapte interesante despre numerele prime

  • Unul dintre cele mai interesante fapte este cฤƒ orice numฤƒr par, altul decรขt 2, poate fi suma a douฤƒ numere prime.
  • De exemplu: 4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3 โ€ฆ etc.
  • Un alt fapt este cฤƒ nu existฤƒ numere prime consecutive, altele decรขt 2 ศ™i 3, deoarece singurul numฤƒr prim par este numฤƒrul 2.
  • De asemenea, toate numerele prime, cu excepศ›ia lui 2 ศ™i 3, pot fi scrise sub urmฤƒtoarea formฤƒ: 6 * n + 1 sau 6 * n โ€“ 1, unde n este un numฤƒr รฎntreg pozitiv.
  • Setul de factori primi ai unui numฤƒr este unul unic.
  • Numฤƒrul 1 nu este nici prim, nici compus.
  • Descompunerea รฎn factori primi a numerelor poate ajuta la rezolvarea unor probleme precum divizibilitatea, simplificarea fracศ›iilor ศ™i gฤƒsirea numitorilor comuni ai diferitelor fracศ›ii.
  • De asemenea, una dintre utilizฤƒrile interesante ale factorizฤƒrii prime este ruperea codurilor secrete care se bazeazฤƒ pe numere.

Rezumaศ›i aceastฤƒ postare cu: