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

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...