# Transforming a mutiplication into an addition

How can I force Mathematica to transform

5a


into

a+a+a+a+a

• Mathematica will automatically simplify a+a+a to 3 a. Unless one uses Hold or use String to write the result which makes it not useful. What is the point of doing this? What are you trying to do with the result you are after? Apr 27, 2014 at 10:41
• Thank you. You assumed correctly that there is no real senseful use; this question just emerged as I was playing around a little bit with the commands of mathematica yesterday :)
– Gab
Apr 27, 2014 at 10:49

If it is just for fun:

Thanks for the bug report by Kuba, made it support negative sums

expr = +5 a;
r = "";
expr /. Times[n_, m_] :>
If[Abs[m] == 1, expr, Last@Table[r = r <> If[m < 0, "-", {}] <> ToString@n
<> If[i < Abs@m, If[m > 0, "+", {}], {}], {i, Abs@m}]]

(*a+a+a+a+a*)

expr = -a;
(* -a *)

expr = -5 a;
(* -a-a-a-a-a *)


And I am sure there are many other ways to do this and in shorter way. But the result is a string.

• thank you, I have to admit, this is a nice workaround :D
– Gab
Apr 27, 2014 at 11:02
• Shorter: 5 a /. n_ x_ :> x~ConstantArray~n~Row~"+" Apr 27, 2014 at 11:38
• @SimonWoods I am an ex-Fortran programmer :) (nice solution btw!) Apr 27, 2014 at 11:42

I propose using HoldForm rather than strings etc.

{a, -a, 3 a, -3 a} /.
n_Integer s_ /; Abs[n] > 1 :> Plus @@@ HoldForm @@ {Sign[n] Table[s, {Abs @ n}]}


Output:

Not only does this format exactly like manual entry of this expression, you can release it:

% // ReleaseHold

{a, -a, 3 a, -3 a}


If you want it to be automatically released when you copy and paste or edit the output (converting it to input), use Defer instead of HoldForm.

• My answer has uses HoldForm, too, and can be released. Apr 27, 2014 at 20:46
• @m_goldberg Sorry, I lost that in all the Riffling with Strings. :-/ However, my method will work with other expressions, e.g. 3 a^2, because I am not converting back and forth between strings. Doesn't the string conversion somewhat miss the point of HoldForm? (I genuinely don't mean to be a jerk. It would never occur to me to write it the way you did, which is why I stopped reading when I saw the first Riffle line.) Apr 27, 2014 at 20:55
• I was, as I said, trying to do it the way an ex-Fortran programmer would do it. And, of course, there is no doubt at all the your answer is much better. But not as funny. Apr 27, 2014 at 22:22
• @m_goldberg Thanks for having a sense of humor. Also, this wouldn't be the first time if my code haiku is unintelligible to the OP and he prefers the procedural approach. :-) Apr 27, 2014 at 22:55

Here's another take on this question; perhaps even a better example of the ex-Fortran programmer style than Nasser's answer.

timesExpand[x_Symbol] := x
timesExpand[expr : -1 x_Symbol] := expr
timesExpand[k_Integer x_Symbol] :=
Module[{name, chrs},
name = SymbolName[x];
If[k > 0,
chrs = Riffle[ConstantArray[name, k], ConstantArray["+", k - 1]],
chrs = Riffle[ConstantArray["-", -k], ConstantArray[name, -k]]];
ToExpression[StringJoin[chrs], StandardForm, HoldForm]]

timesExpand[5 a]
timesExpand[-5 a]
timesExpand[a]
timesExpand[-a]


• nice. But for -5 a case, you need an extra - for that first a Apr 27, 2014 at 13:42
• You're right. I'll fix it. Apr 27, 2014 at 13:43
• @Nasser. Fixed. Apr 27, 2014 at 13:55
• For what's it's worth this can be shortened with: chrs = Riffle[ConstantArray[name, Abs@k], ##] & @@ If[k > 0, {"+"}, {"-", {1, -2, 2}}] Apr 28, 2014 at 3:45
• @Mr.Wizard. It'a a wonderful example of your wizardry, but it would spoil my joke to edit my answer to make use of it. It's too much in the Mathematica-wizard style. All hints of the ex-Fortran programmer authorship would be gone. But many thanks for posting it, it increased my understanding of Riffle considerably. Apr 28, 2014 at 4:16