Số 50 trong thuật toán xác định "số nguyên tố" (Mersenne numbers)
Mọi người có thể giải thích cho mình số 50 trong thuật toán có nghĩa là gì không??
Và tại sao lại là 50. Trong tài liệu mình đọc nó chỉ ghi là “50” là một số ma thuật… kiểm soát khả năng test của số nguyên tố.
Đây là nguyên văn.
This program is a straightforward encoding of the prose description above: it starts with the primes, computes the corresponding Mersenne numbers, filters out all but the primes (the magic number 50 controls the probabilistic primality test), limits the resulting stream to twenty elements, and prints them out.
Đây là mã:
public class PrimaryNumber {
static Stream<BigInteger> primes() {
return Stream.iterate(BigInteger.TWO, BigInteger::nextProbablePrime);
}
public static void main(String[] args) {
primes().map(
p ->
BigInteger.TWO.pow(p.intValueExact()).subtract(BigInteger.ONE))
.filter(mersense -> mersense.isProbablePrime(50))
.limit(20)
.forEach(System.out::println);
}
}
Thank all!
phương thức
isProbablePrime
có lẽ là xài Rabin-Miller test, nếu vậy thì số 50 nghĩa là số lần kiểm tra xemn
có phải là số ng tố hay ko. Chọn 1 số ngẫua
nhiên trong đoạn[2, n - 2]
rồi kiểm tra thử xem số ngẫu nhiên này có “tố cáo”n
ko phải là số ng tố hay ko. Đương nhiên nếun
ko phải ng tố,a
vẫn có thể ko tố cáon
, nên phải lập đi lập lại nhiều lần.Ước tính nếu 1 số
a
ko tố cáon
ko phải ng tố thìn
được thêm 75% khả năng là số nguyên tố. Nếu 10 số ngẫu nhiên ko tố cáon
thì xác suấtn
ko phải là ng tố là 0.25-10 = 2-20 ~ 1 phần triệu.Ở đây chọn 50 lần nghĩa là xác suấtn
ng tố là 100% - 100 x 2-100 ~ 99.99999999999999999999999999992%edit: Java doc ghi:
chắc là ko xài Miller-Rabin
Có đó anh. Mà nó xài 2 thuật toán để tìm tính đúng sai của số nguyên tố - (Miller-Rabin và LucasLehmer)
(Y)
Lucas-Lehmer là thuật toán kiểm tra chính xác cho dạng số này còn RM là để chặn bớt không để test vô ích.
Thực ra RM không dùng để chặn trước (vì thời gian cũng tương đương với LL), mà dùng chia thử ( thừa số có dạng đó) và chạy “curve” p - 1. Xem bên mersenne.org.