2010-01-13 12 views
5

Primal Check es probablemente uno de "esos" problemas difíciles en matemáticas. Entonces, ¿cuál es el mejor y más rápido algoritmo disponible para verificar la primalidad de un gran número? El más crudo y la manera más lenta, probablemente es:Algoritmo de verificación de primalidad

public static bool IsPrime(int i) 
{ 
    for (var x = 2; x < i - 1; i++) 
    { 
     if (i % x == 0) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

recientemente he leído que el algoritmo RSA de 768 bits se ha resquebrajado el uso de la fuerza bruta, usando una matriz de computación en red. ¿Cómo realizan la fuerza bruta en un enorme número primo? ¿Asume cada unidad de procesamiento una serie de números, factoriza y verifica la primalidad de todos los números que se encuentran en ese rango?

+0

¿No solo necesitas el bucle for para ir hasta la mitad del número que estás atando para encontrar la primalidad? Por ejemplo, si su número fue 100, entonces 50 es el número más grande que podría ser un factor de ello, ¿no? –

+8

ceil (sqrt (i)) es el factor más importante que necesita para verificar – swegi

+1

tal vez estoy siendo tonto, pero hubiera pensado que piso (sqrt (i)) era el factor más importante que necesitaba comprobar? –

Respuesta

10

Salida primality tests en la Wikipedia para saber cómo dirigirse a los algoritmos actuales

Con respecto a su aplicación ingenua, tenga en cuenta que puede devolver inmediatamente falsa si el número es divisible por 2, lo que le permite simplemente comprueba extraña números. Además, si no encuentra un factor donde x < = sqrt (i), es primo. Esto se debe a que si encontró un factor mayor que sqrt (i), entonces debe asociarse con un factor menor que sqrt (i). Entonces, si primero no encuentras el factor más pequeño, terminaste.

También hay par más trucos que se pueden aplicar a un algoritmo ingenuo antes de tener que ir en tropel fuera a https://mathoverflow.net/ ayuda :)

+0

Um. No vayas caminando a mathoverflow.net para obtener ayuda, ya que este no es un tema de investigación/académico. (Podrían ser bienvenidas las preguntas específicas sobre un algoritmo específico de prueba de primalidad) –

-1
public static bool IsPrime(int i) 
{ 
    for (var x = 2; x < (i/2); x++) 
    { 
     if (i % x == 0) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
5

Esto debería ser un poco más rápido:

public static bool IsPrime(int i) {   
    // only go up to the root of i 
    // +1 to be save from floating point rounding errors, ceil should work too. 
    var max = sqrt(i) + 1; 

    // skip numbers dividable by 2, except 2 itself 
    if (i == 2) return true; 
    if (i % 2 == 0) return false; 
    for (var x = 3; x < max; x+=2) { 
     if (i % x == 0) { 
      return false; 
     } 
    } 
    return true; 
} 
7

Cracking RSA-768 no implicar directamente a cualquier algoritmo de comprobación de primalidad, más bien lo que se necesitaba era un algoritmo factorización: RSA-768 es el producto de dos números primos muy grandes, y descifrarlo implica encontrar estos números primos. El algoritmo de factorización utilizado fue el Number Field Sieve de Lenstra.

Puede leer el artículo completo aquí: Factorization of a 768-bit RSA modulus.

1

Pruebas de primalización! = Factorización.

Romper una clave pública RSA en particular y recuperar la clave privada, requiere factorización.

El proceso de construcción de un par de claves pública/privada RSA incluye pruebas de primalidad. La mayoría de las pruebas de primalidad no utilizadas para la factorización no producen una respuesta 100% definitiva, sino que es probabilistic con una probabilidad arbitrariamente alta (más iteraciones de prueba = mayor probabilidad).

Y técnicamente puede tener un deterministic primality test que sea rápido y no implique realmente calcular ningún factor del número en cuestión.

Cuestiones relacionadas