Re: Computing sets of equivalences
- To: mathgroup at smc.vnet.net
- Subject: [mg46695] Re: Computing sets of equivalences
- From: drbob at bigfoot.com (Bobby R. Treat)
- Date: Tue, 2 Mar 2004 00:14:18 -0500 (EST)
- References: <c1iqsd$68r$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
This may not be faster, but it eliminates Union, Map, Sow, and Reap,
replacing them with DownValues,Transpose, Sort, and Split.
brt[lst_List] := Block[{f, g},
Scan[(f[#[[1]]] = f[#[[2]]] = Unique[x]) &, lst];
Scan[(Evaluate[f[#[[1]]]] = f[#[[2]]]) &, lst];
g = DownValues[f];
Split[Sort@
Transpose@{g[[All, 2]], g[[All, 1, 1, 1]]}, #1[[1]] == #2[[
1]] &][[All, All, -1]]
]
Bobby
"Simons, F.H." <F.H.Simons at tue.nl> wrote in message news:<c1iqsd$68r$1 at smc.vnet.net>...
> Here is another solution of the problem. It is based on constructing a function that is constant on each equivalence class and has different values on different classes.
>
> equivalences[lst_List] := Block[{f},
> Scan[(f[#[[1]]]=f[#[[2]]]=Unique[x])&,lst];
> Scan[(Evaluate[f[#[[1]]]]=f[#[[2]]])& , lst];
> Reap[Sow[#, f[#]]& /@ Union@@lst][[2]]]
>
> Only for large intial sets of initial equivalences Carl Woll's solution seems to be slightly faster.
>
> Regards,
>
> Fred Simons
> Eindhoven University of Technology