MathGroup Archive 2006

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

Search the Archive

Re: Testing for squares

  • To: mathgroup at smc.vnet.net
  • Subject: [mg66245] Re: Testing for squares
  • From: Bill Rowe <readnewsciv at earthlink.net>
  • Date: Fri, 5 May 2006 05:02:47 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

On 5/4/06 at 5:20 AM, julian.aguirre at ehu.es (Julian Aguirre) wrote:

>2) Let MyList be a large list of integers (somewhere between 20.000
>and 50.000 elements) and MyTest a function on the integers returning
>True or False (for instance, test2 above). What is an efficient way
>of deciding if there is an element in MyList for which MyTest is
>True? Right now I use

>Select[MyList, MyTest, 1] != {}

There are a variety of alternatives particularly if your function isn't simply restricted to returning True or False.

For example consider trying to determine if a given value occurs in a list of random integers.

In[53]:=
data = Table[Random[Integer, {1, 10^6}], {10^5}]; 

then any of the following could be used

In[59]:=
Timing[Count[data, 100]]

Out[59]=
{0.053191 Second,0}

In[55]:=
Timing[Select[data,100==#&]]

Out[55]=
{0.27063 Second,{}}

In[56]:=
Timing[Cases[data,100]]

Out[56]=
{0.053879 Second,{}}

In[57]:=
Timing[Pick[data,#==100&/@data]]

Out[57]=
{0.348369 Second,{}}

The fastest method I know for this specific problem is:

In[58]:=
Timing[SparseArray[1 - Abs[Sign[data - 100]]] /. 
   SparseArray[_, _, _, a_] :> Last[a]]

Out[58]=
{0.014741 Second, {}}

Note, the fastest method will likely change with details of the function used as the test function.
--
To reply via email subtract one hundred and four


  • Prev by Date: Re: Testing for squares
  • Next by Date: When is x^y = != E^(y*Log[x])
  • Previous by thread: Re: Testing for squares
  • Next by thread: Re: Testing for squares