Re: Intersection[...,SameTest] ?
- To: mathgroup at smc.vnet.net
- Subject: [mg33103] Re: Intersection[...,SameTest] ?
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 3 Mar 2002 06:30:25 -0500 (EST)
- References: <a5htcj$hsk$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
The problem is how to get the result we expect from
Intersection[lst1, lst2, ...., SameTest->test]
In my earlier posting I replaced test with an explicit reflexive, symmetric,
transitive extension ( that is its equivalence extension).
It would be better if we could find a generalt method that let Mathematica
do most of the work - I have come up against some difficulties in trying to
do this.
To try things out set
a = {1, 6, 0, 0, 8};
b = {3, 8, 0, 0};
Jens-Peer Kuska suggested making the test symmetric
Intersection[a, b, SameTest ->
(If[#2 < #1, #1 === 2*#2, #2 === 2*#1] & )]
{0,0,6}
The 8 does not appear because the test is not reflexive.
This is easily dealt with -- but here is a different form.
tst2 = #1 == #2 || #1 == 2*#2 || 2*#1 == #2 & ;
Intersection[a, b, SameTest -> tst2]
{0,0,6,8}
We still need to remove the repeated 0.
Union[%, SameTest -> tst2]
{0,6,8}
This suggests that a general method might be:
Given test to define the reflexive symmetric extension rstest by
rstest[x_, y_] := x == y || test[x, y] || test[y, x]
and leave Mathemtica to, in effect, make this transitive
Unfortunately, it turns out that Mathematica still does not cope with this.
Consider
test[x_, y_] := x == 2*y || x == 3*y;
rstest[x_, y_] := x == y || test[x, y] || test[y, x]
Intersection[{3, 2, 6}, {3, 2, 6}, SameTest -> rstest]
{2,3,6}
We would expect only one member.
Try
Union[%, SameTest -> rstest]
{2,3}
Repeat
Union[%,SameTest->rstest]
{2,3}
A generall difficulty illustrated by Union[{2,3},SameTest->rstest] is that
the linking 6 the gives 2 ~6 and 3~6, whence 2~3 is not available.
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565