6

Mathematica で

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

これは、ラムダ関数で次のように要約できます。

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 が指摘したように、「2 つの異なる素因数の場合」に失敗します。このアップデートはそれを修正します:

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 に答える