MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • Prev by Date: Re: Re: Re: Simplifying algebraic expressions
  • Next by Date: Re: How can I use multiple filename ?
  • Previous by thread: Re: Re: Re: Simplifying algebraic expressions
  • Next by thread: Re: Simplifying algebraic expressions