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