Re: Insufficient memory "General::nomem:" using Tuples
- To: mathgroup at smc.vnet.net
- Subject: [mg130235] Re: Insufficient memory "General::nomem:" using Tuples
- From: Ray Koopman <koopman at sfu.ca>
- Date: Wed, 27 Mar 2013 03:53:56 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <kirkrt$at6$1@smc.vnet.net>
On Mar 26, 1:05 am, Iv=E1n Lazaro <gamins... at gmail.com> wrote:
> Hi all!
>
> I've encounter a weird behavior today using Mathematica 9 under Linux.
>
> I'm defining a list of available modes
>
> num = 15;
> maxModes = ConstantArray[2, num];
>
> and then trying to organize them in all possible tuples
>
> lst=Tuples[Range[0, #] & /@ Join[maxModes - 1, maxModes - 1]];
>
> I expect a BIG number of outcomes, but then I'm just removing some
> (almost all) of them from the list:
>
> lst1=DeleteCases[Map[If[Total@Take[#, num] != Total@Take[#,
> {num + 1, 2 num}], sym, #] &,lst], _Symbol];
>
> The problem is that the computation doesn't finish building the
> tuples. I'm getting the output "General::nomem: The current
> computation was aborted because there was insufficient memory
> available to complete the computation."
>
> Is there a way to avoid this?
>
> Thanks in advance!
Each term in the reduced list is the concatenation of the num-bit
binary representations of two integers in [0, 2^num - 1]. The pairs
are all those in which the binary representations of both members
have the same number of 1-bits. The length of the reduced list is
With[{num = 15}, #.#& @ Binomial[num,Range[0,num]]] -> 155117520
It is probably better to generate the list in packed form,
and then to unpack it as necessary. Here is a toy example:
num = 3;
p = Join@@(Tuples[FromDigits[#,2]& /@ Permutations@
IntegerDigits[#,2,num], 2].{2^num,1} & /@ Table[2^k-1,{k,0,num}])
{0,9,10,12,17,18,20,33,34,36,27,29,30,43,45,46,51,53,54,63}
Since num is small we can unpack the whole list:
IntegerDigits[#,2,2*num]& /@ p
{{0,0,0,0,0,0},{0,0,1,0,0,1},{0,0,1,0,1,0},{0,0,1,1,0,0},
{0,1,0,0,0,1},{0,1,0,0,1,0},{0,1,0,1,0,0},{1,0,0,0,0,1},
{1,0,0,0,1,0},{1,0,0,1,0,0},{0,1,1,0,1,1},{0,1,1,1,0,1},
{0,1,1,1,1,0},{1,0,1,0,1,1},{1,0,1,1,0,1},{1,0,1,1,1,0},
{1,1,0,0,1,1},{1,1,0,1,0,1},{1,1,0,1,1,0},{1,1,1,1,1,1}}