!n mod p
(混乱の数)where n ≤ 2∗10^8
を実装する簡単な方法はありますかp
?p < 1000
単純なアプローチが機能しないように、プログラムは高速に実行する必要があります。
!n mod p
の周期で周期的であることがわかり2p
ます。!n mod p
したがって、として計算できます!(n mod 2p) mod p
。これは、 derangements の再帰式で行い!n = (n-1) (!(n-1) + !(n-2))
ます。
証明のために:
!(p+1) = 0 mod p
混乱の再帰関係によって、 を観察します。!(n+p) = !p * !n
します (これは、前の観測を使用して帰納的に証明できます)。!p = -1 mod p
ください。ウィキペディアでは次の式を提供して!n = n! - Sum[(n choose i) * !(n-i), i=1..n]
いますi=n
。!(n+2p) = !p !p !n = !n mod p
ます。証明から、が より小さい!n = ± !(n mod p) mod p
場合、符号が正である場所を実際に計算できることがわかります。n mod 2p
p
再帰的な式 ( !n = (n - 1) (!(n-1) + !(n-2))
) があるのに、「剰余の乗算p
」と「剰余の剰余」の演算を実装してみませんp
か?