23 votos

Pregunta acerca de un programa de generación de palindrómicas números primos

Yo soy un programador y diseñador de software. Definitivamente, no soy un matemático y mis matemáticas es bastante básica.

Uno de mis colegas me desafió a generar un capicúa primer número, al menos 1000 dígitos de largo y sólo utilizando los dígitos 1 y 7.

Escribí un 1 minuto a Java hack construido alrededor de un instintivo y defectuosa de la conjetura: vamos a tratar de construir un pequeño palindrómicas primer número de la primera y, a continuación, de forma aleatoria agregar el mismo dígito antes y después, con la esperanza de conseguir otro. Suena un poco infantil, pero todo aquello era sólo un juego.

Bien con mi sorpresa que "trabaja", o el tipo de. Obviamente, si usted toma un capicúa primer y anexar y anteponer un dígito (1, 3, 7 o 9), usted no consigue otra palindrómicas prime. Pero si sigues con la adición de dígitos al azar antes y después, parece que, finalmente, llegar a otro palindrómicas prime, y esto sucede... muy a menudo.

Con esto se tambalea y sin sentido del método, me las arreglé para ganar la apuesta y generar este número, en unos 10 minutos:

71771177771711117177717711111717117111711777117717117117777117711117177711177777171777717111771777717777111711717711177711177771771717117777177777777771777111177717177777771177177717777171177771771111717177777117717117711777177771177111711777711717711717771177771711117117171171771111771717777711177171171771717111117711111711177717171117777777111171777717777117117711177111711771777771111777171117711717711117777117111711177771777111777111777117777171711711717111771117777111777171111711111111717177171111117111771117177777771711717171171171117171171177111171777117717771177771171717111771111117777177771111117711171717117777117771771177717111177117117171117117117171711717777777171117711171111117177171711111111711117177711177771117711171711711717177771177711177711177717777111711171177771111771711771117177711117777717711711177111771171177771777717111177777771117171777111711111771111171717717117177111777771717711117717117171171111717777117771711771711777711711177117777177711771171771177777171711117717777117177771777177117777777171777111177717777777777177771171717717777111777111771711711177771777717711171777717177777111777171111771177771171171771177711711171171711111771777171111717777117717

Es capicúa, es 1199 dígitos de largo, y parece ser la mejor o, al menos, de Mathematica PrimeQ dice así, pero yo no prueba con un método determinista.

Este es el programa:

import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class PalindromicPrimeFinder implements Runnable {

    /**
     * Test main
     */
    public static void main(String[] args) {

        int maxDepth = 50;
        int testCertainty = 20;
        Character[] digitsFinal = { '1', '7' }; // should be a subset of {1, 3, 7, 9}
        Character[] digitsAll = { '1', '7' };
        PrintWriter writer = new PrintWriter(System.out);

        PalindromicPrimeFinder finder = new PalindromicPrimeFinder(
                maxDepth, testCertainty, digitsFinal, digitsAll, writer);

        finder.run();

    }


    private final Random random = new Random();

    private final int maxDepth;
    private final int testCertainty;
    private final Character[] digitsFinal;
    private final Character[] digitsAll;
    private final PrintWriter writer;


    /**
     * Constructor.
     * 
     * @param start The starting number
     * @param maxDepth Max search depth
     * @param testCertainty Certainty of primality test
     * @param digitsFinal final digits (subset of {1, 3, 7, 9})
     * @param digitsAll all digits
     */
    public PalindromicPrimeFinder(int maxDepth,
            int testCertainty, Character[] digitsFinal, Character[] digitsAll,
            PrintWriter writer) {
        this.maxDepth = maxDepth;
        this.testCertainty = testCertainty;
        this.digitsFinal = digitsFinal;
        this.digitsAll = digitsAll;
        this.writer = writer;
    }


    /**
     * Run method
     */
    @Override
    public void run() {
        String start = ""+digitsFinal[random.nextInt(digitsFinal.length)];
        findPalindromicPrime(start, 0);
    }

    /**
     * Worker recursive method
     * @param number current number
     * @param depth current depth
     */
    private void findPalindromicPrime(String number, int depth) {

        for (char digit : digitsFinal) {
            String nextNumber = digit + number + digit;
            if (new BigInteger(nextNumber).isProbablePrime(testCertainty)) {
                writer.println("New prime [length=" + nextNumber.length()
                        + "]: " + nextNumber + "\n");
                writer.flush();
                findPalindromicPrime(nextNumber, 0);
                return;
            }
        }

        if (depth > maxDepth) {
            return;
        }

        List<Character> digitsAll_shuffled = new ArrayList<Character>(
                Arrays.asList(digitsAll));
        Collections.shuffle(digitsAll_shuffled, random);
        for (char digit : digitsAll_shuffled) {
            String nextNumber = digit + number + digit;
            findPalindromicPrime(nextNumber, depth + 1);
        }

    }

}

