MathGroup Archive 2005

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

Search the Archive

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
>>>>Graduate Student
>>>>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
>>Graduate Student
>>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?