数に等しい二項係数を見つけることの複雑さ
バイナリエンコーディングでビットを使用して)数値取得していると仮定します。O (log m )mmmO(logm)O(logm)O(\log m) どれだけ速く見つけることができますか(またはそのようなものが存在しないと判断しますn,k∈N,1<k≤n2:(nk)=mn,k∈N,1<k≤n2:(nk)=mn,k\in \mathbb N, 1<k\leq\frac{n}{2}:{n \choose k}=m か)? たとえば、入力m = 8436285が与えられた場合、n = 27、k = 10をm=8436285m=8436285m=8436285出力できます。n=27,k=10n=27,k=10n=27, k=10 問題の単純なアルゴリズムは、nのすべての可能な値を調べ、プロパティを満たすkのnnn値を検索します。kkk 簡単な観察は、\ log mより小さいまたはO(\ sqrt m)より大きいnの値をチェックする必要がないということです。ただし(n値ごとにO(1)可能なk値のみをチェックできたとしても)これは、入力サイズが指数関数的である非効率的なアルゴリズムになります。nnnlogmlogm\log mO(m−−√)O(m)O(\sqrt m)O(1)O(1)O(1)kkknnn 別のアプローチは、kの可能な値kkkを調べて(\ {2,3、\ ldots、2 \ log m \}をチェックするのに十分です{2,3,…,2logm}{2,3,…,2logm}\{2,3,\ldots,2\log m\})、nnn値をチェックするたびに行います。その後、次を使用できます: (nk)k<(nk)<nkk!(nk)k<(nk)<nkk!\left(\frac{n}{k}\right)^k<{n\choose k}< \frac{n^k}{k!} したがって、与えられたkに対して、範囲[\ sqrt [\ leftroot {-2} \ uproot {2} k] {m \ …