Algoritmo de división de prueba para factorización prima

En este artículo, se analiza el método de división de prueba para comprobar si un número es primo o no. Dado un número N, la tarea es comprobar si el número es primo o no. 

Ejemplos: 

Entrada: N = 433 
Salida: Prime 
Explicación: 
Los únicos factores de 433 son 1 y 433. Por lo tanto, es un número primo. 

Entrada: N = 1263 
Salida: Compuesto 
Explicación: 
Los factores de 1263 son 1, 3, 421, 1263. Por lo tanto, es un número compuesto. 

Enfoque ingenuo: por definición, un número primo es un número entero mayor que 1, que solo es divisible por 1 y por sí mismo. Por lo tanto, inicializamos un bucle de 2 a N – 1 y verificamos la divisibilidad. El siguiente es el pseudocódigo para el enfoque:  

N <- input
initialise: i <- 2
while(i ≤ N - 1):
    if(N % i == 0):
        return "Composite"
return "Prime" 

Análisis de la Complejidad del Tiempo: 

  • Para cualquier número N dado , el bucle while se ejecuta N – 2 veces. Por lo tanto, la complejidad de tiempo para el ciclo while es O(N) .
  • La comprobación de divisibilidad se realiza en tiempo constante. Por lo tanto, la complejidad de tiempo para la condición if en el ciclo while es O(1) .
  • Por lo tanto, la complejidad temporal general del enfoque anterior es O(N) .

Método de división de prueba: la verificación de primalidad se puede realizar de manera más eficiente mediante el concepto del método de división de prueba. El método de división de prueba es una de las técnicas de factorización cruciales pero una de las más fáciles cuando se trata de factorización de enteros. 

Observación: El método anterior funciona con la observación de que el factor máximo para cualquier número N siempre es menor o igual que la raíz cuadrada (N). Esta conclusión se puede derivar de la siguiente manera: 

  • De la escuela de aritmética, es un hecho conocido que cualquier número compuesto se construye a partir de dos o más números primos.
  • Sean los factores de N n1, n2, etc. Los factores son mayores solo cuando existen dos factores n1 y n2 para el número N.
  • Por lo tanto, supongamos que n1 y n2 son los dos factores más grandes para el número N. Estos números n1 y n2 pueden ser mayores solo cuando tanto n1 como n2 son iguales .
  • Sea n1 = n2 = n . Por lo tanto, N = n * n . Por lo tanto, el factor más grande posible para N es la raíz cuadrada (N) .

Enfoque: A partir de la observación anterior, el enfoque de este algoritmo es sencillo. La idea es que en lugar de verificar hasta N – 1 para un factor, solo verificamos hasta la raíz cuadrada (N)

A continuación se muestra la implementación del enfoque anterior:  

C++

// CPP implementation of
// Trial Division Algorithm
#include <bits/stdc++.h>
 
using namespace std;
 
// Function to check if a number is
// a prime number or not
int TrialDivision(int N){
 
    // Initializing with the value 2
    // from where the number is checked
    int i = 2;
 
    // Computing the square root of
    // the number N
    int k = ceil(sqrt(N));
 
    // While loop till the
    // square root of N
    while(i<= k){
 
        // If any of the numbers between
        // [2, sqrt(N)] is a factor of N
        // Then the number is composite
        if(N % i == 0)
            return 0;
        i += 1;
    }
 
    // If none of the numbers is a factor,
    // then it is a prime number
    return 1;
}
 
// Driver code
int main()
{
    int N = 49;
    int p = TrialDivision(N);
 
    // To check if a number is a prime or not
    if(p)
        cout << ("Prime");
    else
        cout << ("Composite");
 
    return 0;
}
 
// This code is contributed by mohit kumar 29

Java

// Java implementation of
// Trial Division Algorithm
import java.util.*;
  
class GFG{
   
// Function to check if a number is
// a prime number or not
static int TrialDivision(int N){
 
    // Initializing with the value 2
    // from where the number is checked
    int i = 2;
 
    // Computing the square root of
    // the number N
    int k =(int) Math.ceil(Math.sqrt(N));
 
    // While loop till the
    // square root of N
    while(i<= k){
 
        // If any of the numbers between
        // [2, sqrt(N)] is a factor of N
        // Then the number is composite
        if(N % i == 0)
            return 0;
        i += 1;
    }
 
    // If none of the numbers is a factor,
    // then it is a prime number
    return 1;
}
 
// Driver Code
public static void main(String[] args)
{
  
    int N = 49;
    int p = TrialDivision(N);
 
    // To check if a number is a prime or not
    if(p != 0)
        System.out.print("Prime");
    else
        System.out.print("Composite");
 
}
}
 
