2016-11-19 5 views
0

Я нахожу код в java, чтобы найти простые числа, но чтобы найти следующий, мне нужно использовать это простое число с 8761 цифрами [P] (найдено с помощью этого код) и еще одно простое число, меньшее, чем P в данном диапазоне, прямо сейчас я ищу простые числа на расстоянии 250 миллионов.Найти числа больших чисел (~ 8000 цифр) в заданном диапазоне

Проблема заключается в нахождении всех простых чисел внутри этого диапазона. Используя сито эрастстостенов, я получил от 125 М (нечетные числа) до 6 миллионов вероятных простых чисел, прежде чем он стал медленным. Но это далеко, как я понял.

Поскольку BigInteger's .isPrime (1) занимает 3 минуты для КАЖДОГО номера, у меня бы были дети в колледже к тому времени, когда я закончу это.

В моем коде я использую расстояние между P и PRP, чтобы избежать использования BigIntegers. Также я храню это в .txt, с которого я читаю и пишу. Вот небольшая часть моего кода:

//Stores PRPs to List<Long> Erros = new ArrayList(); 

BigInteger Primo = new BigInteger("1"); 

while (Primo.longValueExact() <= Max){ 

     while(Erros_Eliminados.size() < 200000){ 

      Primo = Primo.nextProbablePrime(); 
      BigInteger R1 = BPrimo_Dado.mod(Primo); //[BPrimo_Dado = P = 8761 Digits number] 

      long R = R1.longValue(); 

      while(R <= Max){ //Max = 250000000 

       if(R >= Min){ //Min = 0 

        Erros_Eliminados.add(R); 

       } 

       R += Primo.longValue(); 

      } 

     } 

     ... 
     //removes the ErrosEliminados from Erros List and save it again to .txt 

} 

** Я также использую похожести коды для простых чисел между 250M и 1 миллиард, и больше, чем 1 миллиард (Чтение из bitlist) с некоторыми незначительными изменениями ...

Итак, вопрос: какой самый быстрый способ найти эти большие числа чисел? Есть ли лучший способ вместо сита? Я открыт для чего-нибудь ...

PS: Это мой первый вопрос, и, учитывая мой вопрос, это странно, что есть большая вероятность, что я нарушаю несколько правил поведения, например, расплывчатые или что-то в этом роде, поэтому простите меня, если это в этом случае, пожалуйста, сообщите, чтобы я мог что-то исправить.

+0

Добро пожаловать в StackOverflow! Не стесняйтесь читать некоторые вопросы, пока вы ждете. http://stackoverflow.com/help/asking. Если вы считаете, что чего-то не хватает, не стесняйтесь [edit] –

+0

Я мог бы неправильно понять ваш код здесь, но не должен иметь строку «BigInteger R1 = BPrimo_Dado.mod (Primo);' be 'BigInteger R1 = Primo.subtract (BPrimo_Dado.mod (Примо)); – SpiderPig

+0

Почему вы это делаете? Это звучит как проблема X-Y. – erickson

ответ

2

Класс BigInteger может генерировать большие простые числа для вас: BigInteger.probablePrime(), а также найти следующее премьер: BigInteger.nextProbablePrime().

+0

Да, но это займет слишком много времени для простых чисел такого размера. Я протестировал его, но я даже не смог получить результат, прежде чем я сдался ... – BarriaKarl

+1

Я сомневаюсь, что вы можете написать более быстрый код. Большие числа могут быть медленными для тестирования, поэтому используются такие методы, как Miller-Rabin. – rossum

+0

@BarriaKarl: посмотрите исходный код 'BigInteger.nextProbablePrime()'. Это делает сито эратосфенов, за которым следует мельник-рабин. Если вы можете сделать лучше в Java, тогда Oracle захочет иметь ваш код. –