ตัวอย่างที่คุณกำลังโพสต์นั้นเกี่ยวข้องกับปัญหาออยเลอร์อย่างมาก # 381 ดังนั้นฉันจะโพสต์คำตอบที่ไม่แก้ปัญหาออยเลอร์ ฉันจะโพสต์วิธีที่คุณสามารถคำนวณแฟคทอเรียลแบบโมดูโล
ดังนั้น: วิธีคำนวณ n! modulo p
การสังเกตอย่างรวดเร็ว: ถ้า n ≥ p ดังนั้น n! มีตัวประกอบ p ดังนั้นผลลัพธ์คือ 0 เร็วมาก และถ้าเราเพิกเฉยต่อข้อกำหนดที่ว่า p ควรเป็นไพร์มแล้วให้ q เป็นตัวประกอบที่เล็กที่สุดของ p และ n! modulo p คือ 0 ถ้า n ≥ q นอกจากนี้ยังมีเหตุผลไม่มากที่ต้องการให้ p เป็นตัวเลือกสำคัญในการตอบคำถามของคุณ
ในตัวอย่างของคุณ (n - i)! สำหรับ 1 ≤ i ≤ 5 ขึ้นมา คุณไม่ต้องคำนวณห้าแฟคทอเรียล: คุณคำนวณ (n - 5)! คูณด้วย (n - 4) ไปรับ (n - 4)! คูณด้วย (n - 3) เพื่อรับ (n - 3)! ฯลฯ ซึ่งจะช่วยลดการทำงานเกือบเป็นปัจจัย 5 อย่าแก้ปัญหาอย่างแท้จริง
คำถามคือวิธีการคำนวณ n! โมดูโลเอ็ม วิธีที่ชัดเจนคือการคำนวณ n !, ตัวเลขที่มีตัวเลขทศนิยม n log n โดยประมาณและคำนวณโมดูโลส่วนที่เหลือ นั่นเป็นงานหนัก คำถาม: เราจะได้ผลลัพธ์นี้เร็วขึ้นได้อย่างไร โดยไม่ทำสิ่งที่ชัดเจน
เรารู้ว่า ((a * b * c) modulo p = (((* * *) modulo p) * c) modulo p
ในการคำนวณ n! เรามักจะเริ่มต้นด้วย x = 1 แล้วคูณ x ด้วย 1, 2, 3, ... n การใช้สูตรโมดูโล่เราคำนวณ n! modulo p โดยไม่คำนวณ n!, โดยเริ่มต้นด้วย x = 1, และสำหรับ i = 1, 2, 3, .. , n เราแทนที่ x ด้วย (x * i) modulo p
เรามักจะมี x <p และ i <n ดังนั้นเราจึงต้องการเพียงความแม่นยำเพียงพอในการคำนวณ x * p ไม่ใช่ความแม่นยำที่สูงกว่าในการคำนวณ n! ดังนั้นเพื่อคำนวณ n! modulo p สำหรับ p ≥ 2 เราทำตามขั้นตอนต่อไปนี้:
Step 1: Find the smallest prime factor q of p. If n ≥ q then the result is 0.
Step 2: Let x = 1, then for 1 ≤ i ≤ n replace x with (x * i) modulo p, and x is the result.
(บางคำตอบพูดถึงทฤษฎีบทของ Wilson ซึ่งตอบเฉพาะคำถามในกรณีพิเศษของตัวอย่างที่กำหนดและมีประโยชน์มากในการแก้ปัญหาออยเลอร์ # 381 แต่โดยทั่วไปแล้วไม่มีประโยชน์ในการแก้ปัญหาที่ถาม)