Мне нужно сгенерировать два простых числа 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);
}
Спасибо.
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);
Этот вопрос Math.SE ссылается на несколько мест чтобы получить списки простых чисел:
- https://www.bigprimes.net/ (бесплатно? не уверен в лицензии)
- http://www.primos.mat.br/indexen.html (бесплатно? )
- http://www.prime-numbers.org/premium.html (скромная стоимость )
Вместо случайного генерирования этих чисел получите список простых чисел, которые удовлетворяют условиям вашей задачи. Загрузите этот файл как массив или список в вашем приложении Java. Затем случайным образом сгенерируйте число, чтобы выбрать индекс в этом списке. Вы также можете посчитать строки в файле и прочитать строку из файла.
Этот подход торгует процессорным временем (и, возможно, ошибками?) Для ввода-вывода и памяти для чтения списка.
Вам также следует рассмотреть возможность установки верхней границы, которая меньше наибольшего значения, которое может хранить ваш числовой тип. Самое большое простое число - это более двадцати миллион цифр. BigInteger
должен быть в состоянии сохранить это, однако вы можете начать работать в пределах памяти с большими числами.
У вас есть следующая проблема: максимальное значение, которое может содержать long , равно 9223372036854775807 , и ваши вычисления Math.pow(10, 25)
превышают этот предел. Таким образом, ваши min и max будут иметь значение 9223372036854775807 , а max-min станет равным нулю. И проблема продолжается. Попробуйте использовать тип, который может быть больше, например, BigInteger .
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].