En realidad, a veces mi programa puede generar números al igual que uno en un instante, otras veces sólo se produce un error o se bloquea. Si se cuelga por horas, usted tiene que interrumpir (CTRL+C).

Estoy interesado, de la vana curiosidaden saber por qué funciona (cuando lo hace) y si se usa un conocido de palindrómicas de los números primos. Soy bastante ignorante en matemáticas, pero yo soy una persona curiosa.

EDIT: puedes leer mi respuesta.

EDIT2: he creado un multi-threaded programa que se da por vencido después de un tiempo de espera. Echa un vistazo si tienes tiempo libre. :)

12voto

jftuga Puntos 2128

Encontrar palindrómicas de los números primos no es muy duro, pero más bien probando y etiquetado de ellos como Primer lugar de la PRP (Probable Prime) es el trabajo duro. Usted puede encontrar la lista de los más grandes del mundo palindrómicas de los números primos aquí

Y la razón por la que acredite la mayoría de ellos requiere de mucho tiempo se encuentra en impar de dígitos en ellos. Es que si se podía expresar su número como $k*2^n +- 1$, a continuación, demostrando que es mucho más fácil usando varios algoritmos, pero desde palindrómicas de los números primos por lo general tienen más extraño dígitos de $0$, entonces su búsqueda de procedimiento se hace demasiado largo.

Como un ejemplo, el mejor número capicúa es de la siguiente forma (la más pequeña es de $101$):

$100000000000...00000000000000001$

Puede ser fácilmente expresada como $5^n*2^n + 1$ y por lo tanto fácil de hacer primility de la prueba. Ocurrencia de una no-dígito cero en cualquier posición, a causa de la energía de $2 dólares en la fórmula para ser disminuido. Así que el mejor lugar para una dígitos está cerca del centro de número.

De nuevo como un ejemplo de que el poder de los $2$ es cerca de $n/2$

$100000000000...007700...00000000000000001$

Actualizado

Y para la generación de la cantidad que usted puede construir una simple fórmula como la siguiente en Mathematica:

Palindromic[n_, digit_, position_] := 
  (10^n - 1)/9 + (digit - 1) (10^position + 10^(n - position - 1))

In[1]:= Palindromic[20, 7, 9]

Out[1]= 11111111177111111111

7voto

gd1 Puntos 334

De hecho, he encontrado una razón, y es tan estúpido que me siento de haber desperdiciado su tiempo.

La razón es simple: para un número relativamente pequeño de dígitos, parece que palindrómicas números primos no son tan escasos!

Yo era capaz de encontrar a muy largo palindrómicas de los números primos sólo generar de forma aleatoria.

Estoy satisfecho de esta conclusión. Es claro y simple: no es una característica especial de palindrómicas de los números primos, es sólo casualidad. :)
Yo estaba un poco sesgada por el hecho de que los números primos son "especiales" (también para las personas como yo, que no es un matemático) y palíndromo son "especiales", así que prepara un palíndromo debe ser muy raro. Pero esto no es tan cierto.

Los comentarios y explicaciones de personas competentes, si es necesario, son muy bienvenidos. :)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X