อัลกอริทึมเชินฮาเกอ–สตราสเซน


อัลกอริทึม Schönhage–Strassen เป็น อัลกอริทึมการคูณที่รวดเร็วในเชิง อะซิมโทติก สำหรับจำนวนเต็มขนาด ใหญ่ ซึ่งเผยแพร่โดยArnold SchönhageและVolker Strassenในปี 1971 [ 1 ] อัลกอริทึม นี้ทำงานโดยการใช้การแปลงฟูริเยร์แบบเร็ว (FFT) ซ้ำๆ กับจำนวนเต็มโมดูลัส n ความซับซ้อนของบิตรันไทม์ในการคูณ จำนวน nหลักสองจำนวนโดยใช้อัลกอริทึมนี้อยู่ในสัญกรณ์บิ๊ก โอ
อัลกอริทึม Schönhage–Strassen เป็นวิธีการคูณที่เร็วที่สุดในเชิงอะซิมโทติกที่รู้จักกันตั้งแต่ปี 1971 จนถึงปี 2007 มันเร็วกว่าวิธีการเก่าๆ เช่น การคูณแบบ KaratsubaและToom–Cook ในเชิง อะซิมโท ติก และเริ่มมีประสิทธิภาพเหนือกว่าในทางปฏิบัติสำหรับตัวเลขที่มีจำนวนหลักทศนิยมมากกว่าประมาณ 10,000 ถึง 100,000 หลัก[ 2 ] ในปี 2007 Martin Fürer ได้เผยแพร่ อัลกอริทึมที่มีความซับซ้อนเชิงอะซิมโทติกที่เร็วกว่า[ 3 ]ในปี 2019 David Harvey และJoris van der Hoevenได้แสดงให้เห็นว่าการคูณหลายหลักมีความซับซ้อนเชิงทฤษฎี อย่างไรก็ตาม อัลกอริทึมของพวกเขามีปัจจัยคงที่ซึ่งทำให้มันช้าจนเป็นไปไม่ได้สำหรับปัญหาในทางปฏิบัติใดๆ ที่คิดได้ (ดูอัลกอริทึมกาแล็กติก ) [ 4 ]
การประยุกต์ใช้อัลกอริทึม Schönhage–Strassen รวมถึงการคำนวณขนาดใหญ่ที่ทำเพื่อตัวมันเอง เช่นการค้นหาจำนวนเฉพาะเมอร์เซนน์บนอินเทอร์เน็ตครั้งใหญ่และการประมาณค่าπรวมถึงการประยุกต์ใช้ในทางปฏิบัติ เช่นการแยกตัวประกอบเส้นโค้งวงรี Lenstraผ่านการแทนที่ Kroneckerซึ่งลดการคูณพหุนามเป็นการคูณจำนวนเต็ม[ 5 ] [ 6 ]
คำอธิบาย
ส่วนนี้มีอัลกอริทึมเวอร์ชันที่เรียบง่ายกว่า ซึ่งแสดงวิธีการคำนวณผลคูณของจำนวนธรรมชาติสองจำนวนโดยใช้โมดูลัสของจำนวนในรูปแบบโดยที่เป็นจำนวนคงที่บางจำนวน จำนวนเต็มจะต้องถูกแบ่งออกเป็นบล็อกของบิต ดังนั้นในการใช้งานจริง จึงเป็นสิ่งสำคัญที่จะต้องสร้างสมดุลที่เหมาะสมระหว่างพารามิเตอร์ ไม่ว่าในกรณีใด อัลกอริทึมนี้จะช่วยให้สามารถคูณจำนวนเต็มบวกสองจำนวนได้ โดยมีเงื่อนไขว่าจะต้องถูกเลือกให้ เป็นไปตามเงื่อนไข
ให้เป็นจำนวนบิตในสัญญาณและโดยที่เป็นกำลังของสอง แบ่งสัญญาณและออกเป็นบล็อก บล็อกละ บิต แล้วจัดเก็บบล็อกที่ได้เป็นอาร์เรย์(ซึ่งเพื่อความง่าย เราจะถือว่าค่าในอาร์เรย์เป็นจำนวนเต็มที่มีความแม่นยำสูง)
ต่อไปนี้เราจะเลือกค่าสัมบูรณ์สำหรับการแปลงฟูริเยร์ ให้ เป็นเช่นนั้นนอกจากนี้ ให้และพิจารณาองค์ประกอบของอาร์เรย์เป็นจำนวนเต็ม (ความแม่นยำตามอำเภอใจ) มอดูลัสสังเกตว่าเนื่องจากค่าสัมบูรณ์มีขนาดใหญ่พอที่จะรองรับตัวทดใดๆ ที่อาจเกิดขึ้นจากการคูณและดังนั้น ผลคูณ(มอดูลัส) สามารถคำนวณได้โดยการประเมินการสังเคราะห์ของ นอกจากนี้ ด้วยเราจะได้และดังนั้น จึง เป็น รากที่ n ของเอกภาพแบบดั้งเดิม มอดู ลั ส
ต่อไปเราจะทำการแปลงฟูริเยร์แบบไม่ต่อเนื่องของอาร์เรย์ในวงแหวนโดยใช้รากที่หนึ่งของเอกภาพเป็นฐานฟูริเยร์ ซึ่งจะได้อาร์เรย์ที่แปลงแล้วเนื่องจากเป็นกำลังของสอง การแปลงนี้จึงสามารถทำได้ในเวลาเชิงลอการิทึมโดยใช้ การแปลงฟูริเย ร์ แบบเร็ว
ให้(ผลคูณแบบจุดต่อจุด) และคำนวณการแปลงผกผันของอาร์เรย์โดยใช้รากที่หนึ่งของเอกภาพอีกครั้งอาร์เรย์ในตอนนี้คือการสังเคราะห์ของอาร์เรย์สุดท้าย ผลคูณจะได้รับจากการประเมินค่า
อัลกอริทึมพื้นฐานนี้สามารถปรับปรุงได้หลายวิธี ประการแรก ไม่จำเป็นต้องจัดเก็บตัวเลขด้วยความแม่นยำสูง แต่สามารถจัดเก็บได้เพียงระดับบิต ซึ่งจะทำให้การแสดงผลอาร์เรย์ในเครื่องมีประสิทธิภาพมากขึ้นประการที่สอง เห็นได้ชัดว่าการคูณในการแปลงไปข้างหน้าเป็นการเลื่อนบิตอย่างง่าย ด้วยความระมัดระวัง ก็สามารถคำนวณการแปลงผกผันโดยใช้การเลื่อนบิตเพียงอย่างเดียวได้เช่นกัน ด้วยความระมัดระวัง จึงเป็นไปได้ที่จะกำจัดการคูณที่แท้จริงออกจากอัลกอริทึม ยกเว้นในส่วนที่ประเมินผลคูณแบบจุดต่อจุด ดังนั้นจึงเป็นประโยชน์ที่จะเลือกพารามิเตอร์เพื่อให้สามารถคำนวณผลคูณแบบจุดต่อจุดได้อย่างมีประสิทธิภาพ ไม่ว่าจะเป็นเพราะเป็นคำในเครื่องเพียงคำเดียว หรือใช้อัลกอริทึมที่ปรับให้เหมาะสมสำหรับการคูณจำนวนเต็มของจำนวนคำ (โดยอุดมคติคือจำนวนน้อย) การเลือกพารามิเตอร์จึงเป็นส่วนสำคัญสำหรับการปรับปรุงวิธีการให้ดียิ่งขึ้นต่อไป
รายละเอียด
ทุกจำนวนในระบบฐาน B สามารถเขียนได้ในรูปพหุนาม:
นอกจากนี้ การคูณจำนวนสองจำนวนอาจมองได้ว่าเป็นผลคูณของพหุนามสองตัว:
เพราะว่าสำหรับ: เราจะได้คอนโวลูชัน
โดยใช้ FFT ( การแปลงฟูริเยร์แบบเร็ว ) ซึ่งใช้ในเวอร์ชันดั้งเดิมแทน NTT ( การแปลงเชิงทฤษฎีจำนวน ) [ 7 ]ด้วยกฎการสังเคราะห์ เราจะได้
นั่นคือโดยที่ คือสัมประสิทธิ์ที่สอดคล้องกันในปริภูมิฟูริเยร์ ซึ่งสามารถเขียนได้อีกแบบว่า:
เราได้ค่าสัมประสิทธิ์เดียวกันเนื่องจากความเป็นเชิงเส้นภายใต้การแปลงฟูริเยร์ และเนื่องจากพหุนามเหล่านี้ประกอบด้วยพจน์ที่ไม่ซ้ำกันเพียงพจน์เดียวต่อค่าสัมประสิทธิ์:
- และ
กฎการสังเคราะห์:
เราได้ลดปัญหาการหาค่าคอนโวลูชันให้เหลือเพียงปัญหาการหาค่าผลคูณ โดยใช้ FFT
โดยการหา FFT ของการประมาณค่าแบบพหุนามของแต่ละค่าเราสามารถกำหนดค่าสัมประสิทธิ์ที่ต้องการได้
อัลกอริทึมนี้ใช้วิธีแบ่งและพิชิต (divide-and-conquer)เพื่อแบ่งปัญหาออกเป็นปัญหาย่อยๆ
การคอนโวลูชันภายใต้โมดูลN
- , ที่ไหน.
โดยการปล่อยให้:
- และ
เมื่อ ราก ที่ n อยู่เราจะเห็นว่า: [ 8 ]
หมายความว่า เราสามารถใช้ค่าน้ำหนักแล้วคูณด้วยค่าที่ได้ในภายหลัง
แทนที่จะใช้ค่าน้ำหนักในขั้นตอนแรกของการเรียกซ้ำ (เมื่อ) เราสามารถคำนวณได้ดังนี้:
ในการแปลงฟูริเยร์แบบเร็ว (FFT) ปกติที่ทำงานกับจำนวนเชิงซ้อน จะใช้สูตรดังนี้:
อย่างไรก็ตาม FFT ยังสามารถใช้เป็น NTT ( การแปลงเชิงทฤษฎีจำนวน ) ใน Schönhage–Strassen ได้อีกด้วย ซึ่งหมายความว่าเราต้องใช้θเพื่อสร้างจำนวนในฟิลด์จำกัด (ตัวอย่างเช่น)
รากแห่งเอกภาพภายใต้ฟิลด์จำกัดGF( r )คือสมาชิก a ที่ทำให้หรือตัวอย่างเช่นGF( p )โดยที่pเป็นจำนวนเฉพาะจะ ให้
โปรดสังเกตว่าใน และในสำหรับผู้สมัครเหล่านี้ภายใต้ฟิลด์จำกัด และด้วยเหตุนี้จึงกระทำในแบบที่เราต้องการ
ยังคงสามารถใช้อัลกอริธึม FFT เดิมได้ ตราบใดที่θเป็นรากที่หนึ่งของเอกภาพของฟิลด์จำกัด
ในการหาค่าการแปลง FFT/NTT เราจะทำดังนี้:
ผลิตภัณฑ์แรกมีส่วนช่วยต่อสำหรับแต่ละkผลิตภัณฑ์ ที่สองมีส่วนช่วยต่อเนื่องจากmod
เพื่อทำสิ่งที่ตรงกันข้าม:
- หรือ
ขึ้นอยู่กับว่าจำเป็นต้องปรับข้อมูลให้เป็นมาตรฐานหรือไม่
คูณด้วยค่าหนึ่งเพื่อปรับข้อมูล FFT ให้เป็นมาตรฐานในช่วงที่กำหนด โดยที่mหาได้จากการใช้ตัวผกผันการคูณแบบโมดูลาร์
รายละเอียดการดำเนินการ
ทำไมN = 2 M + 1 mod N
ในอัลกอริทึม Schönhage–Strassen ควรคิดว่าเป็นต้นไม้ไบนารีโดยมีค่าอยู่ในโดยให้สำหรับแต่ละKสามารถค้นหาทั้งหมดและจัดกลุ่มคู่ทั้งหมดเป็น M กลุ่มที่แตกต่างกัน การใช้เพื่อจัดกลุ่มคู่ผ่านการสังเคราะห์เป็นปัญหาคลาสสิกในอัลกอริทึม[ 9 ]
ด้วยเหตุนี้ โปรดช่วยเราจัดกลุ่มงานย่อยแต่ละกลุ่มตามระดับความลึกkในโครงสร้างแบบต้นไม้ด้วย
โปรดสังเกตว่าสำหรับค่า L บางค่า สิ่งนี้ทำให้ N เป็นจำนวนแฟร์มาต์เมื่อทำการมอดูเลตเราจะได้วงแหวนแฟร์มาต์
เนื่องจากจำนวนเฟอร์มาต์บางจำนวนเป็นจำนวนเฉพาะเฟอร์มาต์ ในบางกรณีจึงสามารถหลีกเลี่ยงการคำนวณได้
แน่นอนว่ายังมีจำนวนเฉพาะอื่นๆ อีกหลายจำนวน ที่สามารถนำมาใช้ได้ โดยให้ข้อดีของจำนวนเฉพาะเช่นเดียวกัน โดยการให้ จะ ทำให้ได้จำนวนสูงสุดในเลขฐานสองที่มีบิต เป็นจำนวนเมอร์เซนน์ ซึ่งในบางกรณีเป็นจำนวนเฉพาะเมอร์เซนน์ จึงเป็นตัวเลือกที่เหมาะสมที่จะใช้แทนจำนวนแฟร์มาต์
ในการค้นหาN อีกตัวหนึ่ง
การคำนวณโมดูลัสหลายครั้งกับN ที่แตกต่างกัน อาจเป็นประโยชน์เมื่อต้องแก้ปัญหาผลคูณจำนวนเต็ม โดยใช้ทฤษฎีบทเศษเหลือของจีนหลังจากแบ่งM ออกเป็น Nประเภทต่างๆ ที่เล็กกว่าแล้วจะสามารถหาคำตอบของการคูณxy ได้ [ 10 ]
จำนวนเฟอร์มาต์และจำนวนเมอร์เซนน์เป็นเพียงสองประเภทของจำนวน ในสิ่งที่เรียกว่าจำนวนเฟอร์มาต์เมอร์เซนน์ทั่วไป (GSM) โดยมีสูตรดังนี้: [ 11 ]
ในสูตรนี้คือจำนวนแฟร์มาต์ และคือจำนวนเมอร์เซนน์
สูตรนี้สามารถใช้สร้างชุดสมการที่สามารถใช้ในทฤษฎีบทเศษเหลือของจีนได้: [ 12 ]
- โดยที่gเป็นจำนวนที่ทำให้มีx อยู่จริง โดย สมมติว่า
นอกจากนี้โดยที่aคือองค์ประกอบที่สร้างองค์ประกอบในในลักษณะเป็นวัฏจักร
ถ้าโดย ที่แล้ว
วิธีการเลือกค่า Kสำหรับค่าN ที่กำหนด
สูตรต่อไปนี้มีประโยชน์ในการหาค่าK ที่เหมาะสม (จำนวนกลุ่มที่จะแบ่ง บิต Nออก) โดยกำหนดขนาดบิตNโดยการคำนวณประสิทธิภาพ: [ 13 ]
Nคือขนาดบิต (ที่ใช้ใน) ในระดับนอกสุดKให้กลุ่มของบิต โดยที่
หาค่าn ได้จาก N, Kและk โดยการหาค่า xที่เล็กที่สุดซึ่งทำให้
ถ้าหากสมมติว่าประสิทธิภาพสูงกว่า 50% และค่า kน้อยมากเมื่อเทียบกับส่วนที่เหลือของสูตร จะได้ว่า
นี่หมายความว่า: เมื่อบางสิ่งมีประสิทธิภาพสูงมากค่า Kจะถูกจำกัดค่าสูงสุดโดยหรือถูกจำกัดค่าสูงสุดในเชิงอนุกรมโดย
รหัสเทียม
ตามอัลกอริทึมมาตรฐาน อัลกอริทึมการคูณโมดูลาร์ Schönhage-Strassen (พร้อมการปรับปรุงบางอย่าง) สามารถดูภาพรวมได้จาก[ 14 ]
- แยกตัวเลขอินพุตaและbออกเป็นสัมประสิทธิ์ n ตัว โดยแต่ละตัวมี s บิต
ควรใช้หน่วยความจำอย่างน้อย บิตในการจัดเก็บข้อมูล
เพื่อ อนุญาต ให้ เข้ารหัสค่า - ถ่วงน้ำหนักเวกเตอร์สัมประสิทธิ์ทั้งสองตาม (2.24) ด้วยกำลังของθโดยทำการเลื่อนแบบวนรอบบนเวกเตอร์เหล่านั้น
- สลับค่าสัมประสิทธิ์ และ .
- จงประเมินค่า และ การคูณด้วยกำลังของ ω เป็นการเลื่อนแบบวัฏจักร
- ทำการคูณแบบจุดต่อจุดn ครั้งในถ้าใช้SMUL แบบเรียกซ้ำ ให้ระบุKเป็นพารามิเตอร์ มิฉะนั้น ให้ใช้ฟังก์ชันการคูณอื่น เช่น T3MUL แล้วลดทอนด้วยโมดูลัสในภายหลัง
- สลับค่าสัมประสิทธิ์ของผลคูณ .
- ประเมินค่าสัมประสิทธิ์ของผลิตภัณฑ์ .
- ใช้ตุ้มถ่วงตาม (2.25 ) เนื่องจากจึงสรุปได้ว่า
- ปรับค่าให้เป็นมาตรฐานด้วย ( ซึ่งเป็นการเลื่อนแบบวนรอบอีกครั้ง)
- รวมค่าทั้งหมดเข้าด้วยกันแล้วกระจายตัวทด ตรวจสอบให้แน่ใจว่าได้จัดการกับสัมประสิทธิ์ที่เป็นลบอย่างถูกต้อง
- ทำการลดทอนโมดูลั ส .
- T3MUL = การคูณแบบทูม-คุก
- SMUL = การคูณเชินฮาเกะ–สเตรสเซน
- ประเมินผล = FFT/IFFT
การศึกษาเพิ่มเติม
สำหรับรายละเอียดการใช้งาน สามารถอ่านหนังสือPrime Numbers: A Computational Perspectiveได้[ 15 ]ตัวแปรนี้แตกต่างจากวิธีการดั้งเดิมของ Schönhage เล็กน้อยตรงที่ใช้การแปลงน้ำหนักแบบไม่ต่อเนื่องเพื่อทำการคอนโวลูชันแบบเนกาไซคลิกได้อย่างมีประสิทธิภาพมากขึ้น แหล่งข้อมูลโดยละเอียดอีกแหล่งหนึ่งคือThe Art of Computer Programming ของKnuth [ 16 ]
การเพิ่มประสิทธิภาพ
ส่วนนี้จะอธิบายถึงการปรับปรุงประสิทธิภาพที่สำคัญหลายประการในการใช้งานถนนเชินฮาเก-สตราสเซิน (Schönhage–Strassen)
การใช้อัลกอริทึมการคูณอื่นๆ ภายในอัลกอริทึม
เมื่อต่ำกว่าจุดตัดที่กำหนด การใช้อัลกอริธึมการคูณแบบอื่น เช่น การคูณแบบ Toom–Cook จะมีประสิทธิภาพมากกว่า[ 17 ]
เคล็ดลับรากที่สองของ 2
แนวคิดคือการใช้เป็นรากของเอกภาพที่ มีลำดับ ในฟิลด์จำกัด(ซึ่งเป็นคำตอบของสมการ) เมื่อถ่วงน้ำหนักค่าในแนวทาง NTT (การแปลงเชิงทฤษฎีจำนวน) พบว่าสามารถประหยัดเวลาในการคูณจำนวนเต็มได้ 10% [ 18 ]
กลอุบายของแกรนลันด์
โดยการให้เราสามารถคำนวณ และร่วมกับ CRT (ทฤษฎีบทเศษเหลือของจีน) เพื่อหาค่าที่แน่นอนของการคูณ uv [ 19 ]