       Re: Re: 2*m^z - m^z = ?

```It is, in fact, possible to write a function "mySimplify" which avoids
this particular problem and (I think) gives the same results as
Simplify, although it is inevitably a lot slower. Here is the function:

SetAttributes[mySimplify, HoldAll]
mySimplify[expr_] :=
Simplify[ReleaseHold[Simplify[Unevaluated[expr] /. x_?NumericQ :>
Hold[x]]]]

You can check that

Table[{2*m^z - m^z, mySimplify[2*m^z - m^z]}, {m, 1, 21}]

gives correct answers. It also simplifies other expressions in the
expected way:

mySimplify[Cos[x]^2 + Sin[x]^2]
1

I am sure mySimplify will not perform well in all sitiations but it
maybe a useful alternative to Simplify and perhaps a sophisticated
version of it could even be usefully implemented in Mathematica?

Andrzej Kozlowski

On 26 Apr 2008, at 16:41, Andrzej Kozlowski wrote:

>
>
>
> On 25 Apr 2008, at 18:26, Alexey Popkov wrote:
>
>> Hello,
>>
>> Table[
>> {2*m^z - m^z,
>>  FullSimplify[2*m^z - m^z]},
>> {m, 1, 21}] // TableForm
>>
>> The answer is very interesting (only odd numbers are treated well):
>>
>> 1					1
>> -2^z + 2^(1 + z)			2^z
>> 3^z					3^z
>> 2^(1 + 2*z) - 4^z			4^z
>> 5^z					5^z
>> 2^(1 + z)*3^z - 6^z		2^(1 + z)*3^z - 6^z
>> 7^z					7^z
>> 2^(1 + 3*z) - 8^z			8^z
>> 9^z					9^z
>> 2^(1 + z)*5^z - 10^z		2^(1 + z)*5^z - 10^z
>> 11^z					11^z
>> 2^(1 + 2*z)*3^z - 12^z		2^(1 + 2*z)*3^z - 12^z
>> 13^z					13^z
>> 2^(1 + z)*7^z - 14^z		2^(1 + z)*7^z - 14^z
>> 15^z					15^z
>> 2^(1 + 4*z) - 16^z		16^z
>> 17^z					17^z
>> 2^(1 + z)*9^z - 18^z		2^(1 + z)*9^z - 18^z
>> 19^z					19^z
>> 2^(1 + 2*z)*5^z - 20^z		2^(1 + 2*z)*5^z - 20^z
>> 21^z					21^z
>>
>> Can anyone explain the reason for this behavior?
>>
>
>
> Thera are many such pheonomna in computer algebra. This particular one
> I have already once explained on this forum, but as I can't find my
> post I will repeat it.
>
> The reason why this happens is that Mathematica (and all other
> Computer ALgebra Systems) performs certain "simplifications", or more
> precisely "reductions to canonical form" automatically, even before
> applying Simplify or FullSimplify, simply as part of the evaluation
> process. One such "simplification" that is done automatically is this:
>
> 2*6^z
> 2^(z + 1)*3^z
>
> In other words, Mathematica sees that 6 has 2 as a factor, it factors
> it out and combines all factor of 2 into a single power. This is a
> typical example of "reduction to canonical form". Such reductions make
> certian operations much simpler and faster but unfortunately this
> particular one does not fit in very well with another reduction that
> Mathematica also performs automatically:
>
>  2^z*3^z
>  6^z
>
> Such "reductions" cannot be undone by Simplify or FullSimplify because
> they are performed on evaluation, so even if Simplify "undid" one of
> them, the reduction would be immediately performed again.
> Unfortunately these two reductions  prevent Simplify and FullSimplify
> form seeing that
>
> 2^(z + 1)*3^z-6^z
>
> can be simplified to 6^z, because Simplify cannot re-write 2^(z +
> 1)*3^z as 2*6^z and it also cannot re-write 6^z as 2^z*3^z for reasons
> described above.
>
> In the example you gave the problem can be easily dealt with by
> wrapping Evaluate round the first argument of Table.
>
> Table[Evaluate[{2*m^z - m^z, FullSimplify[2*m^z - m^z]}], {m, 1, 21}]
>
> However the problem of simplifying
>
> p=2*6^z-6^z
>
> and similar expressions is harder to deal with. Note that Mathematica
> has no difficulty verifying that
>
> p == 6^z // Simplify
> True
>
> so it is only transforming p into 6^z by means of FullSimplify that is
> difficult. In fact, I don't think it can be done, without using some
> tricks. Here is one such trick. We divide p  by 3^z, then FullSimplify
> and finally again multiply by 3^z:
>
> FullSimplify[[p/3^z]*3^z
> 6^z
>
>
> Andrzej Kozlowski
>

```

• Prev by Date: Re: Enable multicore calculation ?
• Next by Date: Re: Re: Print[Plot] vs Print[text,Plot]?
• Previous by thread: Re: 2*m^z - m^z = ?
• Next by thread: Re: 2*m^z - m^z = ?