FactorInteger的替代形式?(数学)

ste*_*nvh 6 wolfram-mathematica

在Mathematica

a = FactorInteger[44420069694]
Run Code Online (Sandbox Code Playgroud)

受让人

{{2, 1}, {3, 1}, {7, 1}, {11, 2}, {13, 1}, {23, 2}, {31, 1}, {41, 1}}
Run Code Online (Sandbox Code Playgroud)

到了.现在,我希望每个列表都扩展,而不是指数的因素.然后上述分解将成为

{2, 3, 7, 11, 11, 13, 23, 23, 31, 41}
Run Code Online (Sandbox Code Playgroud)

我写了以下函数:

b = {}; Do[Do[b = Append[b, a[[i]][[1]]], {a[[i]][[2]]}], {i, Length[a]}]
Run Code Online (Sandbox Code Playgroud)

但如果你问我看起来很难看.肯定有一个更简洁的方法来实现这一目标吗?

zvr*_*rba 9

是的,例如:

Flatten[Map[Table[#[[1]], {#[[2]]}] &, a]]
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 7

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

IN:= Flatten[ConstantArray @@@ a]

OUT ={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]] @@@ # &;
Run Code Online (Sandbox Code Playgroud)

并分别为它们分配字母Z,D,G,M,S,这里是它们效率的时序图.

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

在此输入图像描述

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

在此输入图像描述

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


dre*_*ves 6

这是另一种方法:

rptseq[x_, n_] := Sequence @@ Table[x, {n}]
rptseq @@@ a
Run Code Online (Sandbox Code Playgroud)

哪个可以用lambda函数压缩到:

Sequence @@ Table[#1, {#2}] & @@@ a
Run Code Online (Sandbox Code Playgroud)

如果你涉及到这种事情,zvrba的答案也可以缩小一点:

Flatten[Table[#1, {#2}]& @@@ a]
Run Code Online (Sandbox Code Playgroud)

(现在我看一下,我想我的版本是zvrba的一个非常小的变种.)