Algoritmo dei fattori primi: C, Python Esempio

โšก Riepilogo intelligente

L'algoritmo dei fattori primi scompone qualsiasi numero intero positivo in un prodotto di numeri primi utilizzando la divisione per tentativi fino alla radice quadrata, oppure una variante del crivello di Eratostene che memorizza ogni piรน piccolo fattore primo.

  • ๐Ÿงฎ Definizione: I fattori primi di un numero intero sono i numeri primi il cui prodotto รจ uguale al numero stesso; 10 si divide in 2 e 5.
  • ๐Ÿ” Divisione processuale: L'iterazione da 2 fino a sqrt(n) e la divisione ogni volta che il modulo รจ zero ha una complessitร  temporale di O(sqrt(n)).
  • ๐Ÿงฐ Metodo del setaccio: Memorizzare il piรน piccolo fattore primo per ogni valore fino a un certo limite riduce la fattorizzazione a circa O(log n) per ogni query.
  • ๐Ÿ Python Code: Iterativo e ricorsivo Python Le implementazioni stampano ciascun fattore primo di un numero inserito.
  • ๐Ÿ’ป C Code: L'abbinamento di programmi C iterativi e ricorsivi dimostra la stessa logica utilizzando stdio e un array precalcolato.
  • ๐Ÿ” Usi: La fattorizzazione in numeri primi รจ alla base di verifiche di divisibilitร , semplificazione delle frazioni, denominatori comuni e chiavi crittografiche basate sui numeri.

Algoritmo dei fattori primi

Cos'รจ una fattorizzazione prima?

Il fattore primo di un numero รจ un fattore che รจ a sua volta un numero primo, divisibile solo per 1 e per se stesso.

Esempio: I fattori primi di 10 sono 2 e 5, poichรฉ 2 ร— 5 = 10.

Trovare i Fattori Primi utilizzando l'Iterazione

Itera da 2 fino a sqrt(n) e verifica la divisibilitร . Finchรฉ n รจ divisibile per il candidato corrente, dividi e stampa.

Esempio: ogni numero primo maggiore di 40 si adatta a n2+n+41, quindi n = 0, 1, 2 produce 41, 43, 47.

Come stampare un fattore primo di un numero?

  • Itera i numeri da 2 fino a sqrt(n).
  • Verifica il modulo di n per ciascun candidato; un resto pari a zero indica che il candidato รจ un fattore primo.
  • Raccogli tutti i numeri primi che dividono n.
  • La routine ha una complessitร  temporale di O(sqrt(n)).

Algoritmo:

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

Algoritmo del setaccio

Il metodo del crivello memorizza il piรน piccolo fattore primo di ogni numero fino a un limite massimo, riducendo drasticamente i costi di fattorizzazione dopo il precalcolo.

  • Registra il piรน piccolo fattore primo di ogni numero intero fino al limite massimo.
  • Prendi il piรน piccolo numero primo e aggiungilo all'insieme dei fattori.
  • Dividi il numero per quel numero primo e ripeti l'operazione finchรฉ non raggiungi 1.
  • Ogni query viene eseguita in circa O(log n).

Esempio: Un numero primo diverso da 2 e 3 ha la forma 6n-1 o 6n+1. Ad esempio, 5 = 6(1)-1 e 19 = 6(3)+1.

Algoritmo: definire un schieramento che memorizza il piรน piccolo fattore primo di ciascun numero, utilizzando l'indice come valore iniziale per ogni elemento.

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]

Articoli Correlati

Python Fattori primi utilizzando l'iterazione

Le seguenti Python Il codice trova i fattori primi utilizzando il metodo iterativo della divisione per tentativi:

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)

Produzione:

Enter the number you want: 4
2
2

Python Fattori primi mediante ricorsione

Migliori Python Il codice seguente utilizza il metodo del crivello per trovare i fattori primi di un dato numero.

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)

Produzione:

Enter the number you want: 4
2
2

Programma C Prime Factors utilizzando l'iterazione

La stessa soluzione iterativa scritta in C: inserisci un numero, quindi per ogni candidato da 2 fino a sqrt(n), verifica la divisibilitร  e stampa ogni occorrenza di un fattore primo.

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

Produzione:

Enter the number you want: 2
2

C Programma a fattori primi che utilizza la ricorsione

C Programma a fattori primi che utilizza la ricorsione

La versione ricorsiva C rispecchia la Python 1: costruire l'array dei piรน piccoli fattori primi, quindi ripetere la divisione per quel fattore finchรฉ n non raggiunge 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;
}

Produzione:

Enter the number you want: 2
2

Alcuni fatti interessanti sui numeri primi

  • Qualsiasi numero pari diverso da 2 puรฒ essere scritto come somma di due numeri primi (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Non ci sono altri numeri primi consecutivi oltre a 2 e 3, perchรฉ 2 รจ l'unico numero primo pari.
  • Ogni numero primo, eccetto 2 e 3, ha la forma 6n + 1 o 6n โˆ’ 1, dove n รจ un intero positivo.
  • L'insieme dei fattori primi di un numero รจ unico.
  • Il numero 1 non รจ nรฉ primo nรฉ composto.
  • La scomposizione in fattori primi aiuta a risolvere i problemi di divisibilitร , a semplificare le frazioni e a trovare i denominatori comuni.
  • La fattorizzazione in numeri primi รจ alla base anche dei codici crittografici basati sui numeri.

DOMANDE FREQUENTI

La scomposizione in fattori primi scompone un numero intero in un prodotto di numeri primi, ad esempio 12 = 2 ร— 2 ร— 3. I fattori primi sono unici per ogni numero intero maggiore di uno.

Se n ha un fattore maggiore di sqrt(n), il suo corrispondente รจ piรน piccolo e sarebbe giร  stato trovato. Tutto ciรฒ che supera sqrt(n) ripete il lavoro.

La divisione di prova ha una complessitร  temporale di O(sqrt(n)). Il crivello precalcola i fattori primi piรน piccoli in O(N log log N), quindi risolve ogni fattorizzazione in circa O(log n).

Si utilizza il crivello quando si fattorizzano molti numeri entro un limite superiore noto. Un precalcolo consente a ogni successiva query di essere eseguita in circa O(log n).

No. Il numero 1 non รจ nรฉ primo nรฉ composto, quindi non compare mai nell'elenco dei fattori primi. La fattorizzazione in numeri primi utilizza numeri primi maggiori o uguali a 2.

La fattorizzazione in numeri primi รจ alla base dei test di divisibilitร , della semplificazione delle frazioni, del minimo comune multiplo (mcm) e del massimo comune divisore (MCD), nonchรฉ della crittografia a chiave pubblica come RSA, dove fattorizzare un prodotto di grandi dimensioni di due numeri primi รจ un'operazione complessa.

I sistemi di intelligenza artificiale applicano la fattorizzazione in numeri primi alle caratteristiche della teoria dei numeri, all'analisi delle chiavi crittografiche e all'apprendimento federato sicuro. La ricerca sull'apprendimento automatico post-quantistico studia anche la resistenza alla fattorizzazione.

Sรฌ. GitHub Copilot e assistenti IA simili automatizzano le operazioni ripetitive per le routine di divisione per tentativi e di setacciatura, sebbene gli sviluppatori verifichino comunque la complessitร  e i casi limite come n = 1.

Riassumi questo post con: