Skip to main content

syntax - HoldForm[Operator ##] on some list


Recently in response to this question Mr.Wizard suggested an unusual way to summing numbers. This doesn't seem to be documented.


HoldForm[+##] & @@ RandomInteger[100, 2]

This works fine for Plus and in case of - it generates -ive of product of list elements. I could not find out how to write a close variation of this for Divide or Subtract or other operations.


Can someone please shed some light on this ?



Answer




From prior comments I know that you are interested in forms such as:


a - b - c - d
a / b / c / d

There is no simple short form for these as there is for Plus. To understand this you must understand how Mathematica parses and displays these expressions. Let's look at the first one:


Subtract


HoldForm[a - b - c - d]


a - b - c - d


No surprises. But now FullForm:


HoldForm @ FullForm[a - b - c - d]


Plus[a, Times[-1, b], Times[-1, c], Times[-1, d]]

So our simple expression is not quite so simple in the internal format. Each negative term is actually represented as Times[-1, x]. But what about Box form? This is what is sent to the Front End for display:


HoldForm[a - b - c - d] // ToBoxes



TagBox[RowBox[{"a", "-", "b", "-", "c", "-", "d"}], HoldForm]

We will need a helper utility(1) to see what the Front End sends to the Kernel:


parseString[s_String, prep : (True | False) : True] := 
FrontEndExecute[UndocumentedTestFEParserPacket[s, prep]]

Now:


"a-b-c-d" // parseString



{BoxData[RowBox[{"a", "-", "b", "-", "c", "-", "d"}]], StandardForm}

Divide


The same analysis of the division/fraction case:


HoldForm[a/b/c/d]


a/((b c) d)


This time you may get a bit of a surprise. Let's look at the FullForm:


HoldForm @ FullForm[a/b/c/d]


Times[Times[Times[a, Power[b, -1]], Power[c, -1]], Power[d, -1]]

Once again we see that there is no "division" operator, but rather denominators are represented as Power[x, -1]. Why though is this displayed as a/((b c) d)? Let's look at the box form sent to the Front End:


HoldForm[a/b/c/d] // ToBoxes



TagBox[FractionBox["a", 
RowBox[{RowBox[{"(", RowBox[{"b", " ", "c"}], ")"}], " ", "d"}]], HoldForm]

So our Times/Power expression is converted to this different format during Box conversion even though the internal format contains no "fraction" head. This Box formatting is not prevented by the Hold function. See Returning an unevaluated expression with values substituted in for another example of this.


What about the input format however? Clearly a/b/c/d can be displayed by the Front End as you can simply type that in. What is its Box form?


"a/b/c/d" // parseString


{BoxData[RowBox[{RowBox[{RowBox[{"a", "/", "b"}], "/", "c"}], "/", "d"}]], StandardForm}


Input Syntax


By now you are probably understanding what I meant when I said "it's complicated." You may also see that there is a difference between inputting the equivalent expression, which may be displayed differently, e.g. a/((b c) d), and having Mathematica display a certain form such as a/b/c/d. We can explore both.


Taking things in reverse order, we can use Row to merely display an expression:


Row[{a, b, c, d}, "-"]
Row[{a, b, c, d}, "/"]


a-b-c-d

a/b/c/d


This is not meaningful mathematical input. It is only a display form. Also it is not "intelligent" about mathematical formatting such as negatives:


Row[{a, -b, c, d}, "-"]  (* note -b *)


a--b-c-d

This was the motivation for using e.g. HoldForm[+##] rather than Row in the first place: we wanted the automatic formatting, just not the automatic evaluation.


If you desire a shorthand for entering a valid mathematical expression you could negate after in the case of subtraction:


-+## &[a, -b, c, d]



-a + b - c - d

You'll note this also negates the first term. It isn't clear to me if you want this or not; you could use # - +##2 & if you do not.


For formatting purposes this won't work:


HoldForm[-+##] &[1, -2, 3, 4]


-(1 - 2 + 3 + 4)


You would instead need to negate the terms first:


HoldForm[+##] & @@ -{##} &[1, -2, 3, 4]


-1 + 2 - 3 - 4

Division will not display as a/b/c/d anyway, as already demonstrated, so you are probably better off using Row for that display format. (Or building Box form directly, though I'd rather not make this answer any longer to show how.) For inputting a valid mathematical expression you could use:


#/(1 ##2) &[a, b, c, d]



a/(b c d)

Comments

Popular posts from this blog

mathematical optimization - Minimizing using indices, error: Part::pkspec1: The expression cannot be used as a part specification

I want to use Minimize where the variables to minimize are indices pointing into an array. Here a MWE that hopefully shows what my problem is. vars = u@# & /@ Range[3]; cons = Flatten@ { Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; Minimize[{Total@((vec1[[#]] - vec2[[u[#]]])^2 & /@ Range[1, 3]), cons}, vars, Integers] The error I get: Part::pkspec1: The expression u[1] cannot be used as a part specification. >> Answer Ok, it seems that one can get around Mathematica trying to evaluate vec2[[u[1]]] too early by using the function Indexed[vec2,u[1]] . The working MWE would then look like the following: vars = u@# & /@ Range[3]; cons = Flatten@{ Table[(u[j] != #) & /@ vars[[j + 1 ;; -1]], {j, 1, 3 - 1}], 1 vec1 = {1, 2, 3}; vec2 = {1, 2, 3}; NMinimize[ {Total@((vec1[[#]] - Indexed[vec2, u[#]])^2 & /@ R...

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

What is and isn't a valid variable specification for Manipulate?

I have an expression whose terms have arguments (representing subscripts), like this: myExpr = A[0] + V[1,T] I would like to put it inside a Manipulate to see its value as I move around the parameters. (The goal is eventually to plot it wrt one of the variables inside.) However, Mathematica complains when I set V[1,T] as a manipulated variable: Manipulate[Evaluate[myExpr], {A[0], 0, 1}, {V[1, T], 0, 1}] (*Manipulate::vsform: Manipulate argument {V[1,T],0,1} does not have the correct form for a variable specification. >> *) As a workaround, if I get rid of the symbol T inside the argument, it works fine: Manipulate[ Evaluate[myExpr /. T -> 15], {A[0], 0, 1}, {V[1, 15], 0, 1}] Why this behavior? Can anyone point me to the documentation that says what counts as a valid variable? And is there a way to get Manpiulate to accept an expression with a symbolic argument as a variable? Investigations I've done so far: I tried using variableQ from this answer , but it says V[1...