課題は、行列のパーマネントを計算するために可能な限り速いコードを書くことです。
永久n
行列のn
行列A
=( a
i,j
)は以下のように定義されます
ここでS_n
のすべての順列の集合を表します[1, n]
。
例として(wikiから):
この質問では、行列はすべて正方形で、値-1
と1
その中のみを持ちます。
例
入力:
[[ 1 -1 -1 1]
[-1 -1 -1 1]
[-1 1 -1 1]
[ 1 -1 -1 1]]
永久:
-4
入力:
[[-1 -1 -1 -1]
[-1 1 -1 -1]
[ 1 -1 -1 -1]
[ 1 -1 1 -1]]
永久:
0
入力:
[[ 1 -1 1 -1 -1 -1 -1 -1]
[-1 -1 1 1 -1 1 1 -1]
[ 1 -1 -1 -1 -1 1 1 1]
[-1 -1 -1 1 -1 1 1 1]
[ 1 -1 -1 1 1 1 1 -1]
[-1 1 -1 1 -1 1 1 -1]
[ 1 -1 1 -1 1 -1 1 -1]
[-1 -1 1 -1 1 1 1 1]]
永久:
192
入力:
[[1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1],
[1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
[-1, -1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, -1],
[-1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
[-1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1],
[1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1],
[1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1],
[1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1],
[-1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1],
[1, 1, -1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1],
[1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1],
[1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1],
[-1, 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, 1, 1],
[1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, 1, -1, 1],
[1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1],
[-1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1]]
永久:
1021509632
タスク
n
by n
マトリックスを指定して、そのパーマネントを出力するコードを作成する必要があります。
コードをテストする必要があるので、たとえば標準入力から読み込むなど、コードへの入力としてマトリックスを提供する簡単な方法を提供していただければ助かります。
パーマネントは大きくなる可能性があることに注意してください(すべて1の行列は極端な場合です)。
スコアとタイ
増加するサイズのランダム+ -1行列でコードをテストし、コンピューターでコードが1分以上かかったときに停止します。スコアリングマトリックスは、公平性を確保するために、すべての提出物で一貫しています。
2人が同じスコアを獲得した場合、勝者はの値に対して最速のものですn
。それらが互いに1秒以内にある場合は、最初に投稿されたものです。
言語とライブラリ
利用可能な任意の言語とライブラリを使用できますが、パーマネントを計算するための既存の関数は使用できません。可能であれば、コードを実行できるとよいので、可能な限りLinuxでコードを実行/コンパイルする方法の完全な説明を含めてください。
参照実装
小さな行列のパーマネントを計算するためのさまざまな言語のコードがたくさんあるcodegolfの質問が既にあります。MathematicaとMapleには、それらにアクセスできれば永続的な実装もあります。
マイマシンタイミングは64ビットマシンで実行されます。これは、8GB RAM、AMD FX-8350 8コアプロセッサ、およびRadeon HD 4250を備えた標準のUbuntuインストールです。これは、コードを実行できる必要があることも意味します。
私のマシンに関する低レベルの情報
cat /proc/cpuinfo/|grep flags
与える
フラグ:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc ap_c_sq sq rep_good nopl nonstop_tsc aq f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_ncs nfs cpb hw_pstate vmmcall npf ns
Scala、Nim、Julia、Rust、Bashの愛好家が自分の言語を誇示することができるように、大きなInt問題に悩まされない、密接に関連する多言語の質問をします。
リーダーボード
- n = 33(45秒。n= 34の場合は64秒)。g ++ 5.4.0を使用したC ++のTon Hospel。
- n = 32(32秒)。デニスでCトンHospelのgccのフラグを使用してgccの5.4.0で。
- n = 31(54秒)。クリスチャンのSieversでハスケル
- n = 31(60秒)。プリモでrpython
- n = 30(26秒)。ezrastで錆
- n = 28(49秒)。XNORとのPython + pypy 5.4.1
- n = 22(25秒)。シェバングとのPython + pypy 5.4.1
注。実際には、デニスとトンホスペルのタイミングは神秘的な理由で大きく異なります。例えば、ウェブブラウザをロードした後、それらはより速くなるようです!引用されたタイミングは、私が行ったすべてのテストで最速です。