将大数分解为三元组
我发现了类似的问题,但这有点复杂。
我有一个很大的数字(我其实有更多,但现在没有关系),(> 40位),我想找到一个* b * c = n三元组。 n的主要因素化完成。 它没有大的素数因子,但有许多小的素数因子。 所有主要除数(包括多个除数)的总和大于50。
我想找到一个* b * c = n三元组,其中a <= b <= c。 我不想要所有的三胞胎,因为它们太多了。 我正在寻找特殊的。
例如:
如果我们知道n = k!(阶乘),这可能会更容易解决。 解决可能会导致一种通用的方法。 由于n的大小,用蛮力计算所有这些三元组是不可取的,所以我需要一个好的算法或一些特殊的工具来帮助我为此实现一个解决方案。
对不起,我的英语不好,
感谢您的答案!
你可以用一个简单的O(|D|^2)
算法实现它,其中D
是所有除n
的所有数字的有序列表。
注意你只需要找到a,b
,因为c=n/(a*b)
,所以问题归结为找到D
所有对(a,b)
,使得a<b
和n/(a*b) ∈ D
。
伪代码:
result = empty_list
for (int i=0; i<D.size-1, i++) { // O(|D|)
for (j=i+1; j<D.size, j++) { // O(|D|)
a, b = D[i], D[j]
c = n/(a*b)
if (D.contains(c) && c>b) { // O(1)
result.append( (a,b,c) )
}
}
} // O(|D|)*O(|D|)=O(|D|^2)
我可能有解决方案,但我今天没有时间实施它。 我把它写下来,所以也许有人会同意我的观点或者会发现我算法的弱点。
所以,让我们看看第一个或第二个案例,其中c / a或ca应该是最小的。
1:在第一步中,我用贪婪算法将n的素数因子分成3组。 我会有一个初始的a,b和c,他们彼此不会很远。 主要因素将存储在3个数组中:a_pf,b_pf,c_pf。
2:在下一步中,我计算a,b和c的所有可能因素,并将它们存储在不同的数组中,然后我对这些数组进行排序。 这些将是a_all,b_all和c_all。
3:我计算q = max(a,b,c)/ min(a,b,c)。 (现在我们可以说a是最小的,c是最大的数字)
4:我在这个条件中搜索a_all和c_all以获取数字:c_all [i] / a_all [j] <q。 当我找到它时,我在a_pf和c_pf中更改这些值的主要因素。 用这种方法,三元组中最大和最小的成员将彼此更接近。
我重复步骤2-3-4,直到我可以。 我认为这将在有限的步骤后结束。
由于三元组的成员比原来的n小,我希望这个解决方案能够在几分钟内最多给出正确的三元组。
链接地址: http://www.djcxy.com/p/61379.html