背景
上一次,我们计算了给定大小的组,这不是一个简单的问题。
这次,我们将仅计算Abelian组,即具有可交换运算的组。形式上,一组(G,*)是阿贝尔如果X * Y = Y * X为所有的x,y在ģ。
这种方法使问题变得更加简单,因此我们将有效地对其进行计数。
任务
编写一个程序或函数,该程序或函数接受一个非负整数n作为输入,并打印或返回n阶的非同构阿贝尔群。
一种计算组数的方法(将用A(n)表示)是通过观察以下内容:
A(0)= 0
如果p是素数,则A(p k)等于k的整数分区数。(由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)。
在提交答案之前,请确保您为最后三个测试用例安排了时间。
FiniteAbelianGroupCount
不允许使用琐碎该任务的内置程序,例如Mathematica 。不允许内置函数返回或计算数字的整数分区或列表的分区。
适用标准代码高尔夫球规则。