To make it possible to enter the expression the way you want, and also display it that way, I'll create an InputAlias
for it similar to the already existing shortcut escprodt
esc. Then I also define the format for TraditionalForm
output to look the way you enter it.
The first step is to define your choice of modified product function, called restrictedProduct
here. I decided to go with the approach based on Piecewise
in which factors for which the added condition is violated are replaced by 1
. Before implementing the actual product, I also prevent it from evaluating its arguments and to work with local variables as Product
does:
SetAttributes[restrictedProduct, HoldAll]
SyntaxInformation[
restrictedProduct] = {"LocalVariables" -> {"Product", {2, 2}},
"ArgumentsPattern" -> {_, _, _}};
restrictedProduct[f_, range_, condition_] :=
Product[Piecewise[{{f, condition}, {1, True}}], range]
restrictedProduct /:
MakeBoxes[restrictedProduct[f_, {i_, i0_, i1_}, condition_],
TraditionalForm] :=
TemplateBox[{ToBoxes[i], ToBoxes[i0], RowBox[{ToBoxes[condition]}],
ToBoxes[i1], ToBoxes[f]},
"conditionalProduct",
DisplayFunction :> (RowBox[{
UnderoverscriptBox["\[Product]",
GridBox[{{
RowBox[{#, "=", #2}]}, {#3}}], #4], #5}] & ),
InterpretationFunction :> (RowBox[{"restrictedProduct", "[",
RowBox[{#5, ",", "{", #, ",", #2, ",", #4, "}", ",", #3}],
"]"}] & )]
The last definition is the output format in TraditionalForm
- it contains a TemplateBox
which allows it to become an editable expression that can be executed after you copy such output into a new input cell. The DisplayFunction
and InterpretationFunction
options are crucial to associate the two-dimensional box form with the input arguments of the function restrictedProduct
.
Now I use the same association in defining the input alias that can be set for the current notebook as follows:
aliases = Options[EvaluationNotebook[], InputAliases];
newAliases =
Join[InputAliases /.
aliases, {"condProd" ->
TemplateBox[{"\[SelectionPlaceholder]", "\[Placeholder]",
"\[Placeholder]", "\[Placeholder]", "\[Placeholder]"},
"conditionalProduct", DisplayFunction :>
(RowBox[{
UnderoverscriptBox["\[Product]",
GridBox[{{RowBox[{#1, "=", #2}]}, {#3}}], #4], #5}] &),
InterpretationFunction :> (RowBox[{"restrictedProduct", "[",
RowBox[{#5, ",", "{", #1, ",", #2, ",", #4, "}", ",", #3}],
"]"}] &)
]}];
SetOptions[EvaluationNotebook[], InputAliases -> newAliases];
Now we can start using this. In a new input cell, type
esccondProd
esc
In the template that appears, enter the desired limits, and note that the condition is inserted in the bottom box.
64
Instead of evaluating the expression, you can now also display it in held form as follows:
$$\prod_{\stackrel{i = 1}{i\ne 3}}^{10} i$$
You can then, if needed, copy and paste this output to get at first the unevaluated expression in StandardForm
, which then can be evaluated too:
restrictedProduct[i, {i, 1, 10}, i != 3]
1209600