# How do you adapt the pattern/replace method when the expression deepens?

Posted 8 years ago
5326 Views
|
11 Replies
|
0 Total Likes
|
 The title will be clearer with the examples below:  expr1 = \!$$\*SubsuperscriptBox[\(\[Sum]$$, $$i = 1$$, $$2$$]$$\*SubsuperscriptBox[\(\[Sum]$$, $$j = 1$$, $$3$$] \*SubscriptBox[$$x$$, $$i$$] \*SubscriptBox[$$y$$, $$j$$]\)\) + xy expr2= \!$$\*SubsuperscriptBox[\(\[Sum]$$, $$i = 1$$, $$3$$]\ $$\*SubsuperscriptBox[\(\[Product]$$, $$j = 1$$, $$2$$]$$( \*SubscriptBox[\(x$$, $$i$$] - \ \*SubscriptBox[$$y$$, $$j$$])\)$$\ \$$\)\) + (x-y) I want to keep in expr1 all the terms whose subscripts are not identical. I can obtain this with Cases[expr1 /. Plus -> List, Times[Subscript[_, a_], Subscript[_, b_]] /; a != b] /. List -> Plus With expr2 same objective but I have now more than one Plus in the FullForm of this expression and I do not know the method to extend the Cases I coded before. I know the existence of TreeForm but not how it can help here.(if it does) I would like to get;  (Subscript[x, 1] - Subscript[y, 2]) + (Subscript[x, 2] - Subscript[y, 1]) + (Subscript[x, 3] - Subscript[y, 1]) (Subscript[x, 3] - Subscript[y, 2]) Can the the pattern/replace here be used without coding Cases?
11 Replies
Sort By:
Posted 8 years ago
 There is some misunderstanding in the answers I received.In the expression $x_{j}$ the subscript is $j$ and not $x_{j}$ . Since in MMA you have to write Subscript[x,j] it makes a confusion about what a subscript means.When I wrote" I want to keep all the terms whose subscripts are not identical. in 'expr1' and 'expr2' " it means: In expr1 get rid of terms like $x_{1}y_{1}$, keep terms like $x_{1}y_{2}$ and also get rid of $xy$, which is not a subscripted termIn expr2 get rid of terms like $x_{1}-y_{1}$, keep terms like $x_{1}-y_{2}$ and also get rid of $x-y$, which is not a subscripted termIn my initial l answer I found a clumsy way to do it on one expression but no way to expand on it with a related expression with more levels.Later on I will answer individually to the 3 answers I received.
