# 4.12 Intersection

`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.

GAP 3.4.4
April 1997