กรณีการใช้งานที่เป็นไปได้ของ. isProbablePrime () ของ BigInteger คืออะไร?


84

วิธีBigInteger.isProbablePrime()นี้ค่อนข้างแปลก จากเอกสารนี้จะบอกได้ว่ามีจำนวนเป็นสำคัญกับความน่าจะเป็นของ1 - 1 / 2^argที่argเป็นอาร์กิวเมนต์จำนวนเต็ม

มีอยู่ใน JDK มานานแล้วดังนั้นจึงหมายความว่าต้องมีการใช้งาน ความรู้ที่ จำกัด ของฉันในด้านวิทยาการคอมพิวเตอร์และอัลกอริทึม (และคณิตศาสตร์) บอกฉันว่ามันไม่สมเหตุสมผลเลยที่จะรู้ว่าตัวเลขนั้น "น่าจะ" เป็นจำนวนเฉพาะ แต่ไม่ใช่จำนวนเฉพาะ

ดังนั้นสถานการณ์ที่เป็นไปได้ที่เราต้องการใช้วิธีนี้คืออะไร? การเข้ารหัส?



6
นอกจากนี้การทดสอบเบื้องต้นของMiller-Rabin ประโยชน์หลักคือความเร็ว เช่นเมื่อคุณต้องการตรวจสอบปัจจัยคุณสามารถทำการทดสอบดังกล่าวเพื่อเร่งกระบวนการแยกตัวประกอบ คุณสามารถรักษาส่วนที่ "น่าจะ" ไว้ได้ค่อนข้างต่ำและมีประโยชน์ในทางปฏิบัติ แต่ฉันยอมรับว่ามันค่อนข้างสั่นและแปลก ๆ เหมือนลอยน้ำ
คีย์เซอร์

2
@ maxx777 ที่ให้มา - ขอกรณีใช้งานจริง
fge

4
ฉันอยากให้ผู้ลงคะแนนอธิบายเหตุผลเบื้องหลังการ
โหวตลดลงจริงๆ

17
"มีอยู่ใน JDK มานานแล้วดังนั้นจึงหมายความว่าต้องมีการใช้งาน" - หรือมันถูกเพิ่มด้วยเหตุผลที่ไร้ประโยชน์จากนั้นไม่ได้ลบออกเพราะไม่มีอะไรจะถูกลบออกไป
user253751

คำตอบ:


67

ใช่วิธีนี้สามารถใช้ในการเข้ารหัสได้ การเข้ารหัส RSAเกี่ยวข้องกับการค้นหาจำนวนเฉพาะจำนวนมากบางครั้งเรียงลำดับ 1024 บิต (ประมาณ 300 หลัก) ความปลอดภัยของ RSA ขึ้นอยู่กับข้อเท็จจริงที่ว่าการแยกจำนวนที่ประกอบด้วยจำนวนเฉพาะ 2 จำนวนนี้มาคูณกันนั้นยากและใช้เวลานาน แต่เพื่อให้ได้ผลพวกเขาต้องเป็นนายก

ปรากฎว่าการพิสูจน์จำนวนเฉพาะเหล่านี้เป็นเรื่องยากเช่นกัน แต่การทดสอบเบื้องต้นของ Miller-Rabinซึ่งเป็นหนึ่งในการทดสอบเบื้องต้นที่ใช้โดยisProbablePrimeตรวจพบว่าตัวเลขนั้นประกอบกันหรือไม่ให้ข้อสรุป การรันnเวลาทดสอบนี้ช่วยให้คุณสามารถสรุปได้ว่ามีอัตราต่อรอง1 ใน 2 nที่ตัวเลขนี้ประกอบกันจริงๆ การเรียกใช้จำนวน100ครั้งจะให้ความเสี่ยงที่ยอมรับได้เท่ากับ 1 ใน 2 100ที่จำนวนนี้เป็นแบบผสม


3
@ คุณ 777 ฉันเคยเห็น Rabin-Miller ครั้งหรือสองครั้ง แต่ Miller-Rabin หลายสิบครั้ง ฉันไม่แน่ใจว่ามีชื่อทางการหรือเปล่า
คีย์เซอร์

3
@ Mr.777 หน้า Wikipedia ที่ฉันเชื่อมโยงรัฐเหนือ "Miller-Rabin" ก่อน แต่ยอมรับชื่อทั้งสอง: "The Miller – Rabin primality test หรือ Rabin – Miller primality test"
rgettman

