Skip to main content

Want to compute the permutations of {1, 2, ..., 11} with only 3 GB of memory



There is another way to calculate


Permutations [{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}]


without triggering an error, I have 3 GB of RAM with WIN 7


Edit:


This short code is the one that broke my head for a while, are 11 variables that must meet a very specific condition, their difference must be 1. either can take the 11 values, hence all permutations, this code is an adaptation of another code I saw here, which helps me to what I need.


juan[{a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_}] := 
Abs[Differences /@ ({{a, b}, {a, c}, {b, c}, {b, f}, {b, e}, {c,
e}, {c, f}, {c, g}, {d, f}, {d, g}, {e, b}, {e, a}, {e, f}, {e,
i}, {e, h}, {f, g}, {f, j}, {f, i}, {f, h}, {g, i}, {g,
j}, {h, i}, {h, k}, {i, j}, {i, k}, {j, k}})] // Flatten
*(*per = Permutations[Range@11]*) (this line is calculated as 799 consecutive files in HD thanks to the collaboration of rasher)

(*per=Import["C:\\Users\\M\\Desktop\\per.txt"]*)(as I upload the files sequentially and that its securities are passing the variable "per" and will be prosecuted.?)
Select[per, FreeQ[juan@#, 1] &]

Answer



This will write the permutations to permutations.txt in list blocks of ~50,000 each.


Quiet@Block[{$ContextPath}, Needs["Combinatorica`"]]

len = 11
numchunk = 1000

chunks = Partition[Clip[FindDivisions[{0, len! - 1, 1}, numchunk],

{0, len! - 1}, {0,len! - 1}], 2, 1] //
(# + Join[{{0, 0}}, ConstantArray[{1, 0}, Length@# - 1]]) &;

Monitor[(chunk = #; (Combinatorica`UnrankPermutation[#, 11] & /@
Range @@ chunk) >>
"permutations-" <> ToString[First@#] <> "-" <>
ToString[Last@#] <> ".txt") & /@ chunks;, chunk]

Will take about an hour, I'd ventue...


If you must have equal sized files, you'll want to create your own chunks, since FindDivisions uses a heuristic that usually won't meet that criteria, e.g. in your case for 11 length:



p = Partition[Range[1, 102089*392, 102089] - 1, 2, 1];
p[[1]] = p[[1]] - {0, 1};
p[[2 ;;, 1]] = p[[2 ;;, 1]] + 1;
chunks = p;

Will create files all with same # of permutations (about 100k).


Comments