Algoritmo de fator principal: C, Python Exemplo

⚡ Resumo Inteligente

O Algoritmo de Fatoração Prima decompõe qualquer número inteiro positivo em um produto de números primos usando divisão por tentativa até a raiz quadrada, ou uma variante do Crivo de Eratóstenes que armazena cada menor fator primo.

  • 🧮 Definição: Os fatores primos de um número inteiro são os números primos cujo produto é igual a ele; 10 se decompõe em 2 e 5.
  • 🔁 Divisão de Julgamento: Iterar de 2 até sqrt(n) e dividir sempre que o módulo for zero leva tempo O(sqrt(n)).
  • 🧰 Método da peneiração: Armazenar o menor fator primo para cada valor até um limite reduz a fatoração para cerca de O(log n) por consulta.
  • 🐍 Python Code: Iterativo e recursivo Python As implementações imprimem cada fator primo de um número inserido.
  • 💻 C Code: Programas em C iterativos e recursivos correspondentes demonstram a mesma lógica usando stdio e um array pré-computado.
  • 🔐 Usos: A fatoração em números primos possibilita verificações de divisibilidade, simplificação de frações, denominadores comuns e chaves criptográficas baseadas em números.

Algoritmo de fator principal

O que é uma fatoração primária?

O fator primo de um número é um fator que também é um número. número primo, divisível apenas por 1 e por si mesmo.

Exemplo: Os fatores primos de 10 são 2 e 5, pois 2 × 5 = 10.

Encontrando os fatores principais usando iteração

Itere de 2 até sqrt(n) e verifique a divisibilidade. Enquanto n for divisível pelo candidato atual, divida e imprima.

Exemplo: todo número primo maior que 40 se encaixa n2+n+41, então n = 0, 1, 2 resulta em 41, 43, 47.

Como imprimir um fator primo de um número?

  • Itere os números de 2 até sqrt(n).
  • Verifique o módulo de n em relação a cada candidato; um resto zero significa que o candidato é um fator primo.
  • Colete todos os números primos que dividem n.
  • A rotina é executada em complexidade de tempo 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 de peneira

O método do Crivo armazena o menor fator primo de cada número até um limite máximo, reduzindo drasticamente o custo da fatoração após o pré-cálculo.

  • Registre o menor fator primo de cada número inteiro até o limite máximo.
  • Pegue o menor número de primos e adicione-o ao conjunto de fatores.
  • Divida o número por esse número primo e repita até que o resultado seja 1.
  • Cada consulta é executada em aproximadamente O(log n).

Exemplo: um primo diferente de 2 e 3 se encaixa na forma 6n-1 ou 6n+1. Por exemplo, 5 = 6(1)-1 e 19 = 6(3)+1.

Algoritmo: definir um ordem que armazena o menor fator primo de cada número, usando o índice como valor inicial para cada 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]

Artigos Relacionados

Python Fatores principais usando iteração

Os seguintes Python O código encontra os fatores primos usando o método iterativo de divisão por tentativa:

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)

Saída:

Enter the number you want: 4
2
2

Python Fatores principais usando recursão

O Python O código abaixo utiliza o método do crivo para encontrar os fatores primos de um número dado.

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)

Saída:

Enter the number you want: 4
2
2

Programa de fatores primos C usando iteração

A mesma solução iterativa escrita em CInsira um número e, para cada candidato de 2 até sqrt(n), verifique a divisibilidade e imprima todas as ocorrências de um fator 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;
}

Saída:

Enter the number you want: 2
2

Programa C Prime Factors usando recursão

Programa C Prime Factors usando recursão

A versão recursiva em C espelha a Python Uma das opções é construir a matriz dos menores fatores primos e, em seguida, repetir a divisão por esse fator até que n chegue a 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;
}

Saída:

Enter the number you want: 2
2

Alguns fatos interessantes sobre números primos

  • Qualquer número par diferente de 2 pode ser escrito como a soma de dois números primos (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • Não existem outros números primos consecutivos além de 2 e 3, pois 2 é o único número primo par.
  • Todos os números primos, exceto 2 e 3, têm a forma 6n + 1 ou 6n − 1, onde n é um número inteiro positivo.
  • O conjunto de fatores primos de um número é único.
  • O número 1 não é primo nem composto.
  • A fatoração em números primos auxilia na divisibilidade, simplificação de frações e na identificação de denominadores comuns.
  • A fatoração em números primos também é fundamental para códigos criptográficos baseados em números.

Perguntas Frequentes

A fatoração em números primos decompõe um número inteiro em um produto de números primos, por exemplo, 12 = 2 × 2 × 3. Os fatores primos são únicos para cada número inteiro maior que um.

Se n tiver um fator maior que sqrt(n), seu par é menor e já teria sido encontrado. Qualquer número maior que sqrt(n) se repete.

A divisão por tentativa tem complexidade O(√n). O crivo pré-calcula os menores fatores primos em O(N log log N) e, em seguida, resolve cada fatoração em aproximadamente O(log n).

Use o crivo ao fatorar muitos números dentro de um limite superior conhecido. Um pré-cálculo permite que cada consulta posterior seja executada em aproximadamente O(log n).

Não. O número 1 não é primo nem composto, portanto nunca aparece em uma lista de fatores primos. A fatoração em números primos utiliza números primos maiores ou iguais a 2.

A fatoração em números primos é fundamental para testes de divisibilidade, simplificação de frações, cálculo do MMC e MDC, e criptografia de chave pública como o RSA, onde fatorar um produto grande de dois números primos é difícil.

Os sistemas de IA aplicam a fatoração em números primos a características da teoria dos números, análise de chaves criptográficas e aprendizado federado seguro. A pesquisa em aprendizado de máquina pós-quântico também estuda a resistência à fatoração.

Sim. O GitHub Copilot e assistentes de IA semelhantes automatizam tarefas repetitivas para rotinas de divisão por tentativa e peneiramento, embora os desenvolvedores ainda verifiquem a complexidade e casos extremos, como n = 1.

Resuma esta postagem com: