กลับไปหน้าบทความ

อ่าน 16 นาที

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

CS1: ค่าปริมาณยาว/CS1 แหล่งที่มาภาษาเยอรมัน (de)/อัลกอริธึมทางคณิตศาสตร์ของคอมพิวเตอร์/การคูณ/ลิงก์ย้อนกลับเทมเพลต Webarchive

อัลกอริทึม Schönhage–Strassen เป็น อัลกอริทึมการคูณที่รวดเร็วในเชิง อะซิมโทติก สำหรับจำนวนเต็มขนาด ใหญ่ ซึ่งเผยแพร่โดยArnold SchönhageและVolker Strassenในปี 1971 อัลกอริทึม...

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

อัลกอริทึม Schönhage–Strassen นั้นอิงตามวิธีการแปลงฟูริเยร์แบบเร็ว (FFT) ของการคูณจำนวนเต็มรูปนี้แสดงการคูณ 1234 × 5678 = 7006652 โดยใช้วิธี FFT แบบง่าย ฐาน 10 ถูกนำมาใช้แทนฐาน 2w เพื่อให้เห็นภาพชัดเจนยิ่งขึ้น
เชินฮาเก (ทางขวา) และ สตราสเซิน (ทางซ้าย) กำลังเล่นหมากรุกกันที่โอเบอร์โวล์ฟาคในปี 1979

อัลกอริทึม 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 ]

  1. แยกตัวเลขอินพุตaและbออกเป็นสัมประสิทธิ์ n ตัว โดยแต่ละตัวมี s บิต

    ควรใช้หน่วยความจำอย่างน้อย⁠ ⁠บิตในการจัดเก็บข้อมูล

    เพื่อ อนุญาต ให้ เข้ารหัสค่า
  2. ถ่วงน้ำหนักเวกเตอร์สัมประสิทธิ์ทั้งสองตาม (2.24) ด้วยกำลังของθโดยทำการเลื่อนแบบวนรอบบนเวกเตอร์เหล่านั้น
  3. สลับค่าสัมประสิทธิ์⁠ ⁠และ⁠ ⁠ .
  4. จงประเมินค่า ⁠ ⁠และ⁠ ⁠การคูณด้วยกำลังของ ω เป็นการเลื่อนแบบวัฏจักร
  5. ทำการคูณแบบจุดต่อจุดn ครั้งในถ้าใช้SMUL แบบเรียกซ้ำ ให้ระบุKเป็นพารามิเตอร์ มิฉะนั้น ให้ใช้ฟังก์ชันการคูณอื่น เช่น T3MUL แล้วลดทอนด้วยโมดูลัในภายหลัง
  6. สลับค่าสัมประสิทธิ์ของผลคูณ⁠ ⁠ .
  7. ประเมินค่าสัมประสิทธิ์ของผลิตภัณฑ์⁠ ⁠ .
  8. ใช้ตุ้มถ่วงตาม (2.25 ) เนื่องจากจึงสรุปได้ว่า
  9. ปรับค่าให้เป็นมาตรฐานด้วย ( ซึ่งเป็นการเลื่อนแบบวนรอบอีกครั้ง)
  10. รวมค่าทั้งหมดเข้าด้วยกันแล้วกระจายตัวทด ตรวจสอบให้แน่ใจว่าได้จัดการกับสัมประสิทธิ์ที่เป็นลบอย่างถูกต้อง
  11. ทำการลดทอนโมดูลั ส ⁠ ⁠ .
  • 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 ]

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Schönhage–Strassen_algorithm&oldid=1353297960 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ อัลกอริทึมเชินฮาเกอ–สตราสเซน

อัลกอริทึม Schönhage–Strassen เป็น อัลกอริทึมการคูณที่รวดเร็วในเชิง อะซิมโทติก สำหรับจำนวนเต็มขนาด ใหญ่ ซึ่งเผยแพร่โดยArnold SchönhageและVolker Strassenในปี 1971 อัลกอริทึม...

คำอธิบาย

ส่วนนี้มีอัลกอริทึมเวอร์ชันที่เรียบง่ายกว่า ซึ่งแสดงวิธีการคำนวณผลคูณของจำนวนธรรมชาติสองจำนวนโดยใช้โมดูลัสของจำนวนในรูปแบบโดยที่เป็นจำนวนคงที่บางจำนวน จำนวนเต็มจะต้องถูกแบ่งออกเป็นบล็อกของบิต ดังนั้นในการใช้งานจริง...

รายละเอียด

ทุกจำนวนในระบบฐาน B สามารถเขียนได้ในรูปพหุนาม:

ทำไม N = 2 M + 1 mod N

ในอัลกอริทึม Schönhage–Strassen ควรคิดว่าเป็น ต้นไม้ไบนารี โดยมีค่าอยู่ในโดยให้สำหรับแต่ละ K สามารถค้นหาทั้งหมดและจัดกลุ่มคู่ทั้งหมดเป็น M กลุ่มที่แตกต่างกัน การใช้เพื่อจัดกลุ่มคู่ผ่านการสังเคราะห์เป็นปัญหาคลาสสิกในอัลกอริทึม [ 9 ] N = 2 M + 1 {\displaystyle...