Re: Tally
- To: mathgroup at smc.vnet.net
- Subject: [mg86937] Re: Tally
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Wed, 26 Mar 2008 04:56:59 -0500 (EST)
- Organization: University of Bergen
- References: <fsa5eq$adg$1@smc.vnet.net>
Armen Kocharyan wrote:
> Dear Group,
>
> I'm trying the following:
>
>
> *Dlist = {{{0,1},{0,1}},{{1,0},{1,0}},{{1,0},{0,1}},{{0,1},{1,0}}};*
>
> *Tally[Dlist,(#1=== #2) \[Or] *
>
> * (#1[[1]][[1]]=== #2[[1]][[2]] \[And] *
>
> * #1[[1]][[2]]=== #2[[1]][[1]] \[And] *
>
> * #1[[2]][[1]]=== #2[[2]][[2]] \[And] *
>
> * #1[[2]][[2]]=== #2[[2]][[1]] )&]*
>
>
>
> The output is:
>
> *{{{{0,1},{0,1}},1},{{{1,0},{1,0}},1},{{{1,0},{0,1}},2}}*
>
> instead of
>
> *{{{{0,1},{0,1}},2},{{{1,0},{0,1}},2}}*
>
>
>
> If I remove the last member from DList
>
> *Dlist = {{{0,1},{0,1}},{{1,0},{1,0}},{{1,0},{0,1}}};*
>
> then I got a correct answer
>
> *{{{{0,1},{0,1}},2},{{{1,0},{0,1}},1}}.*
>
>
>
> Is anything wrong with my original code?
I really *hope* that I am wrong, but it seems to me that your code is
correct. The test function is a "good" equivalence relation, i.e. it is
reflexive, symmetric and transitive, so this cannot be the problem.
But something seems to be wrong with Tally:
test =
#1 === #2 ||
(#1[[1, 1]] === #2[[1, 2]] &&
#1[[1, 2]] === #2[[1, 1]] &&
#1[[2, 1]] === #2[[2, 2]] &&
#1[[2, 2]] === #2[[2, 1]]) &
dlist = {{{0, 1}, {0, 1}}, {{1, 0}, {1, 0}}, {{1, 0}, {0, 1}},
{{0, 1}, {1, 0}}}
test2[p_, q_] :=
With[{val = test[p, q]},
Print[{Position[dlist, p, {1}], Position[dlist, q, {1}], val}]; val]
( Using Position should work because this specific dlist has no
repeating elements )
The output of Tally[dlist, test2] is:
{{{1}},{{4}},False}
{{{3}},{{2}},False}
{{{4}},{{2}},False}
{{{4}},{{3}},True}
{{{1}},{{3}},False}
{{{2}},{{4}},False}
{{{4}},{{3}},True}
{{{3}},{{1}},False}
{{{{0, 1}, {0, 1}}, 1}, {{{1, 0}, {1, 0}}, 1},
{{{1, 0}, {0, 1}}, 2}}
It looks like Tally never tests element 1 against element 2, but it does
test element 4 against element 3 *twice*, even though this is completely
unnecessary.
This is the kind of bug that severely undermines one's trust in
Mathematica. I do not expect that Integrate or some numerical method
should always return a correct answer. I know that this is simply not
possible. But the algorithms that could be used by Tally are simple
enough that I find this bug quite shocking.