Re: Re: Re: Simplifying algebraic expressions
- To: mathgroup at smc.vnet.net
- Subject: [mg67007] Re: [mg66959] Re: [mg66881] Re: [mg66839] Simplifying algebraic expressions
- From: Adam Strzebonski <adams at wolfram.com>
- Date: Tue, 6 Jun 2006 06:29:26 -0400 (EDT)
- References: <200606011054.GAA20566@smc.vnet.net> <200606020809.EAA18083@smc.vnet.net> <200606050748.DAA16346@smc.vnet.net> <4484EC71.7060108@wolfram.com> <BCCD9DF4-BB59-4AFD-B8C5-4A76BFAB82C8@mimuw.edu.pl> <56C0F5A8-F0F6-4A94-8DC0-0C5668FD7995@mimuw.edu.pl>
- Reply-to: adams at wolfram.com
- Sender: owner-wri-mathgroup at wolfram.com
Andrzej Kozlowski wrote: > I suddenly remembered that I have already met a very closely related > problem once before and even suggested that the transformation function > f be added to Simplify. Moreover, Adams Strzebonski replied promising > that he would do so: > > http://forums.wolfram.com/mathgroup/archive/2005/Jul/msg00717.html Yes, this is exactly when the transformation has been added. Here are examples from a code change dated 2005/07/28 15:38:49. In[1]:= Refine[(-1)^(5 m+8 k m+r), Element[k|m, Integers]] m + r Out[1]= (-1) In[2]:= Refine[Cos[3*m*Pi], Assumptions -> Element[m, Integers]] m Out[2]= (-1) These will work since today (the transformation reduced integer coefficients, but didn't try to use Mod assumptions to reduce symbolic subexpressions). In[1]:= Refine[(-1)^(u + v), Element[u|v, Integers] && Mod[u, 2] == 0] v Out[1]= (-1) In[2]:= Refine[(-1)^(5 m+k m+r), Element[k|m, Integers] && Mod[k, 2]==1] r Out[2]= (-1) Best Regards, Adam Strzebonski Wolfram Research > > So it may have had something to do with the change in the development > version. > > It also shows that my memory is no longer what it used to be :- ( > (though I did feel there was something familiar about this problem). > > Andrzej Kozlowski > > > > On 6 Jun 2006, at 13:00, Andrzej Kozlowski wrote: > >> >> On 6 Jun 2006, at 11:46, Carl K. Woll wrote: >> >>> Andrzej Kozlowski wrote: >>> >>>> Here is, I think, an optimized version of the "simplification" I >>>> sent earlier: >>>> rule1 = {2x -> u, 3y -> v}; rule2 = Map[Reverse, rule1]; >>>> Simplify[TrigFactor[Simplify[ExpToTrig[ >>>> Simplify[ExpToTrig[(-1)^(2*x + 3*y) /. rule1], >>>> Mod[u, 2] == 0] /. rule2], y â?? Integers]], >>>> y â?? Integers] >>>> (-1)^y >>>> "Optimized" means that I can't see any obvious way to make this >>>> simpler. >>>> Unlike other answers to the original post, this works in >>>> Mathematica 5.1 and 5.2, and involves only reversible operations. >>>> In other words, it constitutes a proof. On the other hand, >>>> obviously, it would be ridiculous to use this approach in >>>> practice: there must be a simple transformation rule (or rules) >>>> missing from Simplify, which apparently has already been added in >>>> the development version. >>> >>> >>> Andrzej, >>> >>> It seems to me that your simplification approach isn't as general as >>> the replacement method I advocated (a variant of which is given >>> below), as rule1 and rule2 are specific to the input. Also, my >>> replacement method is based on the fact that: >>> >>> In[30]:= Simplify[((-1)^a)^b == (-1)^(a b), Element[{a, b}, Integers]] >>> >>> Out[30]= True >>> >>> So, I think my approach is generally valid. >> >> >> You are right, I apologise. I did not look carefully at your code. >> But now that I see some challenge ;-) I also see that I can >> completley remove rule1 and rule 2 form my code and make it equally >> general: >> >> >> Simplify[TrigFactor[Simplify[ExpToTrig[ >> Simplify[ExpToTrig[(-1)^PolynomialMod[2*x + 3*y, >> 2]], Mod[u, 2] == 0]], y â?? Integers]], >> y â?? Integers] >> >> >> (-1)^y >> >> What's more, I can actually produce an even shorter code that will >> produce the required simplification: >> >> >> f[(-1)^(n_)] := (-1)^PolynomialMod[n, 2] >> >> >> Simplify[f[(-1)^(2*x + 3*y)], TransformationFunctions -> >> {Automatic, f}] >> >> >> (-1)^y >> >> >> Of course this ought to be modified so as to be performed only under >> the assumption that x and y are integers (not very hard to do). I >> suspect that this is close to what has been done in the development >> version. >> >> Andrzej Kozlowski >> >> >> >> >>> >>>> Note also the following problem, which I suspect is related: >>>> Simplify[(-1)^(u + v), (u | v) â?? Integers && >>>> Mod[u, 2] == 0 && Mod[v, 2] == 1] >>>> -1 >>>> Simplify[(-1)^(u + v), (u | v) â?? Integers && >>>> Mod[u, 2] == 0 && Mod[v, 2] == 0] >>>> 1 >>>> But >>>> Simplify[(-1)^(u + v), (u | v) â?? Integers && >>>> Mod[u, 2] == 0] >>>> (-1)^(u + v) >>>> I am sure this also gives (-1)^v in the development version. >>> >>> >>> To obtain the desired simplification in 5.2, we can modify my >>> previous approach as follows: >>> >>> power[e_, a_Plus] := Times @@ (Simplify /@ (power[e, #1]&) /@ List >>> @@ a) >>> power[e_, a_Integer b_?(Refine[Element[#,Integers]]&)] := (e^a)^b >>> power[e_, a_] := e^a >>> >>> simp[expr_, assum_] := Block[{$Assumptions = assum}, >>> Simplify[expr /. Power -> power] >>> ] >>> >>> In the above I rely on the following two equivalences, verified by >>> Mathematica: >>> >>> In[50]:= >>> Simplify[e^a e^b == e^(a+b)] >>> >>> Out[50]= >>> True >>> >>> In[51]:= >>> Simplify[(e^a)^b == e^(a b), Element[{a,b},Integers]] >>> >>> Out[51]= >>> True >>> >>> The tricky part is that Mathematica automatically converts e^a e^b >>> --> e^(a+b), and as you point out above Simplify[(-1)^(u+v),...] >>> doesn't work. However, Simplify[(-1)^u, ...] does work, which is why >>> the Simplify appears in the definition of power[e_,a_Plus] before >>> Times is applied. >>> >>> Here are some examples: >>> >>> In[56]:= >>> simp[(-1)^(u+v),Mod[u,2]==0] >>> >>> Out[56]= >>> v >>> (-1) >>> >>> In[57]:= >>> simp[(-2)^(u+v),Mod[u,2]==0] >>> >>> Out[57]= >>> v u + v >>> (-1) 2 >>> >>> In[58]:= >>> simp[(-1)^(2x+3y),Element[{x,y},Integers]] >>> >>> Out[58]= >>> y >>> (-1) >>> >>> In[59]:= >>> simp[(-2)^(2x+3y),Element[{x,y},Integers]] >>> >>> Out[59]= >>> y 2 x + 3 y >>> (-1) 2 >>> >>> Carl Woll >>> Wolfram Research >>> >>>> Andrzej Kozlowski >>>> On 2 Jun 2006, at 17:09, Andrzej Kozlowski wrote: >>>> >>>>> On 1 Jun 2006, at 19:54, Amitabha Roy wrote: >>>>> >>>>> >>>>>> Hello: >>>>>> >>>>>> I would like Mathematica to be able to take an expression, say, >>>>>> >>>>>> (-1)^{2 x + 3 y} and be able to simplify to (-1)^y. >>>>>> >>>>>> Is there a way one can do this ? >>>>>> >>>>>> Thanks >>>>>> >>>>> >>>>> Note that you are using {} instead of (). Different kind of brackets >>>>> have completely different meaning in Mathematica. >>>>> I have found it amazingly hard to force Mathematica to perform this >>>>> simplification. The best I could do is this. We need two rules. rule1 >>>>> will replace 2x by u and 3y by v. rule 2 does the opposite: it >>>>> replaces u by 2x and v by 2y. >>>>> >>>>> rule1 = {2x -> u, 3y -> v};rule2 = Map[Reverse, rule1]; >>>>> >>>>> Now: >>>>> >>>>> >>>>> Simplify[TrigFactor[ >>>>> FullSimplify[ExpToTrig[ >>>>> FullSimplify[ >>>>> ComplexExpand[ >>>>> (-1)^(2*x + 3*y) /. >>>>> rule1], Mod[u, 2] == >>>>> 0] /. rule2], >>>>> y â?? Integers]], >>>>> y â?? Integers] >>>>> >>>>> >>>>> (-1)^y >>>>> >>>>> Uff... Surely, this ought to be easier... >>>>> >>>>> Andrzej Kozlowski >>>>> Tokyo, Japan >>>>> >>> >> > >
- References:
- Simplifying algebraic expressions
- From: Amitabha Roy <aroy@cs.bc.edu>
- Re: Simplifying algebraic expressions
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Re: Simplifying algebraic expressions
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Simplifying algebraic expressions