Re: permutations
- To: mathgroup at smc.vnet.net
- Subject: [mg62458] Re: permutations
- From: Peter Pein <petsie at dordos.net>
- Date: Fri, 25 Nov 2005 02:24:56 -0500 (EST)
- References: <dm1jov$n4c$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Francisco Gutierrez schrieb: > Dear Group: > If I do for example: > Permutations[{x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12}], > my computer runs out of memory. > This is not such a poor computer. Actually, I would need to do > permutations of lists of Length 20, perhaps 25. I am aware > these calculations are big (Length[x]!), but I wonder if there > is some way around the problem. Compilating Permutations? > But then how? Can somebody help me? > Francisco Gutiérrez > > > Hi Francisco, I don't know whether it is easy to apply in your task to generate one permutation after the other. There is NextPermutation[] in DiscreteMath`Combinatorica`, but you can do faster: nextPermutation[p_List] := Block[{p1, p2, i, r}, p1 = p[[i = Last[Pick[Range[Length[p] - 1], Positive[Rest[p] - Most[p]]]]]]; r = Drop[p, i]; Join[Take[p, i - 1], {p2 = Min[Pick[r, Positive[r - p1]]]}, Sort[r /. p2 -> p1]]] <<DiscreteMath`Combinatorica` Timing[p = Range[9]; Do[p = NextPermutation[p], {9!/2}]; p] {12.25*Second, {5, 4, 9, 8, 7, 6, 3, 2, 1}} Timing[p = Range[9]; Do[p = nextPermutation[p], {9!/2}]; p] {8.141*Second, {5, 4, 9, 8, 7, 6, 3, 2, 1}} Even at this speed you would need 8.141*20!/(9!/2)/3600/24/365 = 3.46*10^6 years to generate all Permutations of Range[20], which is some 4 million years less than Deep Thought took to calculate 42 ;-) Peter