Function Ops.permutation()
passes binary arithmetic
operators (“+
”, “*
”, “/
”,
“^
”, and “==
”) to the appropriate
specialist function.
Multiplication, as in a*b
, is effectively
word_prod(a,b)
; it coerces its arguments to word form (because
a*b = b[a]
).
Raising permutations to integer powers, as in a^n
, is
cycle_power(a,n)
; it coerces a
to cycle form and returns
a cycle (even if \(n=1\)). Negative and zero values of n
operate as expected. Function cycle_power()
is vectorized; it
calls cycle_power_single()
, which is not. This calls
vps()
(“Vector Power Single”), which checks for simple
cases such as pow=0
or the identity permutation; and function
vps()
calls function ccps()
which performs the actual
number-theoretic manipulation to raise a cycle to a power.
Group-theoretic conjugation is implemented: in package idiom,
a^b
gives inverse(b)*a*b
. The notation is motivated by
the identities x^(yz)=(x^y)^z
and (xy)^z=x^z*y^z
[or
\(x^{yz}=(x^y)^z\) and \((xy)^z=x^zy^z\)].
Internally, conjugation()
is called. The concept of conjugate
permutations [that is, permutations with the same
shape()
] is discussed at conjugate.
The sum of two permutations a
and b
, as in
a+b
, is defined if the cycle representations of the addends are
disjoint. The sum is defined as the permutation given by juxtaposing
the cycles of a
with those of b
. Note that this
operation is commutative. If a
and b
do not have
disjoint cycle representations, an error is returned. This is useful
if you want to guarantee that two permutations commute (NB:
permutation a
commutes with a^i
for i
any
integer, and in particular a
commutes with itself. But
a+a
returns an error: the operation checks for disjointness,
not commutativity).
Permutation “division”, as in a/b
, is
a*inverse(b)
. Note that a/b*c
is evaluated left to
right so is equivalent to a*inverse(b)*c
. See note.
Function helper()
sorts out recycling for binary functions, the
behaviour of which is inherited from cbind()
, which also
handles the names of the returned permutation.
Experimental functionality is provided to define the “sum” of a
permutation and an integer. If \(x\) is a permutation in cycle
form with \(x=(abc)\), say, and \(n\) an integer, then
\(x+n=(a+n,b+n,c+n)\): each element of each cycle of \(x\)
is increased by \(n\). Note that this has associativity
consequences. For example, x+(x+n)
might be defined but not
(x+x)+n
, as the two “+
” operators have different
interpretations. Distributivity is similarly broken (see the
examples). Package idiom includes x-n
[defined as x +
(-n)
] and n+x
but not n-x
as inverses are defined
multiplicatively. The implementation is vectorised.