5
การดำเนินการisProbablyPrimeคือ (เท่าที่ฉันสามารถบอกได้) ถูกกำหนดอย่างสมบูรณ์ การรันnเวลาทดสอบจะช่วยเพิ่มโอกาสของผลลัพธ์ที่ถูกต้องได้อย่างไร (แม้ว่าจะเป็นองค์ประกอบของการสุ่ม แต่ก็ต้องมีการสุ่มของการเรียกหลาย ๆ สายเป็นอิสระเพื่อส่งผลต่อความเสี่ยงในแบบที่คุณอธิบาย)
Ted Hopp

11
@TedHopp การใช้งานจะใช้เครื่องกำเนิดไฟฟ้าแบบสุ่มและแต่ละรอบจะมีตัวเลขสุ่มใหม่ให้โอกาส 3/4 ในการตรวจจับคอมโพสิต ตัวสร้างเริ่มต้นคือ SecureRandom พร้อมการรับประกันแบบสุ่มที่แข็งแกร่ง
ผู้ชายคนนั้น

4
อาจเป็นเรื่องยากอย่างไรก็ตามโปรดจำไว้ว่า PRIMES อยู่ใน P การทดสอบ AKS อาจช้ากว่า Miller-Rabin แต่ไม่มีความแตกต่างแบบเอ็กซ์โปเนนเชียลหรือพหุนามระหว่างกัน คุณสามารถใช้ Miller-Rabin เพื่อค้นหาช่วงเวลาที่น่าจะเป็นไปได้จำนวนมากและใช้ AKS เพื่อพิสูจน์ว่าเป็นช่วงราคาที่แน่นอน
Bakuriu

20

หากการทดสอบบอกคุณว่าจำนวนเต็มไม่ใช่จำนวนเฉพาะคุณสามารถเชื่อได้อย่างแน่นอน 100%

เป็นเพียงอีกด้านหนึ่งของคำถามหากการทดสอบบอกคุณว่าจำนวนเต็มเป็น "จำนวนเฉพาะที่น่าจะเป็น" คุณอาจสงสัย การทดสอบซ้ำด้วย "ฐาน" ที่แตกต่างกันจะช่วยให้ความน่าจะเป็นที่จะประสบความสำเร็จอย่างไม่ถูกต้องจากการ "เลียนแบบ" ไพรม์ (การเป็น pseudo-prime ที่ชัดเจนสำหรับหลาย ๆ ฐาน) จะทำให้มีขนาดเล็กเท่าที่ต้องการ

ประโยชน์ของการทดสอบอยู่ที่ความเร็วและความเรียบง่าย ไม่มีใครจำเป็นต้องพอใจกับสถานะของ "ไพรม์ที่น่าจะเป็น" เป็นคำตอบสุดท้าย แต่แน่นอนว่าเราจะหลีกเลี่ยงการเสียเวลากับตัวเลขประกอบเกือบทั้งหมดโดยใช้กิจวัตรนี้ก่อนที่จะนำไปสู่การทดสอบความเป็นเลิศ

การเปรียบเทียบกับความยากของการแยกตัวประกอบจำนวนเต็มเป็นปลาชนิดหนึ่งสีแดง เป็นที่ทราบกันดีอยู่แล้วว่าไพรมารีของจำนวนเต็มสามารถกำหนดได้ในเวลาพหุนามและแน่นอนว่ามีข้อพิสูจน์ว่าการขยายการทดสอบมิลเลอร์ - ราบินไปยังฐานจำนวนมากที่เพียงพอนั้นมีความชัดเจน (ในการตรวจจับไพรเมอร์ซึ่งตรงข้ามกับไพรม์ที่น่าจะเป็นไปได้) แต่สิ่งนี้ ถือว่าทั่วไป Riemann สมมุติฐานจึงเป็นสิ่งที่ไม่มากเพื่อให้บางเป็น (แพงกว่า) primality ทดสอบ


4
เป็นที่น่าสังเกตว่า AKS ถูกค้นพบในเดือนสิงหาคม 2545 เท่านั้นในขณะที่วิธีนี้อยู่ใน JDK ตั้งแต่เดือนกุมภาพันธ์ 2545
James_pic

3
ไม่เดี๋ยวก่อนนี่อยู่ใน JDK ตั้งแต่เดือนกุมภาพันธ์ 1997 (ฉันกำลังดูprobablePrimeวิธีการไม่ใช่isProbablePrimeวิธีการ)
James_pic

