############################################################################
#
# File: permutat.icn
#
# Subject: Procedures for permutations
#
# Author: Ralph E. Griswold
#
# Date: June 10, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# Links: lists, seqops
#
############################################################################
link lists
link seqops
procedure multireduce(i, j) #: multi-reduction permutation
local indexes, result, parts
/j := 2
indexes := []
every put(indexes, 1 to j)
parts := ldecollate(indexes, srun(1, i))
result := []
every result |||:= !parts
return result
end
procedure permperiod(p) #: period of permutation
local lengths
lengths := []
every put(lengths, *!cycles(p))
return lcml ! lengths
end
procedure cycles(p) #: permutation cycles
local indices, cycle, cycles, i
cycles := [] # list of cycles
indices := set()
every insert(indices, 1 to *p)
repeat {
i := !indices | break
delete(indices, i)
cycle := set()
insert(cycle, i)
repeat {
i := integer(p[i])
delete(indices, i)
if member(cycle, i) then break # done with cycle
else insert(cycle, i) # new member of cycle
}
put(cycles, sort(cycle))
}
return cycles
end
procedure mutate(seq, mutation) #: mutate sequence
local result
result := []
every put(result, seq[!mutation])
return result
end
This page produced by UniDoc on 2021/04/15 @ 23:59:45.