6

在数学中

a = FactorInteger[44420069694]

分配

{{2, 1}, {3, 1}, {7, 1}, {11, 2}, {13, 1}, {23, 2}, {31, 1}, {41, 1}}

到一个。现在,我希望扩展每个列表,而不是带有指数的因子。上面的分解将变成

{2, 3, 7, 11, 11, 13, 23, 23, 31, 41}

我写了以下函数:

b = {}; Do[Do[b = Append[b, a[[i]][[1]]], {a[[i]][[2]]}], {i, Length[a]}]

但如果你问我,它看起来很丑。肯定必须有一种更简洁的方法来实现这一目标吗?

4

5 回答 5

9

是的,例如:

Flatten[Map[Table[#[[1]], {#[[2]]}] &, a]]
于 2009-04-18T18:36:44.463 回答
7

Mathematica 6 或更高版本中的另一种方式。

在:=Flatten[ConstantArray @@@ a]

输出={2, 3, 7, 11, 11, 13, 23, 23, 31, 41}

更短:

Join @@ ConstantArray @@@ a


发布的方法的速度比较

使用这些功能(按它们发布的顺序):

zvrba = Flatten[Map[Table[#[[1]], {#[[2]]}] &, #]] &;
dreeves = Sequence @@ Table[#1, {#2}] & @@@ # &;
gdelfino = Flatten[# /. {p_, n_} :> Table[p, {n}]] &;
mrwizard = Join @@ ConstantArray @@@ # &;
sasha = Function[{p, e}, Array[p &, e, 1, Sequence]] @@@ # &;

并分别给它们分配字母 Z、D、G、M、S,这是它们效率的时序图。

首先,为了增加输入中的列表数量:

在此处输入图像描述

其次,为了增加每个列表中的指数(重复长度):

在此处输入图像描述

请注意,这些图表是对数的。越低越好。

于 2011-02-20T22:55:22.323 回答
6

这是另一种方法:

rptseq[x_, n_] := Sequence @@ Table[x, {n}]
rptseq @@@ a

可以用 lambda 函数将其浓缩为:

Sequence @@ Table[#1, {#2}] & @@@ a

zvrba 的回答也可以浓缩一点,如果你喜欢这样的事情:

Flatten[Table[#1, {#2}]& @@@ a]

(现在我看到了,我猜我的版本是 zvrba 的一个非常小的变体。)

于 2009-04-19T06:38:01.720 回答
4

您还可以使用:

a /. {p_, n_} -> Table[p, {n}] // Flatten

2017 年 10 月 18 日更新

正如 Cory Walker 所指出的,我上面的答案“在两个不同的主要因素的情况下”失败了。此更新修复了它:

a /. {p_Integer, n_Integer} -> Table[p, {n}] // Flatten

请注意,Mr Wizard 所做的基准测试是使用此更新之前的原始版本完成的。

于 2009-04-23T14:57:57.490 回答
3

也可以使用 Array 来处理答案。这是执行此操作的简短代码:

In[11]:= PrimeFactorInteger[i_Integer] := 
 Function[{p, e}, Array[p &, e, 1, Sequence]] @@@ FactorInteger[i]

In[12]:= PrimeFactorInteger[2^3 3^2 5]

Out[12]= {2, 2, 2, 3, 3, 5}
于 2011-02-21T00:36:47.180 回答