Мне нужно сгенерировать два простых числа p1, p2 больше 10 ^ 25 и их произведение n. и число «а» меньше п.

Почему я использую код ниже, результат 4 числа все 0.

public static void main(String args[]) {

        long min = (long) Math.pow(10, 25);
        long max = Long.MAX_VALUE;
        long p1 = (long)((Math.random()+1)*(max-min));
        long p2 = (long)((Math.random()+1)*(max-min));
        long n = p1 * p2 ;
        long a = (long)((Math.random())* n) ;
        System.out.println("p1= " + p1 + ", p2= " + p2 + ", n= " + n +",a= " + a);
}

Спасибо.

1
Jesse 20 Авг 2018 в 17:17

3 ответа

Лучший ответ

Вы получаете 0, потому что для представления Long.MAX_VALUE вам нужно 63 битов, но для представления 10^25 вам нужно 84 битов.

BigInteger maxLong = new BigInteger(String.valueOf(Long.MAX_VALUE));        
BigInteger pow_10_25 = BigInteger.TEN.pow(25);
System.out.println(maxLong.bitLength()); // 63
System.out.println(pow_10_25.bitLength()); // 84

Возможное решение - использовать BigInteger:

  • Определите минимальную длину в битах для использования
  • Генерация двух вероятных простых чисел
  • Умножьте два сгенерированных простых числа

Используя BigInteger.probablePrime (int, Random): " Вероятность того, что BigInteger, возвращаемый этим методом, является составной, не превышает 2-100. "

Пример :

Random r = new Random();
BigInteger pow_10_25 = BigInteger.TEN.pow(25);
int minBitLength = pow_10_25.bitLength();

BigInteger p1 = BigInteger.probablePrime(minBitLength, r);
BigInteger p2 = BigInteger.probablePrime(minBitLength, r);  
BigInteger n = p1.multiply(p2);
4
thibsc 20 Авг 2018 в 15:16

Этот вопрос Math.SE ссылается на несколько мест чтобы получить списки простых чисел:

Вместо случайного генерирования этих чисел получите список простых чисел, которые удовлетворяют условиям вашей задачи. Загрузите этот файл как массив или список в вашем приложении Java. Затем случайным образом сгенерируйте число, чтобы выбрать индекс в этом списке. Вы также можете посчитать строки в файле и прочитать строку из файла.

Этот подход торгует процессорным временем (и, возможно, ошибками?) Для ввода-вывода и памяти для чтения списка.

Вам также следует рассмотреть возможность установки верхней границы, которая меньше наибольшего значения, которое может хранить ваш числовой тип. Самое большое простое число - это более двадцати миллион цифр. BigInteger должен быть в состоянии сохранить это, однако вы можете начать работать в пределах памяти с большими числами.

1
Freiheit 20 Авг 2018 в 16:29

У вас есть следующая проблема: максимальное значение, которое может содержать long , равно 9223372036854775807 , и ваши вычисления Math.pow(10, 25) превышают этот предел. Таким образом, ваши min и max будут иметь значение 9223372036854775807 , а max-min станет равным нулю. И проблема продолжается. Попробуйте использовать тип, который может быть больше, например, BigInteger .

3
Kevin Cruijssen 20 Авг 2018 в 15:12
51932742