Skip to main content

implementation details - How to check for Mathematica’s definition of XY?


The question is: Can I ask the Mathematica kernel directly what it takes as the definition of the built-in symbol XY? After all this has to be in the kernel. And if the documentation is not giving any hint as in the following example I’d like to know with what I’m working.


The change of the definition of Binomial[] from M7 to M8 serves as an example. The Mathworld entry for the Binomial Coeffcient mentiones the change. Mathematica’s online help does not. It just gives the general definition for complex x,y:


\binom{x}{y}=\frac{\Gamma(x+1)}{\Gamma(y+1)\Gamma(x-y+1)}.



But for sure Mathematica knows about the special case n,k\in\mathbb{N}:


\binom{n}{k}=\begin{cases}\frac{n!}{k!(n-k)!}&0\le k \le n\\0&\text{otherwise}\end{cases}


As found in Kronenburg’s arxiv paper the definition can be extended to n<0. Note that the Gamma function is infinite for negative integers arguments, so this is an extension even to the general complex definition given above. Kronenburg basically extends Pascals Triangle upwards for negative n.


This change however breaks many equations involving binomials found in the books like Concrete Mathematics and Analytic Combinatorics. For example generalized Fibonacci Numbers where the sum of the last r terms gives the next term, is given by


c_n^r=\sum_{j,k}\binom{j}{k}\binom{n-rk-1}{j-1}(-1)^k


As customary the indices j and k range over integer interval [0..\infty] and the binomial coefficients are 0 according to the second definition effectively making this series finite. This “trick” or some may say this “abuse of notation” is widely used as it allows to work with identities involving binomial coefficients quite nicely.


The change of the definition leads to c_n^r having different results in M7 and M8.




EDIT: I like to give another example, besides the bionomial coefficient one from above, why I want to have a look at the definitions.


With Mathematica you can specify Forms for the output, e.g. TeXForm or TraditionalForm. Moreover you can create your own output forms. Typically one does not want to start from the scratch, but just modify a thing or two in the existing ones. To be able to do that, I first need to look at the definition. I’m aware of the fact, that forms like TraditionalForm consist of a large collection of rules to produce an approximation to traditional mathematical notation. For this very reason I don’t want to collect all the rules myself (I’m sure I’ll never succeed). I want to build on the work that was already done. I like standing on the shoulders of giants.





Comments

Popular posts from this blog

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...

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...

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...