gpt4 book ai didi

wolfram-mathematica - IntegerPartition 的变体?

转载 作者:行者123 更新时间:2023-12-04 02:54:10 25 4
gpt4 key购买 nike

IntegerPartitions[n, {3, 10}, Prime ~Array~ 10]

在 Mathematica 中,这将给出获取 n 作为前十个素数的三到十之和的所有方法的列表,根据需要允许重复。

如何有效地找到等于 n 的总和,允许每个元素 只能使用一次 ?

使用前十个素数只是一个玩具示例。我寻求对任意论点有效的解决方案。在实际情况下,生成所有可能的和,即使使用多项式系数,也会占用太多内存。

我忘了包括我正在使用 Mathematica 7。

最佳答案

下面将构建一个二叉树,然后对其进行分析并提取结果:

Clear[intParts];
intParts[num_, elems_List] /; Total[elems] < num := p[];
intParts[num_, {fst_, rest___}] /;
fst < num := {p[fst, intParts[num - fst, {rest}]], intParts[num, {rest}]};
intParts[num_, {fst_, rest___}] /; fst > num := intParts[num, {rest}];
intParts[num_, {num_, rest___}] := {pf[num], intParts[num, {rest}]};


Clear[nextPosition];
nextPosition =
Compile[{{pos, _Integer, 1}},
Module[{ctr = 0, len = Length[pos]},
While[ctr < len && pos[[len - ctr]] == 1, ++ctr];
While[ctr < len && pos[[len - ctr]] == 2, ++ctr];
Append[Drop[pos, -ctr], 1]], CompilationTarget -> "C"];

Clear[getPartitionsFromTree, getPartitions];
getPartitionsFromTree[tree_] :=
Map[Extract[tree, #[[;; -3]] &@FixedPointList[nextPosition, #]] &,
Position[tree, _pf, Infinity]] /. pf[x_] :> x;
getPartitions[num_, elems_List] :=
getPartitionsFromTree@intParts[num, Reverse@Sort[elems]];

例如,
In[14]:= getPartitions[200,Prime~Array~150]//Short//Timing

Out[14]= {0.5,{{3,197},{7,193},{2,5,193},<<4655>>,{3,7,11,13,17,19,23,29,37,41},
{2,3,5,11,13,17,19,23,29,37,41}}}

这并不是非常快,也许算法可以进一步优化,但至少分区的数量不会像 IntegerPartitions 那样快速增长。 .

编辑:

有趣的是,在我之前使用的示例中,简单的内存将解决方案的速度提高了大约两倍:
Clear[intParts];
intParts[num_, elems_List] /; Total[elems] < num := p[];
intParts[num_, seq : {fst_, rest___}] /; fst < num :=
intParts[num, seq] = {p[fst, intParts[num - fst, {rest}]],
intParts[num, {rest}]};
intParts[num_, seq : {fst_, rest___}] /; fst > num :=
intParts[num, seq] = intParts[num, {rest}];
intParts[num_, seq : {num_, rest___}] :=
intParts[num, seq] = {pf[num], intParts[num, {rest}]};

现在,
In[118]:= getPartitions[200, Prime~Array~150] // Length // Timing

Out[118]= {0.219, 4660}

关于wolfram-mathematica - IntegerPartition 的变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com