1
อันที่จริงชื่อของเอกสาร Agrawal, Kayal และ Saxena ในปี 2002 "PRIMES is in P" เป็นสัญญาณบ่งบอกถึงการพิสูจน์ความซับซ้อนของพหุนามแบบไม่มีเงื่อนไขเป็นครั้งแรก(ในความยาวบิตของn ) สำหรับการทดสอบเบื้องต้นเชิงกำหนด (จำนวนเต็มทั่วไป) Miller (1975) ได้แสดงให้เห็นว่าโดยสมมติว่า GRHสามารถทดสอบความเป็นอันดับแรกของจำนวนเต็มในขั้นตอนตามสัดส่วนกับกำลังที่สี่ของความยาวบิตซึ่งเป็นเลขชี้กำลังที่ดีกว่าที่รู้จักกันในชื่อ AKS หรือตัวแปรในปัจจุบัน
hardmath

แม้ว่า AKS จะเร็วกว่าอย่างไม่มีอาการ แต่วิธีการเช่น ECPP จะมีประสิทธิภาพมากกว่าสำหรับช่วงเวลา 'การเข้ารหัส' หรือ 'อุตสาหกรรม'
Brett Hale

2
AKS ช้าอย่างบ้าคลั่งและจะไม่เร็วกว่า APR-CL สำหรับจำนวนใด ๆ ที่คำนวณได้ในเวลามาตราส่วนทางธรณีวิทยาขนาดของมนุษย์น้อยกว่ามาก APR-CL และ ECPP มีอยู่แล้วในปี 1997 ดังที่ Brett กล่าว ECPP เป็นทางเลือกที่ดีหากเราต้องการการพิสูจน์ ทั้งหมดนี้ช้าเมื่อเทียบกับวิธีการเฉพาะที่น่าจะเป็นไปได้ (เช่น MR, BPSW, Frobenius)
DanaJ

19

กรณีการใช้งานมาตรฐานสำหรับBigInteger.isProbablePrime(int)อยู่ในการเข้ารหัส โดยเฉพาะอย่างยิ่งอัลกอริทึมการเข้ารหัสบางอย่างเช่นRSAต้องการช่วงเวลาขนาดใหญ่ที่สุ่ม อย่างไรก็ตามที่สำคัญอัลกอริทึมเหล่านี้ไม่ต้องการให้ตัวเลขเหล่านี้ได้รับการรับรองว่าเป็นไพรม์ - เพียงแค่ต้องเป็นไพรม์ที่มีโอกาสสูงมาก

สูงมากแค่ไหน? ดีในการประยุกต์ใช้การเข้ารหัสลับหนึ่งจะเรียกโดยทั่วไป.isProbablePrime()ที่มีอยู่ที่ไหนสักแห่งโต้เถียงระหว่าง 128 และ 256 ดังนั้นความน่าจะเป็นของจำนวนที่ไม่สำคัญผ่านการทดสอบดังกล่าวจะน้อยกว่าหนึ่งใน 2 128หรือ 2 256

ลองมองในมุมมอง: ถ้าคุณมีคอมพิวเตอร์ 10 พันล้านเครื่องแต่ละเครื่องจะสร้างจำนวนเฉพาะที่น่าจะเป็น 10 พันล้านต่อวินาที (ซึ่งหมายความว่าน้อยกว่าหนึ่งรอบสัญญาณนาฬิกาต่อหนึ่งหมายเลขในซีพียูสมัยใหม่ใด ๆ ) และความเป็นอันดับแรกของตัวเลขเหล่านั้นได้รับการทดสอบด้วย.isProbablePrime(128)คุณ ก็จะเฉลี่ยคาดว่าจำนวนหนึ่งที่ไม่สำคัญในการลื่นในหนึ่งครั้งในทุก ๆ 100 พันล้านปี

นั่นคือการที่จะเป็นกรณีที่ถ้าผู้ที่ 10 พันล้านเครื่องคอมพิวเตอร์สามารถทำได้อย่างใดวิ่งทั้งหมดสำหรับหลายร้อยหลายพันล้านปีโดยไม่ต้องประสบใดล้มเหลวของฮาร์ดแวร์ ในทางปฏิบัติ แต่มันมากมีโอกาสมากขึ้นสำหรับรังสีคอสมิกสุ่มการนัดหยุดงานคอมพิวเตอร์ของคุณในเพียงเวลาที่เหมาะสมและสถานที่ที่จะพลิกค่าตอบแทนของ.isProbablePrime(128)จาก false เป็นจริงโดยไม่ก่อให้เกิดผลการตรวจพบอื่น ๆ กว่านั้นสำหรับที่ไม่ใช่ - จำนวนไพรม์เพื่อผ่านการทดสอบความเป็นไปได้ในระดับแรกที่ระดับความแน่นอนนั้น

