ฉันทราบว่าการทดสอบความเป็นอันดับหนึ่งของ MillerâRabin จะอ้างสิทธิ์ความเป็นอันดับหนึ่งสำหรับจำนวนประกอบที่มี ที่มากที่สุด ก $\frac{1}{4}$ ความน่าจะเป็นสำหรับคอมโพสิตแปลก ๆ โดยพลการ $n$ และสุ่มพยาน $a$ เลือกอย่างสม่ำเสมอในช่วง $[2,n-1)$. อะไรคือ แท้จริง โอกาสเฉลี่ยที่การทดสอบอ้างว่าจำนวนนั้นเป็นจำนวนเฉพาะ? โอกาสเปลี่ยนไปตามขนาดของ $n$ ขึ้นไป? โอกาสจะเปลี่ยนไปอย่างไรหาก $n$ ไม่สามารถหารด้วยจำนวนเฉพาะที่มีขนาดเล็กได้ถึง 2,000?
ถามเพราะว่า กระดาษแผ่นนี้ อธิบายความน่าจะเป็นที่คอมโพสิตจะรอดจากการทดสอบหลายๆ รอบ ความน่าจะเป็นคือ $p_{k,t}$ กับ $k$ เป็นขนาดของตัวเลขที่จะทดสอบเป็นบิตและ $t$ เป็นจำนวนรอบที่จะดำเนินการ กระดาษพิสูจน์ว่า $\forall k \ge 2:p_{k,1} \le k^2 4^{2-\sqrt{k}}$แต่ความไม่เท่าเทียมกันนี้เป็นเพียงขอบเขตบนและมีหลักฐานแยกต่างหากเพื่อแสดงขอบเขตที่แข็งแกร่งกว่ามาก $p_{600,1} \le 2^{-75}$. ฉันต้องการค้นหาฟังก์ชันที่มีขอบเขตบนที่แข็งแกร่งสำหรับ $p_{k,t,n}$ กับ $n$ เป็นการหารทดลองกับจำนวนเฉพาะทั้งหมดที่เล็กกว่า $n$แต่ฉันไม่เข้าใจคณิตศาสตร์เบื้องหลังบทความนี้ดีพอที่จะคิดได้
ตารางที่ 2 ในกระดาษแสดงตัวอย่างขอบเขตล่างสำหรับ $-\lg{p_{k,t}}$:
\begin{อาร์เรย์}{c|cccccccc}
k/t&1&2&3&4&5&6&7&8&9&10\ \hline
100&5&14&20&25&29&33&36&39&41&44\
150&8&20&28&34&39&43&47&51&54&57\
200&11&25&34&41&47&52&57&61&65&69\
250&14&29&39&47&54&60&65&70&75&79\
300&19&33&44&53&60&67&73&78&83&88\
350&28&38&48&58&66&73&80&86&91&97\
400&37&46&55&63&72&80&87&93&99&105\
450&46&54&62&70&78&85&93&100&106&112\
500&56&63&70&78&85&92&99&106&113&119\
550&65&72&79&86&93&100&107&113&119&126\
600&75&82&88&95&102&108&115&121&127&133
\end{อาร์เรย์}
การสร้างคีย์ของ OpenSSL ดูเหมือนว่าจะไม่เป็นเช่นนั้น เนื่องจากเป็นการเพิ่มจำนวนรอบสำหรับจำนวนเฉพาะที่ใหญ่ขึ้นภายใต้ภาพลวงตาว่าอัตราบวกผิดพลาดส่งผลกระทบต่อความปลอดภัยของจำนวนเฉพาะที่สร้างขึ้น โปรดทราบว่ารหัสนี้ใช้ในนายก รุ่น รูทีน ดังนั้นไพรม์ของตัวเลือกจึงรับประกันได้ว่าจะมีการกระจายอย่างสม่ำเสมอ และไม่อยู่ภายใต้อัตราการบวกเท็จในกรณีที่เลวร้ายที่สุด
จาก crypto/bn/bn_prime.c:87
:
/*
* ใช้ Miller-Rabin อย่างน้อย 64 รอบซึ่งควรเป็นเท็จ
* อัตราบวก 2^-128 ถ้าขนาดของจำนวนเฉพาะมากกว่า 2048
* ผู้ใช้อาจต้องการระดับความปลอดภัยที่สูงกว่า 128 ดังนั้นให้เปลี่ยน
* ถึง 128 รอบ ให้อัตราบวกปลอมเป็น 2^-256
* ส่งกลับจำนวนรอบ
*/
int bn_mr_min_checks แบบคงที่ (int บิต)
{
ถ้า (บิต > 2048)
กลับ 128;
กลับ 64;
}