Re: Re: Re: how to find n in expression x^n using a pattern?

```Andrzej Kozlowski wrote:
> On 5 Jul 2005, at 00:34, Pratik Desai wrote:
>
>
>>Andrzej Kozlowski wrote:
>>
>>
>>
>>>On 4 Jul 2005, at 15:24, Pratik Desai wrote:
>>>
>>>
>>>
>>>>steve wrote:
>>>>
>>>>
>>>>
>>>>
>>>>>I am learning patterns in Mathemtica, and I thought this will
>>>>>be  easy.
>>>>>
>>>>>suppose you are given a factored expression, such as x^n(x^2+2)
>>>>>(x^3 +4)
>>>>>where 'n' above can be any number, including zero (i.e. there is no
>>>>>(x) as a separate factor). I need to find 'n', which can be
>>>>>0,1,2,3,..etc..
>>>>>
>>>>>i.e I need to find the power of the factor x by itself if it
>>>>>exist in
>>>>>the expression. not (x^n+anything), just (x^n) byitself.
>>>>>
>>>>>For example
>>>>>
>>>>>p= x (x^2+2)  ---> here n=1
>>>>>
>>>>>I tried this
>>>>>
>>>>>p /. x^n_(any_) -> n
>>>>>
>>>>>This did not work since x^1 does not match pattern x^n_.  I
>>>>>would  have
>>>>>worked if I had x^2 (x^3+2) for example.
>>>>>
>>>>>I know that I need to use something like  x^_:1  to make it
>>>>>match x,
>>>>>which
>>>>>is really x^1, but I do not know how to use it in a replacement
>>>>>rule,
>>>>>becuase
>>>>>when I write
>>>>>
>>>>>p /. (x^n_:1)(any_) -> n
>>>>>
>>>>>it is an error.
>>>>>
>>>>>If I write
>>>>>
>>>>>p /. (x^_:1)(any_) -> _
>>>>>
>>>>>I do not get back anything.
>>>>>
>>>>>Next I tried the Cases command, and again had no luck.
>>>>>
>>>>>The main problem is that Mathematica makes a difference between
>>>>>x, x^1, and x^2, etc... when it comes to matching with pattern x^n_
>>>>>
>>>>>any idea how to do this?
>>>>>thanks,
>>>>>steve
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>Why not do something like this , it sounds quite simplistic but
>>>>it  works :)
>>>>Clear[p]
>>>>p[x_] = x ^5(x^3 + 2x^2 + 3x - 13)
>>>>sol2 = Solve[p[x] == 0, x]
>>>>y = x /. sol2
>>>>n = Count[y, 0]
>>>>
>>>>Best regards
>>>>
>>>>--
>>>>Pratik Desai
>>>>UMBC
>>>>Department of Mechanical Engineering
>>>>Phone: 410 455 8134
>>>>
>>>>
>>>>
>>>>
>>>
>>>In fact after seeing this posting I understood what the original
>>>poster wanted (probably). (He wrote that he was learning patterns
>>>so  I thought this was meant just to be an exercise in pattern
>>>matching).  However, using algebraic method, like the one above,
>>>could be  unnecessarily complicated if the second factor of the
>>>equation is a  high degree polynomial or something even more
>>>complicated. It is in  fact easier to use patterns. Compare:
>>>
>>>p[x_] = x^5*(x^32 + 2x^21 + 3x^17 - 13);
>>>
>>>
>>>Timing[Cases[p[x], x^(n_.) -> n, {1}]]
>>>
>>>
>>>{0.0005019999999973379*Second, {5}}
>>>
>>>(as I wrote in my first response, giving the correct level
>>>specification is important).
>>>
>>>
>>>Timing[Count[x /. Solve[p[x] == 0, x], 0]]
>>>
>>>
>>>{0.08699899999999872*Second, 5}
>>>
>>>
>>>
>>>Andrzej Kozlowski
>>>
>>>Chiba, Japan
>>>
>>>
>>>
>>
>>Hi Andrzej
>>
>>I have had occasion to use patterns before and by far I have found
>>it the most difficult feature of mathematica  to work with and the
>>help on it  leaves a lot to be desired. I agree the poster seems to
>>be trying to learn patterns, I was just trying to point out, as you
>>have on your earlier reply,  that there are easier ways to do the
>>same job (i.e finding the highest common exponent in x). Again not
>>to put a finer point on it, it seems to me that the use of
>>patterning as you have shown seems only to work when the expression
>>is in its factored form (which I admit was the posters original
>>query)  whereas using Solve and count works irrespective of the
>>form of the expression. Or am I wrong?
>
>
> You are of course right. Mathematica's pattern matching is (with some
> rudimentary exceptions) only  syntactic, which means that expressions
> are matched "literally" and not according to their "mathematical
> meaning" (that would be "semantic" pattern matching). A factored
> expression and an unfactored oen are quite different as far as
> pattern matching is concerned. Algebraic methods can do much more
> than pattern matching but they tend to be very slow and suitable
> mostly for "small" problems.  So both approaches have their strong
> and weak points and one or the other should be preferred depending on
> what one is trying to do. Obviously there is no panacea for all types
> of situations, which is why posters should try to state exactly what
> they are really trying to do.
>
> Andrzej Kozlowski
>
>
>
>
>
>
>>p[x_] = x^5*(x^32 + 2x^21 + 3x^17 - 13x^5);
>>Timing[Cases[p[x], x^(n_.) -> n, {1}]]
>>
>>>>{0. Second, {5}}
>>
>>Timing[Count[x /. Solve[p[x] == 0, x], 0]]
>>
>>>>{0.01 Second, 10}
>>
>>Now if you use simplify
>>p[x_] = x^5*(x^32 + 2x^21 + 3x^17 - 13x^5) // Simplify;
>>Timing[Cases[p[x], x^(n_.) -> n, {1}]]
>>{0. Second, {10}}
>>
>>Best regards
>>Pratik
>>
>>--
>>Pratik Desai
>>UMBC
>>Department of Mechanical Engineering
>>Phone: 410 455 8134

A method that is reasonably fast but (for most purposes) more robust
than syntactic approaches is to use Exponent with a third argument.

In[3]:= Exponent[x^5*(x^32 + 2x^21 + 3x^17 - 13x^5), x, Min]
Out[3]= 10

Since the topic was broached, there was some Mathematica work on
semantic pattern matching a few years back. You might want to look at

Jason Harris. Semantica: semantic pattern matching in Mathematica. The
Mathematica Journal 7(3):329-360.

Further information about the article may be found at
http://library.wolfram.com/infocenter/Articles/3902/

Daniel Lichtblau
Wolfram Research

```

• Prev by Date: Re: Function to handle array with variable _number_ of dimensions?
• Next by Date: Re: Re: Re: Re: Re: Can't assign value to symbols
• Previous by thread: Re: Re: how to find n in expression x^n using a pattern?
• Next by thread: Re: how to find n in expression x^n using a pattern?