バックグラウンド
前回は、特定のサイズのグループをカウントしましたが、これは重要な問題です。
今回は、アーベルのグループ、つまり可換演算を持つグループのみをカウントします。正式に、基(G、*)がアーベルである場合、X * Y = Y * XすべてのためのためのX、YにおけるG。
この方法で問題ははるかに単純になるため、効率的にカウントします。
仕事
入力として負でない整数nを受け入れ、次数nの非同型アーベル群の数を出力または返すプログラムまたは関数を作成します。
グループの数を計算する1つの方法(A(n)で示します)は、次のことを確認することです。
A(0)= 0
場合、pは素数であり、A(Pのkは)の整数パーティションの数に等しいK。(cfr。OEIS A000041)
もしN = MK、及びMとkが互いに素であり、A(N)= A(M)A(K) 。
これまたはA(n)を計算する他の方法を使用できます。
テストケース
Input Output
0 0
1 1
2 1
3 1
4 2
5 1
6 1
7 1
8 3
9 2
10 1
11 1
12 2
13 1
14 1
15 1
16 5
17 1
18 2
19 1
20 2
4611686018427387904 1300156
5587736968198167552 155232
9223371994482243049 2
(OEIS A000688から取得)
追加のルール
十分な時間、RAM、および入力を保持できるレジスタサイズがあれば、コードは(理論的には)任意の大きな整数で動作するはずです。
あなたのコードは、すべての整数間のために働かなければなら0と2 63 1 -私のマシンで10分(インテルi7-3770、16ジブRAM、Fedoraの21)の下で、終了。
回答を送信する前に、最後の3つのテストケースのコードのタイミングを確認してください。
Mathematicaのような、このタスクを単純化するビルトイン
FiniteAbelianGroupCount
は許可されていません。整数のパーティションまたはリストのパーティションを返すまたはカウントするビルトインは許可されていません。
標準のコードゴルフ規則が適用されます。