Algoritmo de factorización de ruedas

Dado un número N. La tarea es comprobar si el número dado es número primo o no.
Ejemplos: 
 

Entrada: N = 987 
Salida: No es un número primo 
Explicación: 
Como, 987 = 3*7*47. Por lo tanto, 987 no es un número primo.
Entrada: N = 67 
Salida: Número primo 
 

Método de factorización de rueda: 
La factorización de rueda es la mejora del método Tamiz de Eratóstenes . Para la factorización de la rueda, se comienza con una pequeña lista de números, llamada base , generalmente los primeros números primos , luego se genera la lista, llamada rueda , de los enteros que son coprimos con todos los números de la base. Luego, para encontrar el divisor más pequeño del número a factorizar, uno lo divide sucesivamente por los números en la base y en la rueda
 

Digamos que seleccionamos la base como {2, 3, 5} y los números que son coprimos con la base son {7, 11, 13, 17, 19, 23, 29, 31} se configuran como la rueda
Para entenderlo más, vea el patrón en la imagen de arriba que exhiben los números. El mcm de los tres primeros números primos es 30. Los números (menos de 30) que terminan en 7, 1 y 3 y no son múltiplos de 2, 3 y 5 y siempre son primos, es decir, {7 , 11 , 13, 17, 19, 23, 29} . Agregando el nro. 31 a esta lista y luego si sumamos múltiplos de 30 a cualquiera de los números de la lista, nos da un Número Primo
Algoritmo para el método de factorización de ruedas: 
 

For the number N to be Prime or not:
bool isPrime(x) {
    if (x < 2) {
          return False;
    }
    for N in {2, 3, 5} {
          return False;
    }
    for p= [0, sqrt(N)] such that p = p + 30: {
          for c in [p+7, p+11, p+13, p+17, p+19, p+23, p+29, p+31] {
              if c > sqrt(N)      
                  break;
              else if N % (c+p) = 0:
                  return False;
          }
    }
}
return True;
}

Enfoque: 
El siguiente es el enfoque para el algoritmo anterior: 
 

  1. Para la prueba de primalidad de un número N dado , verifique si el número dado es divisible por cualquiera de los números 2, 3, 5 o no.
  2. Si el número no es divisible por ninguno de 2, 3, 5, compruebe si el número formado al sumar múltiplos de 30 en la lista [7, 11, 13, 17, 19, 23, 29, 31] divide el número dado N o no. En caso afirmativo, el número dado no es un número primo , de lo contrario es un número primo .

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

C++

// C++ program to check if the
// given number is prime using
// Wheel Factorization Method
#include "bits/stdc++.h"
using namespace std;
 
// Function to check if a given
// number x is prime or not
void isPrime(int N)
{
    bool isPrime = true;
    // The Wheel for checking
    // prime number
    int arr[8] = { 7, 11, 13, 17,
                   19, 23, 29, 31 };
 
    // Base Case
    if (N < 2) {
        isPrime = false;
    }
 
    // Check for the number taken
    // as basis
    if (N % 2 == 0 || N % 3 == 0
        || N % 5 == 0) {
        isPrime = false;
    }
 
    // Check for Wheel
    // Here i, acts as the layer
    // of the wheel
    for (int i = 0; i < sqrt(N); i += 30) {
 
        // Check for the list of
        // Sieve in arr[]
        for (int c : arr) {
 
            // If number is greater
            // than sqrt(N) break
            if (c > sqrt(N)) {
                break;
            }
 
            // Check if N is a multiple
            // of prime number in the
            // wheel
            else {
                if (N % (c + i) == 0) {
                    isPrime = false;
                    break;
                }
            }
 
            // If at any iteration
            // isPrime is false,
            // break from the loop
            if (!isPrime)
                break;
        }
    }
 
    if (isPrime)
        cout << "Prime Number";
    else
        cout << "Not a Prime Number";
}
 
// Driver's Code
int main()
{
    int N = 121;
 
    // Function call for primality
    // check
    isPrime(N);
    return 0;
}

Java

// Java program to check if the
// given number is prime using
// Wheel Factorization Method
import java.util.*;
 
class GFG{
 
// Function to check if a given
// number x is prime or not
static void isPrime(int N)
{
    boolean isPrime = true;
     
        // The Wheel for checking
    // prime number
    int []arr = { 7, 11, 13, 17,19, 23, 29, 31 };
 
    // Base Case
    if (N < 2) {
        isPrime = false;
    }
 
    // Check for the number taken
    // as basis
    if (N % 2 == 0 || N % 3 == 0
        || N % 5 == 0) {
        isPrime = false;
    }
 
    // Check for Wheel
    // Here i, acts as the layer
    // of the wheel
    for (int i = 0; i < Math.sqrt(N); i += 30) {
 
        // Check for the list of
        // Sieve in arr[]
        for (int c : arr) {
 
            // If number is greater
            // than sqrt(N) break
            if (c > Math.sqrt(N)) {
                break;
            }
 
            // Check if N is a multiple
            // of prime number in the
            // wheel
            else {
                if (N % (c + i) == 0) {
                    isPrime = false;
                    break;
                }
            }
 
            // If at any iteration
            // isPrime is false,
            // break from the loop
            if (!isPrime)
                break;
        }
    }
 
    if (isPrime)
        System.out.println("Prime Number");
    else
        System.out.println("Not a Prime Number");
}
 
// Driver's Code
public static void main(String args[])
{
    int N = 121;
 
    // Function call for primality
    // check
    isPrime(N);
}
}
 
