この課題は、計算が困難な無限和を実行できる高速コードを記述することです。
入力
マトリックスよりも小さい整数のエントリを持つ絶対値です。テストするときは、コードに必要な適切な形式でコードに入力を提供できてうれしいです。デフォルトは、マトリックスの行ごとに1行で、スペースで区切られて標準入力に提供されます。n
n
P
100
P
なります正定それは常に対称になる暗示います。それ以外は、チャレンジに答えるために正の明確な意味を本当に知る必要はありません。ただし、実際に以下に定義する合計に対する答えがあることを意味します。
ただし、行列ベクトル積とは何かを知る必要があります。
出力
コードで無限和を計算する必要があります。
正解のプラスまたはマイナス0.0001以内。ここではZ
整数の集合であり、これZ^n
ですべての可能なベクトルであるn
整数要素とe
ある有名な数学定数は約2.71828に等しいです。指数の値は単なる数値であることに注意してください。明示的な例については、以下を参照してください。
これはリーマンシータ関数とどのように関係しますか?
リーマンシータ関数の近似に関するこの論文の記法では、計算しようとしています。私たちの問題は、少なくとも2つの理由で特別なケースです。
z
リンクされたペーパーで呼び出される初期パラメーターを0に設定します。P
固有値の最小サイズがになるような方法で行列を作成します1
。(マトリックスの作成方法については、以下を参照してください。)
例
P = [[ 5., 2., 0., 0.],
[ 2., 5., 2., -2.],
[ 0., 2., 5., 0.],
[ 0., -2., 0., 5.]]
Output: 1.07551411208
より詳細には、このPの合計に含まれる1つの用語のみを見てみましょう。
および x^T P x = 30
。これe^(-30)
は約で10^(-14)
あり、与えられた許容範囲まで正しい答えを得るために重要ではないことに注意してください。無限和は、要素が整数である長さ4のすべての可能なベクトルを実際に使用することを思い出してください。明示的な例を示すために1つだけを選択しました。
P = [[ 5., 2., 2., 2.],
[ 2., 5., 4., 4.],
[ 2., 4., 5., 4.],
[ 2., 4., 4., 5.]]
Output = 1.91841190706
P = [[ 6., -3., 3., -3., 3.],
[-3., 6., -5., 5., -5.],
[ 3., -5., 6., -5., 5.],
[-3., 5., -5., 6., -5.],
[ 3., -5., 5., -5., 6.]]
Output = 2.87091065342
P = [[6., -1., -3., 1., 3., -1., -3., 1., 3.],
[-1., 6., -1., -5., 1., 5., -1., -5., 1.],
[-3., -1., 6., 1., -5., -1., 5., 1., -5.],
[1., -5., 1., 6., -1., -5., 1., 5., -1.],
[3., 1., -5., -1., 6., 1., -5., -1., 5.],
[-1., 5., -1., -5., 1., 6., -1., -5., 1.],
[-3., -1., 5., 1., -5., -1., 6., 1., -5.],
[1., -5., 1., 5., -1., -5., 1., 6., -1.],
[3., 1., -5., -1., 5., 1., -5., -1., 6.]]
Output: 8.1443647932
P = [[ 7., 2., 0., 0., 6., 2., 0., 0., 6.],
[ 2., 7., 0., 0., 2., 6., 0., 0., 2.],
[ 0., 0., 7., -2., 0., 0., 6., -2., 0.],
[ 0., 0., -2., 7., 0., 0., -2., 6., 0.],
[ 6., 2., 0., 0., 7., 2., 0., 0., 6.],
[ 2., 6., 0., 0., 2., 7., 0., 0., 2.],
[ 0., 0., 6., -2., 0., 0., 7., -2., 0.],
[ 0., 0., -2., 6., 0., 0., -2., 7., 0.],
[ 6., 2., 0., 0., 6., 2., 0., 0., 7.]]
Output = 3.80639191181
スコア
サイズが増加するランダムに選択された行列Pでコードをテストします。
あなたのスコアは単純に最大n
でありP
、そのサイズのランダムに選択された行列で5回実行して平均すると、30秒未満で正解が得られます。
ネクタイはどうですか?
同点の場合、勝者は5回の実行で平均してコードが最も速く実行されるものになります。それらの時間が同じ場合、勝者が最初の答えです。
ランダム入力はどのように作成されますか?
- Mを、m <= nおよび-1または1のエントリを持つランダムなm行n列の行列とします
M = np.random.choice([0,1], size = (m,n))*2-1
。実際にはm
約になりn/2
ます。 - Pを単位行列+ M ^ T Mとする。Python/ numpyでは
P =np.identity(n)+np.dot(M.T,M)
。現在P
、正定であり、エントリが適切な範囲にあることが保証されています。
これは、Pのすべての固有値が少なくとも1であることを意味し、リーマンシータ関数を近似する一般的な問題よりも問題を潜在的に簡単にすることに注意してください。
言語とライブラリ
任意の言語またはライブラリを使用できます。ただし、スコアリングの目的でコードをマシンで実行するため、Ubuntuでコードを実行する方法について明確な指示を提供してください。
私のマシンタイミングは私のマシンで実行されます。これは、8GB AMD FX-8350 8コアプロセッサへの標準のUbuntuインストールです。これは、コードを実行できる必要があることも意味します。
主要な回答
n = 47
でC ++トンHospelによってn = 8
でPythonの Maltysenによって
x
のが[-1,0,2,1]
。これについて詳しく説明していただけますか?(ヒント:私は数学の第一人者ではありません)