Приклад, який ви публікуєте, дуже тісно пов'язаний з проблемою Ейлера № 381. Тож я опублікую відповідь, яка не вирішує проблему Ейлера. Я розміщу повідомлення про те, як ви можете обчислити фабрику по модулю просте.
Отже: Як обчислити n! модуль p?
Швидке спостереження: Якщо n ≥ p, то n! має коефіцієнт р, тому результат дорівнює 0. Дуже швидко. І якщо ми ігноруємо вимогу, що р має бути простим, нехай q є найменшим простим фактором p, і n! модуль p дорівнює 0, якщо n ≥ q. Існує також не так багато причин вимагати, щоб р - це прем'єр-мінімум, щоб відповісти на ваше запитання.
Тепер у вашому прикладі (n - i)! для 1 ≤ i ≤ 5 підійшов. Вам не доведеться обчислювати п’ять факторіалів: Ви обчислюєте (n - 5) !, множите на (n - 4) go get (n - 4) !, множте на (n - 3), щоб отримати (n - 3)! і т.д. Це зменшує роботу майже в 5 разів. Не вирішуйте проблему буквально.
Питання в тому, як обчислити n! модуль м. Очевидний спосіб - обчислити n !, число з приблизно n log n десятковими цифрами та обчислити решту модуля p. Це важка робота. Питання: Як можна швидше отримати цей результат? Не роблячи очевидної речі.
Ми знаємо, що ((a * b * c) modulo p = (((a * b) modulo p) * c) модуль p.
Для обчислення n !, ми зазвичай починаємо з x = 1, а потім множимо x на 1, 2, 3, ... n. Використовуючи формулу модуля, обчислюємо n! модуль p без обчислення n !, починаючи з x = 1, а потім для i = 1, 2, 3, .., n замінюємо x на (x * i) модулем p.
У нас завжди є x <p і i <n, тому для обчислення х * р нам потрібна лише достатня точність, а не значна більша точність для обчислення n !. Отже, обчислити n! по модулю 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.
(Деякі відповіді згадують теорему Вілсона, яка відповідає лише на питання в особливому випадку з наведеного прикладу, і дуже корисна для вирішення проблеми Ейлера № 381, але взагалі не корисно вирішувати задане питання).