แน่นอนความเสี่ยงแบบเดียวกันของรังสีคอสมิกแบบสุ่มและความผิดพลาดของฮาร์ดแวร์อื่น ๆ ยังนำไปใช้กับการทดสอบเบื้องต้นที่กำหนดเช่นAKS ดังนั้นในทางปฏิบัติแม้การทดสอบเหล่านี้จะมีอัตราผลบวกเท็จพื้นฐาน (เล็กมาก) เนื่องจากความล้มเหลวของฮาร์ดแวร์แบบสุ่ม (ไม่ต้องพูดถึงแหล่งที่มาของข้อผิดพลาดอื่น ๆ ทั้งหมดเช่นข้อบกพร่องในการใช้งาน)

เนื่องจากเป็นเรื่องง่ายที่จะผลักดันอัตราผลบวกเท็จที่แท้จริงของการทดสอบ.isProbablePrime()เบื้องต้นของมิลเลอร์ - ราบินที่ใช้โดยต่ำกว่าอัตราพื้นฐานนี้เพียงแค่ทำซ้ำการทดสอบหลาย ๆ ครั้งอย่างเพียงพอและตั้งแต่นั้นเป็นต้นมาแม้จะทำซ้ำหลายครั้งการทดสอบมิลเลอร์ - ราบินก็ยังคงอยู่ ในทางปฏิบัติเร็วกว่าการทดสอบพื้นฐานเชิงกำหนดที่รู้จักกันดีอย่าง AKS แต่ยังคงเป็นการทดสอบพื้นฐานมาตรฐานสำหรับแอปพลิเคชันการเข้ารหัส

(นอกจากนี้แม้ว่าคุณบังเอิญเลือก pseudoprime ที่แข็งแกร่งเป็นหนึ่งในปัจจัยของโมดูลัส RSA ของคุณโดยทั่วไปแล้วจะไม่นำไปสู่ความล้มเหลวอย่างร้ายแรงโดยทั่วไปแล้ว pseudoprimes จะเป็นผลคูณสองครั้ง (หรือน้อยกว่านั้น) โดยประมาณ ความยาวครึ่งหนึ่งซึ่งหมายความว่าคุณจะได้รับคีย์ RSA แบบหลายไพรม์ตราบเท่าที่ไม่มีปัจจัยใดน้อยเกินไป (และถ้าเป็นเช่นนั้นการทดสอบลำดับความสำคัญควรจะจับได้) อัลกอริทึม RSA จะ ยังคงใช้งานได้ดีและคีย์แม้ว่าจะค่อนข้างอ่อนแอต่อการโจมตีบางประเภทกว่าคีย์ RSA ปกติที่มีความยาวเท่ากัน แต่ก็ยังคงมีความปลอดภัยพอสมควรหากคุณไม่จำเป็นต้องใช้ความยาวคีย์โดยไม่จำเป็น)


ปัญหาข้อผิดพลาดเป็นสาเหตุหนึ่งที่ไม่ได้ใช้ AKS จริง ๆ (ความเร็วที่ช้าอย่างน่าอัศจรรย์คืออีกด้านหนึ่ง) และ ECPP เป็นเรื่องปกติ ดังที่คุณทราบข้อผิดพลาดในการใช้งานในอัลกอริทึมนั้นค่อนข้างเป็นไปได้ดังนั้นการตรวจสอบใบรับรองด้วยรหัสอิสระจึงมีประโยชน์
DanaJ

8

กรณีการใช้งานที่เป็นไปได้คือในการทดสอบลำดับความสำคัญของจำนวนที่กำหนด (ในการทดสอบซึ่งมีประโยชน์หลายอย่างในตัวเอง) isProbablePrimeอัลกอริทึมจะทำงานได้เร็วกว่าอัลกอริทึมที่แน่นอนดังนั้นหากหมายเลขที่ล้มเหลวisProbablePrimeแล้วหนึ่งไม่จำเป็นต้องไปที่ค่าใช้จ่ายของการทำงานของอัลกอริทึมที่มีราคาแพงมากขึ้น