// This code is contributed by Surendra_Gangwar

C#

// C# program to check if the
// given number is prime using
// Wheel Factorization Method
using System;
 
class GFG{
 
// Function to check if a given
// number x is prime or not
static void isPrime(int N)
{
    bool isPrime = true;
     
     // The Wheel for checking
    // prime number
    int []arr = { 7, 11, 13, 17,19, 23, 29, 31 };
 
    // Base Case
    if (N < 2) {
        isPrime = false;
    }
 
    // Check for the number taken
    // as basis
    if (N % 2 == 0 || N % 3 == 0
        || N % 5 == 0) {
        isPrime = false;
    }
 
    // Check for Wheel
    // Here i, acts as the layer
    // of the wheel
    for (int i = 0; i < (int)Math.Sqrt(N); i += 30) {
     
        // Check for the list of
        // Sieve in arr[]
        foreach (int c in arr) {
 
            // If number is greater
            // than sqrt(N) break
            if (c > (int)Math.Sqrt(N)) {
                break;
            }
 
            // Check if N is a multiple
            // of prime number in the
            // wheel
            else {
                if (N % (c + i) == 0) {
                    isPrime = false;
                    break;
                }
            }
 
            // If at any iteration
            // isPrime is false,
            // break from the loop
            if (!isPrime)
                break;
        }
    }
 
    if (isPrime)
        Console.WriteLine("Prime Number");
    else
        Console.WriteLine("Not a Prime Number");
}
 
// Driver's Code
public static void Main(String []args)
{
    int N = 121;
 
    // Function call for primality
    // check
    isPrime(N);
}
}
 
// This code is contributed by Yash_R

Python3

# Python3  program to check if the
# given number is prime using
# Wheel Factorization Method
import math
 
# Function to check if a given
# number x is prime or not
def isPrime( N):
 
    isPrime = True;
    # The Wheel for checking
    # prime number
    arr= [ 7, 11, 13, 17,
                19, 23, 29, 31 ]
 
    # Base Case
    if (N < 2) :
        isPrime = False
     
    # Check for the number taken
    # as basis
    if (N % 2 == 0 or N % 3 == 0
        or N % 5 == 0):
        isPrime = False
     
    # Check for Wheel
    # Here i, acts as the layer
    # of the wheel
    for i in range(0,int(math.sqrt(N)), 30) :
 
        # Check for the list of
        # Sieve in arr[]
        for c in  arr:
 
            # If number is greater
            # than sqrt(N) break
            if (c > int(math.sqrt(N))):
                break
             
            # Check if N is a multiple
            # of prime number in the
            # wheel
            else :
                if (N % (c + i) == 0) :
                    isPrime = False
                    break
 
            # If at any iteration
            # isPrime is false,
            # break from the loop
            if (not isPrime):
                break
 
    if (isPrime):
        print("Prime Number")
    else:
        print("Not a Prime Number")
 
# Driver's Code
if __name__ == "__main__":
    N = 121
 
    # Function call for primality
    # check
    isPrime(N)
 
# This code is contributed by chitranayal

Javascript

<script>
 
// JavaScript program to check if the
// given number is prime using
// Wheel Factorization Method
 
 
// Function to check if a given
// number x is prime or not
function isPrime(N)
{
    let isPrime = true;
    // The Wheel for checking
    // prime number
    let arr = [ 7, 11, 13, 17,
                19, 23, 29, 31 ];
 
    // Base Case
    if (N < 2) {
        isPrime = false;
    }
 
    // Check for the number taken
    // as basis
    if (N % 2 == 0 || N % 3 == 0
        || N % 5 == 0) {
        isPrime = false;
    }
 
    // Check for Wheel
    // Here i, acts as the layer
    // of the wheel
    for (let i = 0; i < Math.sqrt(N); i += 30) {
 
        // Check for the list of
        // Sieve in arr[]
        for (let c of arr) {
 
            // If number is greater
            // than sqrt(N) break
            if (c > Math.sqrt(N)) {
                break;
            }
 
            // Check if N is a multiple
            // of prime number in the
            // wheel
            else {
                if (N % (c + i) == 0) {
                    isPrime = false;
                    break;
                }
            }
 
            // If at any iteration
            // isPrime is false,
            // break from the loop
            if (!isPrime)
                break;
        }
    }
 
    if (isPrime)
        document.write("Prime Number");
    else
        document.write("Not a Prime Number");
}
 
// Driver's Code
 
 
    let N = 121;
 
    // Function call for primality
    // check
    isPrime(N);
 
 
    // This code is contributed by _saurabh_jaiswal
     
</script>
Producción: 

Not a Prime Number

 

Complejidad de tiempo: O(N 3/2 )

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por piyush25pv 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 *