列出所有可能的方法将数字分解为k个因子的算法?

时间:2015-05-30 07:03:38

标签: algorithm combinations combinatorics multiset

作为我通过项目Euler探索算法的努力的一部分,我正在尝试编写一个接受整数'n',多个因子'k'并将其分解的方法。如果不可能,它将引发错误。

例如,如果我输入factorize(13257440,3),该函数将返回包含3个元素的所有可能唯一集的列表,其中3个元素的乘积等于13257440.

我的第一个是生成n的多组素数因子('m'表示集合的大小),然后将集合划分为k个分区。确定分区大小后,我会将其视为组合问题。

我在为上述两部分制定算法时遇到了麻烦,并且不知道从哪里开始。我用一个简单的解决方案复杂化了一个简单的问题吗?如果没有,推荐的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:0)

  1. 素数分解

    找到所有可以除n而没有余数的素数。使用Eratosthenes筛来大大加快这个过程。

    您可以使用/修改我的(警告此链接是项目Euler扰流器

    现在您需要修改代码,以便将主要列表更改为multiplicants列表。例如,如果n=12这将找到{ 2,3 }并且您需要{ 2,2,3 },那么如果找到分频器素数,则一次又一次地检查它,直到它不再可分割,每次都减去n

    为每个找到的素数添加一个标记(使用?)以加快下一步...

  2. 组合部分

    我假设乘法器可以是相同的,因此在开始时将k1添加到素数列表并创建函数,该函数创建数字的所有可能性,直到找到未使用的x素数。添加未使用的素数m的计数器,因此在开始时m设置为素数列表大小,并且标志都设置为未使用。

    现在您需要找到使用列表中1..m-k+1个数字的所有可能性。每次迭代都会将所选数字设置为已使用并减少m,因此它类似于:

    for (o=1;o<=m-k+1;o++)
    

    此处找到o个未使用过的数字的所有组合,因此请将其作为基数o的{​​{1}}数字生成处理,而不进行数字重复o排列。

    你可以使用它(警告此链接是Euler剧透):

    不要忘记为每个使用的数字设置标志,并在迭代完成后取消设置。重写此函数,使其与调用o!迭代,findfirst()类似于我的排列类。

    现在,您可以嵌套所有findnext()次(使用排列链接中的嵌套k或每次减少fork时递归/ p>