計算複雑性理論において、計算複雑性クラス#P (「シャープ P」、あるいは「ナンバー P」や「ハッシュ P」と発音される) は、集合NP内の決定問題に関連付けられた計数問題の集合である。より正式には、#Pは「 f ( x ) を計算する」という形式の関数問題のクラスであり、ここでfは多項式時間で実行される非決定性チューリングマシンの受理パスの数である。よく知られているほとんどの計算複雑性クラスとは異なり、これは決定問題のクラスではなく、関数問題のクラスである。このクラスの最も困難で代表的な問題は、#P 完全である。
NP決定問題は、多くの場合、「特定の制約を満たす解決策は存在するか」という形式で表現されます。たとえば、次のようになります 。
対応する#P関数の問題では、「あるか」ではなく「いくつあるか」を問うことになります。例えば:
明らかに、#P問題は対応するNP問題と少なくとも同程度に難しいはずです。答えを数えるのが簡単であれば、答えがあるかどうかを判断するのも簡単でなければなりません。つまり、答えを数えて、その数が0より大きいかどうかを確認するだけです。これらの問題の中には、根の数え上げのようにFPに分類できるほど簡単なものもあれば、#P完全であるものもあります。
戸田の定理から導かれる一つの帰結は、 #Pオラクル(P #P)を持つ多項式時間マシンは、 PH内のすべての問題、すなわち多項式階層全体を解くことができるということです。実際、多項式時間マシンは、PH内の任意の問題を解くのに、たった1回の#Pクエリを実行するだけで済みます。これは、 #P完全問題を正確に解くことが極めて困難であることを示しています。
驚くべきことに、難しいと思われている#P問題の中には、簡単な(例えば線形時間)P問題に対応するものもあります。詳しくは#P完全を参照してください。
#Pに最も近い決定問題クラスはPPです。これは、計算パスの過半数(半数以上)が受け入れるかどうかを問うものです。これは、#P問題の解答の最上位ビットを求めます。決定問題クラス⊕P (「パリティP」と発音)は、 #Pの解答の最下位ビットを求めます。
#Pは正式には次のように定義されます。
#P は検証者を用いて同様に定義することもできる。ある決定問題がNPに属するとは、与えられた問題インスタンスに対して多項式時間で検証可能な証明書が存在する場合である。つまり、NP は入力の正しさが多項式時間で検証可能なメンバーシップ証明が存在するかどうかを問う。#Pにおける問いは、ある問題インスタンスに対して多項式時間で正しさが検証可能な証明書がいくつ存在するかを問うものである。 [ 1 ]この文脈において、#Pは以下のように定義される。
計算量クラス#Pは、1979年の正方行列のパーマネントの計算に関する論文でレスリー・ヴァリアントによって初めて定義され、パーマネントが#P完全であることを証明した。[ 3 ]
ラリー・ストックマイヤーは、あらゆる#P問題に対して、SATのオラクルを用いたランダム化アルゴリズムが存在することを証明した。このアルゴリズムは、とのインスタンスが与えられると、高い確率で となる数を返す。[ 4 ] このアルゴリズムの実行時間はと の多項式である。このアルゴリズムは、残余ハッシュ補題に基づいている。