Home </br>Permutation Generators </br>Derangement Generators </br>Combination Generators </br>Set/Subset Generators </br>Cartesian Product Generators </br>Math Functions </br>Ranking Algorithms </br>Number System Algorithms
JNumberTools provides derangement (fixed-point-free permutation) generators for lists and integer ranges. All mth generators are BigInteger compatible, enabling rapid access to very large ranks.
Currently Available Algorithms
Generates all derangements of the given elements in lexicographical order. A derangement is a permutation where no element appears in its original position.
// All derangements of [0,1,2,3] in lex order
JNumberTools.derangements()
.of(4)
.lexOrder()
.stream().forEach(System.out::println);
// All derangements of ["A","B","C","D"] in lex order
JNumberTools.derangements()
.of("A", "B", "C", "D")
.lexOrder()
.stream().forEach(System.out::println);
Generates every mth derangement, starting from a given rank, without iterating through all prior derangements.
int m = 3;
int start = 0;
// Every 3rd derangement of [0,1,2,3,4] starting from rank 0
JNumberTools.derangements()
.of(5)
.lexOrderMth(m, start)
.stream().forEach(System.out::println);
// Every 3rd derangement of ["A","B","C","D","E"] starting from rank 0
JNumberTools.derangements()
.of("A", "B", "C", "D", "E")
.lexOrderMth(m, start)
.stream().forEach(System.out::println);
Generates random derangements with replacement (duplicates allowed).
// Generate any 5 derangements of [0,1,2,3] with duplicates allowed
JNumberTools.derangements()
.of(4)
.choice(5)
.stream().forEach(System.out::println);
Generates random derangements without replacement (unique output).
// Generate 5 unique derangements of ["A","B","C","D","E"]
JNumberTools.derangements()
.of("A", "B", "C", "D", "E")
.sample(5)
.stream().forEach(System.out::println);
Generates derangements at indices specified by a custom rank sequence.
var ranks = List.of(
BigInteger.ZERO,
BigInteger.valueOf(2),
BigInteger.valueOf(10),
new BigInteger("1000000000000000000"));
// Generate derangements of size 8 at specific ranks
JNumberTools.derangements()
.of(8)
.byRanks(ranks)
.stream().forEach(System.out::println);
Home </br>Permutation Generators </br>Derangement Generators </br>Combination Generators </br>Set/Subset Generators </br>Cartesian Product Generators </br>Math Functions </br>Ranking Algorithms </br>Number System Algorithms