Re: Faster alternative to AppendTo?
- To: mathgroup at smc.vnet.net
- Subject: [mg102916] Re: [mg102886] Faster alternative to AppendTo?
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 2 Sep 2009 04:02:38 -0400 (EDT)
- References: <200909010753.DAA18801@smc.vnet.net>
Hi, avoid Prepend, Append, PrependTo and AppendTo inside loops like a plague. Take a look at http://www.mathprogramming-intro.org/book/node515.html and http://www.mathprogramming-intro.org/book/node240.html where I specifically discuss this problem and show a couple of faster implementations It is probably possible to solve this with Mathematica much more efficiently yet. Regards, Leonid On Tue, Sep 1, 2009 at 11:53 AM, Dem_z <dem_z at hotmail.com> wrote: > Hey, sorry I'm really new. I only started using mathematica recently, so > I'm not that savvy. > > Anyways, I wrote some code to calculate (and store) the orbits around > numbers in the Collatz conjecture. > > "Take any whole number n greater than 0. If n is even, we halve it (n/2), > else we do "triple plus one" and get 3n+1. The conjecture is that for all > numbers this process converges to 1. " > http://en.wikipedia.org/wiki/Collatz_conjecture > > > (*If there's no remainder, divides by 2, else multiply by 3 add 1*) > g[n_] := If[Mod[n, 2] == 0, n/2, 3 n + 1] > > (*creates an empty list a. Loops and appends the k's orbit into variable > "orbit", which then appends to variable "a" after the While loop is > completed. New m, sets new k, which restarts the While loop again.*) > a = {}; > Do[ > k = m; > orbit = {k}; > While[k > 1, AppendTo[orbit, k = g[k]]]; > AppendTo[a, orbit]; > , {m, 2,1000000}]; > > Anyways it seems that the AppendTo function gets exponentially slower, as > you throw more data into it. Is there a way to make this more efficient? To > calculate a million points takes days with this method. > >
- References:
- Faster alternative to AppendTo?
- From: Dem_z <dem_z@hotmail.com>
- Faster alternative to AppendTo?