Re: Some list questions
- To: mathgroup at smc.vnet.net
- Subject: [mg37150] Re: [mg37132] Some list questions
- From: BobHanlon at aol.com
- Date: Sun, 13 Oct 2002 05:56:38 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
In a message dated 10/12/2002 6:21:51 AM, flip_alpha at safebunch.com writes:
>I have two seperate list questions that I was hoping to get help with.
>
>Question 1.
>
> I have a variable length list similar to that generated by FactorInteger,
>that is {number, exponent} pairs. An example follows.
>
>lista = {{2,3},{3,1},{5,1}} ... this is the number 2^3 * 3^1 * 5^1
>
>I want to generate a list of "all" the products of numbers from this list.
>
>I can tell that I get a total (3+1)*(1+1)*(1+1) = 4*2*2 = 16, products
>and I
>want a list showing all of those.
>
>These would be:
>
>2^3 can generate {2^0, 2^1, 2^2, 2^3} = {1, 2, 4 ,8}
>3^1 can generate {3^0, 3^1} = {3} ... we dont care about the duplicate
>"1"
>5^1 can generate {5^0, 5^1} = {5} ... we dont care about the duplicate
>"1"
>
>Hence the 4*2*2 = 16 (the product of one more of the exponents) above.
>
>Next we should get 16 products (from these lists), namely (I left them
>as
>products below to show what I am after):
>
>{1, 2, 4, 8, 1*3, 2*3, 4*3, 8*3, 1*5, 2 * 5, 4* 5, 8* 5, 1*3*5,
>2*3*5, 4*3*5, 8*3*5}
>
>If the list were lista = {{2,4}, {3,2}, {5, 3},{7^5}}, we would have
>(4+1)(2+1)(3+1)(5+1) = 360 products, for example and the return values
>should be a single list showing all of those.
>
>Question 2.
>
>I have two lists and want to generate two new lists from them. These two
>lists are {number, exponent} pairs.
>
>In the first list, I want the "minimum intersection" of {number, exponent}
>pairs.
>
>In the second list, I want the "maximum union" of {number, exponent} pairs.
>
>Let me show an example:
>
>Input:
>
>list1 = {{2, 3}, {3, 4}, {5, 6}, {7, 2}, {17, 5}}
>
>list2 = {{2, 5}, {3, 2}, {5, 1}, {7, 3}}
>
>Output:
>
>minint = {{2, 3}, {3, 2}, {5, 1}, {7, 2}}
>
>Note: In this example we only kept those pairs where the intersection of
>the
>number exists and also keep the min power of those.
>
>maxint = {{2, 5}, {3, 4}, {5, 6}, {7, 3}, {17, 5}}
>
>Note: In this example we kept the union of lists and also keep the max
>power
>of each.
>
allProducts[x_] :=
Module[{sx = Sort[x, #2[[2]] < #1[[2]] &], f},
Union[Flatten[
Outer[f, Sequence @@
(PadRight[#, sx[[1, -1]] + 1,
1] & /@
(#[[1]]^
Range[0, #[[2]]] & /@ sx))]] /.
f -> Times]];
lista = {{2, 3}, {3, 1}, {5, 1}};
allProducts[lista]
{1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60, 120}
minInt[x_, y_] :=
FactorInteger[GCD[
Times @@ (#[[1]]^#[[2]] & /@ x),
Times @@ (#[[1]]^#[[2]] & /@ y)]];
maxInt[x_, y_] :=
Union[x, y] //.
{s___, {b_, e1_}, {b_, e2_}, r___} :>
{s, {b, Max[e1, e2]}, r}
list1 = {{2, 3}, {3, 4}, {5, 6}, {7, 2}, {17, 5}};
list2 = {{2, 5}, {3, 2}, {5, 1}, {7, 3}};
minInt[list1, list2]
{{2, 3}, {3, 2}, {5, 1}, {7, 2}}
maxInt[list1, list2]
{{2, 5}, {3, 4}, {5, 6}, {7, 3}, {17, 5}}
Bob Hanlon