Posted 8 years ago
 I think the following might be a simpler method: expr1 = xy + Subscript[x, 1] Subscript[y, 1] + Subscript[x, 2] Subscript[y, 1] + Subscript[x, 1] Subscript[y, 2] + Subscript[x, 2] Subscript[y, 2] + Subscript[x, 1] Subscript[y, 3] + Subscript[x, 2] Subscript[y, 3]; expr2 = x - y + (Subscript[x, 1] - Subscript[y, 1]) (Subscript[x, 1] - Subscript[y, 2]) + (Subscript[x, 2] - Subscript[y, 1]) (Subscript[ x, 2] - Subscript[y, 2]) + (Subscript[x, 3] - Subscript[y, 1]) (Subscript[x, 3] - Subscript[y, 2]) rule = k_. Subscript[_, a_] Subscript[_, b_] /; a == b :> Sequence[]; Then for expr1: expr1 /. rule xy + Subscript[x, 2] Subscript[y, 1] + Subscript[x, 1] Subscript[y, 2] + Subscript[x, 1] Subscript[y, 3] + Subscript[x, 2] Subscript[y, 3] And for expr2 (I'm not sure how you want to handle the Powers): Expand[expr2] /. rule x - y + \!$$\*SubsuperscriptBox[\(x$$, $$1$$, $$2$$]\) + \!$$\*SubsuperscriptBox[\(x$$, $$2$$, $$2$$]\) + \!$$\*SubsuperscriptBox[\(x$$, $$3$$, $$2$$]\) - Subscript[x, 2] Subscript[y, 1] - Subscript[x, 3] Subscript[y, 1] - Subscript[x, 1] Subscript[y, 2] - Subscript[x, 3] Subscript[y, 2] + 3 Subscript[y, 1] Subscript[y, 2] 
Posted 8 years ago
 I am confused as to what we are trying to eliminate. Is it Xi*Yj with i=j and (Xi-Yj) with i=j ? Or just the former after expansion?
Posted 8 years ago
 Hello DavidYour answer is OK for expr1 but I am at a loss to understand your use of dot after k_. Could you please comment it a little?For expr2 your answer is not what I expect because you expand the expression before applying the rule . After the rule is applied I am looking for $(x_{1}-y_{2}) + (x_{2}-y_{1}) + (x_{3}-y_{1})(x_{3}-y_{2})$As MMA in input form will simplify this by removing some brackets a HoldForm may perhaps be needed..Regards
Posted 8 years ago
 You should also think about "-". In case of polynomials this should work: Cases[ expr2 // Expand, (sign_.) (l : Subscript[_, a_]) ( k : Subscript[_, b_]) /; a != b :> sign l k ] // Total > -Subscript[x, 2] Subscript[y, 1]-Subscript[x, 3] Subscript[y, 1]-Subscript[x, 1] Subscript[y, 2]-Subscript[x, 3] Subscript[y, 2]+3 Subscript[y, 1] Subscript[y, 2]
Anonymous User
Anonymous User
Posted 8 years ago
 Yes your clever answer does the job for both of my expressions but for expr2 had to be expanded which I would rather not have, I'm not an expert and I do not understand all of it.Could you please comment on your use of commas () around sign. ,k:...l;.. which is most enigmatic to me since there isn't a single comma in my expanded (FullForm or not) expressions, and what is the use of dot after sign ? Thanks
Posted 8 years ago
 Yes your clever answer does the job forexpr1 but not for expr2 It gives me  Subscript[x, 2] Subscript[y, 1] - Subscript[x, 3] Subscript[y, 1] - Subscript[x, 1] Subscript[y, 2] - Subscript[x, 3] Subscript[y, 2] + 3 Subscript[y, 1] Subscript[y, 2] Instead of (after elimination)  (Subscript[x, 1] - Subscript [y, 2]) + (Subscript[x, 2] - Subscript[y, 1]) + (Subscript[x, 3] - Subscript[y, 1]) (Subscript[x, 3] - Subscript[y, 2]) // Expand I'm not an expert and I do not understand all of your answer:.Could you please comment on your use of commas () around sign. ,k:...l;.. which is most enigmatic to me since there isn't a single comma in my expanded (FullForm or not) expressions, and what is the use of dot after sign ? Thanks
Posted 8 years ago
 Yes I can accomplish it with your answer..However I would like to have answer based on pattern/replace which is much more adaptive to a change of the original expression.
Posted 8 years ago
 Hi Wojtek,I think it is possible to do what you want by crafting a set of rules for the purpose. For example, the rules below handle the cases from both expr1 and expr2, although in a more general case. It may be needed to add more rules to the set, depending on how diverse your expressions. And note that the rules can be applied at all levels of the expression if needed.The application can be seen in the attached notebook. Although please note that it obtains a result for expr2 which is different from your desired result above. (I think that the desired result you show was perhaps a typo, since it contains components not present in the expression before replacement.) rule = { (* terms like x1y1 or x1+y1 *) _[Subscript[_, x_], Subscript[_, x_]] -> 0, (* terms like (x1-y1) *) _[Subscript[_, x_], _[_, Subscript[_, x_]]] -> 0 }; Kind regards, David Attachments:
Posted 8 years ago
 Hi DavidI replied to your latest reply in the attached notebook as it is probably better to look at that. My updates are in green Best regards Attachments:
Posted 8 years ago
 Hi Wojtek,It's not a direct answer, but one way to accomplish this is to avoid generating the terms in the first place by using the Kronecker delta: In[1]:= expr1 = \!$$\*SubsuperscriptBox[\(\[Sum]$$, $$i = 1$$, $$2$$]$$\*SubsuperscriptBox[\(\[Sum]$$, $$j = 1$$, $$3$$]$$(1 - KroneckerDelta[i, j])$$ \*SubscriptBox[$$x$$, $$i$$] \*SubscriptBox[$$y$$, $$j$$]\)\) + xy Out[1]= xy + Subscript[x, 2] Subscript[y, 1] + Subscript[x, 1] Subscript[y, 2] + Subscript[x, 1] Subscript[y, 3] + Subscript[x, 2] Subscript[y, 3] In[2]:= expr2 = \!$$\*SubsuperscriptBox[\(\[Sum]$$, $$i = 1$$, $$3$$]\ $$\*SubsuperscriptBox[\(\[Product]$$, $$j = 1$$, $$2$$]$$(1 - KroneckerDelta[i, j])$$ $$( \*SubscriptBox[\(x$$, $$i$$] - \ \*SubscriptBox[$$y$$, $$j$$])\)\)\) + (x - y) Out[2]= x - y + (Subscript[x, 3] - Subscript[y, 1]) (Subscript[x, 3] - Subscript[y, 2]) Kind regards, David