แล้วนั่นเพื่อวัตถุประสงค์ในการปฏิบัติจริงหรือไม่? และเนื่องจากข้อเท็จจริงที่ว่าการแยกตัวประกอบเฉพาะเป็นปัญหา NP?
fge

@fge - ใช่กรณีการใช้งานที่ฉันเสนอมีไว้เพื่อการใช้งานจริง ฉันไม่รู้ว่าสิ่งนี้ช่วยในการแยกตัวประกอบเฉพาะซึ่งเป็นปัญหาที่ยากกว่าการทดสอบความเป็นพื้นฐาน สำหรับข้อหลังนี้มีอัลกอริทึมเวลาพหุนาม: การทดสอบลำดับความสำคัญของAKS
Ted Hopp

5
@fge: การแยกตัวประกอบอยู่ใน NP จริง ๆ แต่ฉันสงสัยว่าคุณหมายถึง "NP-complete" ซึ่งไม่ทราบว่าการแยกตัวประกอบเป็น ในทางกลับกันสงสัยอย่างยิ่งว่าจะไม่เป็น NP-hard
hmakholm ออกจาก Monica ใน

6

การค้นหาช่วงเวลาที่น่าจะเป็นเป็นปัญหาสำคัญในการเข้ารหัส ปรากฎว่าเป็นกลยุทธ์ที่เหมาะสมสำหรับการค้นหาที่น่าจะเป็น K-bit ที่สำคัญคือการซ้ำ ๆ เลือกหมายเลข k-bit สุ่มและทดสอบสำหรับ primality isProbablePrime()น่าจะใช้วิธีการเช่น

สำหรับการอภิปรายเพิ่มเติมโปรดดูที่ส่วน 4.4.1 ของคู่มือการประยุกต์ใช้การเข้ารหัส

นอกจากนี้โปรดดูในการสร้างช่วงเวลาที่น่าจะเป็นโดยการค้นหาที่เพิ่มขึ้นโดย Brandt และDamgård


5

อัลกอริทึมเช่นการสร้างคีย์ RSA ขึ้นอยู่กับความสามารถในการระบุว่าตัวเลขเป็นจำนวนเฉพาะหรือไม่

อย่างไรก็ตามในช่วงเวลาที่isProbablePrimeเพิ่มวิธีการลงใน JDK (กุมภาพันธ์ 1997) ยังไม่มีวิธีพิสูจน์ในการตัดสินใจว่าจำนวนเฉพาะเป็นจำนวนเฉพาะในระยะเวลาที่เหมาะสมหรือไม่ แนวทางที่รู้จักกันดีที่สุดในเวลานั้นคืออัลกอริธึมมิลเลอร์ - ราบินซึ่งเป็นอัลกอริธึมความน่าจะเป็นที่บางครั้งอาจให้ผลบวกที่ผิดพลาด (กล่าวคือจะรายงานที่ไม่ใช่ช่วงราคาเป็นราคา) แต่สามารถปรับแต่งเพื่อลดโอกาสในการเกิดผลบวกปลอมโดยมีค่าใช้จ่าย ของการเพิ่มขึ้นเล็กน้อยในรันไทม์

ตั้งแต่นั้นมามีการค้นพบอัลกอริทึมที่สามารถกำหนดได้ว่าจำนวนเฉพาะเป็นจำนวนเฉพาะได้เร็วพอสมควรเช่นอัลกอริทึม AKSที่ค้นพบในเดือนสิงหาคม 2545 อย่างไรก็ตามควรสังเกตว่าอัลกอริทึมเหล่านี้ยังไม่เร็วเท่า Miller-Rabin

อาจเป็นคำถามที่ดีกว่าคือเหตุใดจึงไม่มีisPrimeการเพิ่มวิธีการใน JDK ตั้งแต่ปี 2545


ขอบคุณสำหรับมุมมองทางประวัติศาสตร์! ดูเหมือนว่า @immibis จะมาถูกทางแล้วกับความคิดเห็นของเขาเกี่ยวกับ "ใน JDK แต่ไม่เคยเอาออก"? :)
fge

1
ฉันรู้ว่า Java มีชื่อเสียงไม่เคยลบสิ่งต่างๆออกจากไลบรารีมาตรฐาน แต่ฉันไม่แน่ใจว่าพวกเขาจะลบออกแม้ว่าจะทำได้ก็ตาม สำหรับบางแอปพลิเคชันการแน่ใจว่า 99.999999999% บางอย่างดีพอและเร็วกว่าการชัวร์ 100%
James_pic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.