以前に確率をすばやく正確に計算する方法について質問しました。しかし、明らかに、閉じた形のソリューションが与えられたので、それはあまりにも簡単でした!これはより難しいバージョンです。
このタスクは、確率を正確かつ迅速に計算するコードを記述することです。出力は、最も縮小された形式で分数として記述された正確な確率でなければなりません。つまり、出力んです4/8けど、むしろ1/2。
いくつかの正の整数の場合n、1と-1の長さの一様にランダムな文字列を検討し、nそれをAと呼びます。次にA、それ自体のコピーに連結します。これはA[1] = A[n+1]、1からインデックスを作成する場合A[2] = A[n+2]などです。 A今長さがあり2nます。ここでn、最初のn値が-1、0、または1であり、確率がそれぞれ1 / 4、1 / 2、1 / 4 である長さの2番目のランダムな文字列についても検討し、Bと呼びます。
今の内積考えるBとA[1+j,...,n+j]異なるためにj =0,1,2,...。
たとえば、を検討してくださいn=3。以下のための可能な値Aとは、B可能性A = [-1,1,1,-1,...]とB=[0,1,-1]。この場合、最初の2つの内積は0および2です。
仕事
それぞれについて、jで始まるj=1コードは、すべての最初のj+1内積がすべてゼロになる確率を出力する必要がありますn=j,...,50。
MartinBüttnerが作成したテーブルをコピーするj=1と、次のサンプル結果が得られます。
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
スコア
あなたのスコアは、j私のコンピューターでコードが1分で完了する最大のスコアです。少し明確にするために、それぞれjに1分を与えます。前のリンクされた質問の動的プログラミングコードは、これを簡単に実行しj=1ます。
タイ・ブレーカー
2つのエントリが同じjスコアを取得した場合n、私のマシンで1分間で最高のスコアを獲得したエントリが勝者となりますj。2つの最高のエントリがこの基準でも等しい場合、勝者が最初に送信された回答になります。
言語とライブラリ
自由に利用できる言語とライブラリを使用できます。私はあなたのコードを実行できなければならないので、可能であればLinuxでコードを実行/コンパイルする方法の完全な説明を含めてください。
私のマシンタイミングは私のマシンで実行されます。これは、AMD FX-8350 8コアプロセッサへの標準のUbuntuインストールです。これは、コードを実行できる必要があることも意味します。
入賞作品
j=2でPythonのミッチ・シュワルツによって。j=2でPythonの feersumによります。現在最速のエントリー。