Альтернативная форма FactorInteger? (Mathematica) - PullRequest
6 голосов
/ 18 апреля 2009

В 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]}]

но если вы спросите меня, это выглядит странно. Там наверняка должен быть аккуратный способ добиться этого?

Ответы [ 5 ]

9 голосов
/ 18 апреля 2009

Да, например:

Flatten[Map[Table[#[[1]], {#[[2]]}] &, a]]
7 голосов
/ 21 февраля 2011

Еще один способ в Mathematica 6 или новее.

В: = 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]] @@@ # &;

и присвоение им букв Z, D, G, M, S соответственно, вот временные диаграммы их эффективности.

Во-первых, для увеличения количества списков на входе:

enter image description here

Во-вторых, для увеличения показателя (длины повторения) в каждом списке:

enter image description here

Обратите внимание, что эти диаграммы являются логарифмическими. Чем ниже, тем лучше.

6 голосов
/ 19 апреля 2009

Вот еще один способ сделать это:

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

Который может быть сжат с помощью лямбда-функции до:

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

Ответ zvrba также может быть немного сжат, если вам нравятся такие вещи:

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

(Теперь, когда я посмотрю на это, я полагаю, что моя версия очень незначительна по сравнению с zvrba.)

4 голосов
/ 23 апреля 2009

Вы также можете использовать:

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

ОБНОВЛЕНИЕ 2017/10/18 :

Мой ответ выше терпит неудачу "в случае двух различных основных факторов", как указал Кори Уокер. Это обновление исправляет это:

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

обратите внимание, что тест, выполненный Mr Wizard, был выполнен с оригинальной версией до этого обновления.

3 голосов
/ 21 февраля 2011

Можно также использовать массив для обработки ответа. Вот короткий код, делающий это:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...