Intersection( D1, D2... )
Intersection( list )
In the first form Intersection returns the intersection of the
domains D1, D2, etc. In the second form list
must be a list of domains and Intersection returns the
intersection of those domains. Each argument D or element of list
respectively may also be an arbitrary list, in which case Intersection
silently applies Set (see Set) to it first.
The result of Intersection is the set of elements that lie in
every of the domains D1, D2, etc. Functions called by
the dispatcher function Intersection however, are encouraged to
keep as much structure as possible. So if D1 and D2 are
elements of a common category and if this category is closed under taking
intersections, then the result should be a domain lying in this category too.
So for example the intersection of permutation groups will again be a
permutation group.
gap> Intersection( CyclotomicField(9), CyclotomicField(12) );
CF(3) # 'CF' is a shorthand for 'CyclotomicField'
# this is one of the rare cases where the intersection
# of two infinite domains works
gap> Intersection( GaussianIntegers, Rationals );
Error, sorry, cannot intersect infinite domains <D> and <E>
gap> Intersection( D12, Group( (1,2), (1,2,3,4,5) ) );
Group( (1,5)(2,4) )
gap> Intersection( D12, [ (1,3)(4,6), (1,2)(3,4) ] );
[ (1,3)(4,6) ] # note that the second argument is not a set
gap> Intersection( D12, [ (), (1,2)(3,4), (1,3)(4,6), (1,4)(5,6) ] );
[ (), (1,3)(4,6) ] # although the result is mathematically a
# group it is returned as a proper set
# because the second argument was not a group
gap> Intersection( [2,4,6,8,10], [3,6,9,12,15], [5,10,15,20,25] );
[ ] # two or more domains or sets as arguments are legal
gap> Intersection( [ [1,2,4], [2,3,4], [1,3,4] ] );
[ 4 ] # or a list of domains or sets
gap> Intersection( [ ] );
Error, List Element: <list>[1] must have a value
The dispatcher function (see Dispatchers) Intersection is
slightly different from other dispatcher functions. It does not simply call
the function in the operations record passings its arguments. Instead it
loops over its arguments (or the list of domains or sets) and calls the
function in the operations record repeatedly, and passes each time only two
domains. This obviously makes writing the function for the operations record
simpler.
The default function DomainOps.Intersection checks whether both
domains are infinite. If they are it signals an error. Otherwise, if one of
the domains is infinite it loops over the elements of the other domain, and
tests for each element whether it lies in the infinite domain. If both
domains are finite it computes the proper sets of elements of both and
intersects them (see Elements and Set Functions for Sets). This default
method is overlaid by more special functions for most other domains. Those
functions usually are faster and keep the structure of the domains if
possible.