// This code is contributed by shivanisinghss2110

Python3

# Python3 implementation of
# Trial Division Algorithm
 
# Function to check if a number is
# a prime number or not
def TrialDivision(N):
 
    # Initializing with the value 2
    # from where the number is checked
    i = 2
 
    # Computing the square root of
    # the number N
    k = int(N ** 0.5)
 
    # While loop till the
    # square root of N
    while(i<= k):
 
        # If any of the numbers between
        # [2, sqrt(N)] is a factor of N
        # Then the number is composite
        if(N % i == 0):
            return 0
        i += 1
 
    # If none of the numbers is a factor,
    # then it is a prime number
    return 1
     
# Driver code
if __name__ == "__main__":
    N = 49
    p = TrialDivision(N)
 
# To check if a number is a prime or not
    if(p):
        print("Prime")
    else:
        print("Composite")
        

C#

// C# implementation of
// Trial Division Algorithm
using System;
 
class GFG{
 
// Function to check if a number is
// a prime number or not
static int TrialDivision(int N){
 
    // Initializing with the value 2
    // from where the number is checked
    int i = 2;
 
    // Computing the square root of
    // the number N
    int k =(int) Math.Ceiling(Math.Sqrt(N));
 
    // While loop till the
    // square root of N
    while(i<= k){
 
        // If any of the numbers between
        // [2, sqrt(N)] is a factor of N
        // Then the number is composite
        if(N % i == 0)
            return 0;
        i += 1;
    }
 
    // If none of the numbers is a factor,
    // then it is a prime number
    return 1;
}
 
// Driver Code
public static void Main()
{
 
    int N = 49;
    int p = TrialDivision(N);
 
    // To check if a number is a prime or not
    if(p != 0)
        Console.Write("Prime");
    else
        Console.Write("Composite");
 
}
}
 
// This code is contributed by AbhiThakur

Javascript

<script>
 
// JavaScript implementation of
// Trial Division Algorithm
 
 
// Function to check if a number is
// a prime number or not
function TrialDivision(N){
 
    // Initializing with the value 2
    // from where the number is checked
    let i = 2;
 
    // Computing the square root of
    // the number N
    let k = Math.ceil(Math.sqrt(N));
 
    // While loop till the
    // square root of N
    while(i<= k){
 
        // If any of the numbers between
        // [2, sqrt(N)] is a factor of N
        // Then the number is composite
        if(N % i == 0)
            return 0;
        i += 1;
    }
 
    // If none of the numbers is a factor,
    // then it is a prime number
    return 1;
}
 
// Driver code
 
let N = 49;
let p = TrialDivision(N);
 
// To check if a number is a prime or not
if(p)
    document.write("Prime");
else
    document.write("Composite");
 
// This code is contributed by gfgking
 
</script>
Producción: 

Composite

 

Análisis de la Complejidad del Tiempo: 

  • El ciclo while se ejecuta por un máximo de raíces cuadradas (N) veces. Por lo tanto, la complejidad temporal del ciclo while es O(sqrt(N)) .
  • El tiempo de ejecución de todas las condiciones si son constantes. Por lo tanto, la complejidad temporal de las sentencias if es O(1) .
  • Por lo tanto, la complejidad temporal general es O(sqrt(N)) .

Método de división de prueba optimizado: el método de división de prueba anterior se puede optimizar aún más eliminando todos los números pares en el rango [2, K] donde K = raíz cuadrada (N) ya que 2 es el único número primo par. La complejidad general sigue siendo la misma, pero el número de ejecuciones se reduce a la mitad.

Nota: La optimización realizada en el método de división de prueba puede parecer muy pequeña, ya que este método es casi similar al enfoque ingenuo, excepto por el número de iteraciones. Sin embargo, esto reduce drásticamente el número de cálculos para valores más altos de N. Esto se explica mediante el siguiente gráfico trazado frente a los tiempos de ejecución correspondientes de los algoritmos: 

Publicación traducida automáticamente

Artículo escrito por vanshikagoyal43 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *