投稿している例は、オイラー問題#381と非常に密接に関連しています。オイラー問題を解決しない答えを投稿します。素数を法とする階乗を計算する方法を投稿します。
だから:nを計算する方法!モジュロp?
迅速な観察:n≥pの場合、n!係数pがあるため、結果は0です。非常に高速です。そして、pが素数であるという要件を無視する場合、qをpの最小素因数とし、n!n≥qの場合、モジュロpは0です。pがあなたの質問に答える素数であることを要求する理由はあまりありません。
あなたの例では(n-i)!1≤i≤5が登場しました。5つの階乗を計算する必要はありません:(n-5)!を計算し、(n-4)を乗算してget(n-4)を取得し、(n-3)を乗算して(n-3)を取得します!これにより、作業がほぼ5分の1に削減されます。問題を文字通り解決しないでください。
問題は、nの計算方法です。モジュロm 明らかな方法は、おおよそn log nの10進数を持つ数値n!を計算し、pを法とする剰余を計算することです。それは大変な仕事です。質問:どうすればこの結果をより早く取得できますか?明らかなことをしないことによって。
((a * b * c)modulo p =((((a * b)modulo p)* c)modulo p。
n!を計算するには、通常x = 1から始め、xに1、2、3、... nを掛けます。モジュロ式を使用して、n!を計算します。n!を計算せずにpを法として、x = 1から始めて、i = 1、2、3、..、nの場合、xを(x * i)を法とするpで置き換えます。
常にx <pおよびi <nであるため、x!pを計算するのに十分な精度のみが必要であり、n!を計算するのにそれほど高い精度は必要ありません。だからnを計算する!p≥2のpを法として、次の手順を実行します。
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を解決するのに非常に有用ですが、一般に尋ねられた質問を解決するのには有用ではありません)