Ví dụ mà bạn đang đăng có liên quan rất chặt chẽ đến vấn đề Euler # 381. Vì vậy, tôi sẽ đăng một câu trả lời không giải quyết được vấn đề Euler. Tôi sẽ đăng làm thế nào bạn có thể tính giai thừa modulo một số nguyên tố.
Vậy: Cách tính n! modulo p?
Quan sát nhanh: Nếu n ≥ p, thì n! có hệ số p, do đó kết quả là 0. Rất nhanh. Và nếu chúng ta bỏ qua yêu cầu rằng p phải là một số nguyên tố thì hãy để q là thừa số nguyên tố nhỏ nhất của p và n! modulo p bằng 0 nếu n ≥ q. Cũng không có nhiều lý do để yêu cầu p là số nguyên tố để trả lời câu hỏi của bạn.
Bây giờ trong ví dụ của bạn (n - i)! cho 1 ≤ i ≤ 5 đi lên. Bạn không phải tính năm yếu tố: Bạn tính (n - 5)!, Nhân với (n - 4) đi lấy (n - 4)!, Nhân với (n - 3) để lấy (n - 3)! vv Điều này làm giảm công việc gần như một yếu tố 5. Đừng giải quyết vấn đề theo nghĩa đen.
Câu hỏi là làm thế nào để tính n! modulo m. Cách rõ ràng là tính n!, Một số có khoảng n log n chữ số thập phân và tính modulo còn lại p. Đó là công việc khó khăn. Câu hỏi: Làm thế nào chúng ta có thể nhận được kết quả này nhanh hơn? Bằng cách không làm điều rõ ràng.
Chúng ta biết rằng ((a * b * c) modulo p = (((a * b) modulo p) * c) modulo p.
Để tính n!, Chúng ta thường bắt đầu bằng x = 1, sau đó nhân x với 1, 2, 3, ... n. Sử dụng công thức modulo, chúng tôi tính n! modulo p mà không tính n!, bằng cách bắt đầu với x = 1, và sau đó với i = 1, 2, 3, .., n chúng ta thay x bằng (x * i) modulo p.
Chúng tôi luôn có x <p và i <n, vì vậy chúng tôi chỉ cần đủ độ chính xác để tính x * p, chứ không phải độ chính xác cao hơn nhiều để tính n!. Vậy để tính n! modulo p cho p 2 chúng tôi thực hiện các bước sau:
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.
.