jnumbertools

Home </br>Permutation Generators </br>Combination Generators </br>Set/Subset Generators </br>Cartesian Product Generators </br>Math Functions </br>Ranking Algorithms </br>Number System Algorithms

Combination Generators

JNumberTools provides the following 15 combination generation APIs. All mth generators are BigInteger compatible, enabling rapid generation of combinations at very large indices, such as 10100.

Currently Available Algorithms

  1. Unique Combinations
    1. Unique combination in lex order
    2. Every mth unique combination in lex order
    3. Unique combination random choice
    4. Unique combination random sample
    5. Unique combination for ranks
  2. Multiset Combinations
    1. Multiset combination in lex order
    2. Every mth multiset combination
    3. Multiset combination random choice
    4. Multiset combination random sample
    5. Multiset combination for ranks
  3. Repetitive Combinations
    1. Repetitive combination in lex order
    2. Every mth repetitive combination
    3. Repetitive combination random choice
    4. Repetitive combination random sample
    5. Repetitive combination for ranks

1. Unique Combinations

1.1 Unique combination in lex order

Selection of r distinct items out of n elements, also known as n-Choose-r. Generates all combinations in lexicographical order.

// All possible combinations of 3 numbers in range [0,5) in lex order
JNumberTools.combinations()
    .unique(5, 3)
    .lexOrder()
    .stream().toList();

// All possible combinations of 3 elements from ["A","B","C","D","E"] in lex order
JNumberTools.combinations()
    .unique(3, "A", "B", "C", "D", "E")
    .lexOrder()
    .stream().toList();

1.2 Every m-th unique combination in lex order

Generates every mth combination in lexicographical order, starting from a given index. This is efficient for large combination counts, such as generating the billionth combination of 34-Choose-17 without sequential iteration.

// 5th, 7th, 9th... combinations of 3 numbers in range [0,5) in lex order
JNumberTools.combinations()
    .unique(5, 3)
    .lexOrderMth(2, 5)
    .stream().toList();

// 5th, 7th, 9th... combinations of 3 elements from ["A","B","C","D","E"] in lex order
JNumberTools.combinations()
    .unique(3, "A", "B", "C", "D", "E")
    .lexOrderMth(2, 5)
    .stream().toList();

1.3 Unique combination random choice

Generates n random combinations with duplicates allowed.

// Generate any 5 random combinations of 10 items [0,10) from 20 items [0,20) with duplicates
JNumberTools.combinations()
    .unique(20, 10)
    .choice(5)
    .stream().forEach(System.out::println);

// Generate any 5 random combinations of 5 items from ["A","B","C","D","E","F","G"] with duplicates
JNumberTools.combinations()
    .unique(5, "A", "B", "C", "D", "E", "F", "G")
    .choice(5)
    .stream().forEach(System.out::println);

1.4 Unique combination random sample

Generates n random combinations without duplicates.

// Generate any 5 random combinations of 10 items [0,10) from 20 items [0,20) without duplicates
JNumberTools.combinations()
    .unique(20, 10)
    .sample(5)
    .stream().forEach(System.out::println);

// Generate any 5 random combinations of 5 items from ["A","B","C","D","E","F","G"] without duplicates
JNumberTools.combinations()
    .unique(5, "A", "B", "C", "D", "E", "F", "G")
    .sample(5)
    .stream().forEach(System.out::println);

1.5 Unique combination for ranks

Generates combinations at indices specified by a custom sequence.

// Generates combinations of 100 items from 200 at specified indices
var iterable = List.of(10, 20, 1_000_000_000L, new BigInteger("1000000000000000000000"));
JNumberTools.combinations()
    .unique(200, 100)
    .byRanks(iterable)
    .stream().toList();

2. Multiset Combinations

2.1 Multiset combination in lex order

Generates all combinations of selecting r items from a multiset, where each item has a specified frequency, in lexicographical order.

// All combinations of 3 items from a multiset with 2 Apples and 1 Banana
var elements = new LinkedHashMap<>(Map.of("Apple", 2, "Banana", 1));
JNumberTools.combinations()
    .multiset(elements, 3)
    .lexOrder()
    .stream().toList();

2.2 Every m-th multiset combination

Generates every mth multiset combination in lexicographical order, starting from a given index, without computing preceding combinations.

// Every 3rd combination of 3 items from a multiset with 2 Apples and 1 Banana, starting from 5th
var elements = new LinkedHashMap<>(Map.of("Apple", 2, "Banana", 1));
JNumberTools.combinations()
    .multiset(elements, 3)
    .lexOrderMth(3, 5)
    .stream().toList();

2.3 Multiset combination random choice

Generates n random multiset combinations with duplicates allowed.

// Generate 5 random combinations of 3 items from a multiset with 2 Apples and 1 Banana, with duplicates
var elements = new LinkedHashMap<>(Map.of("Apple", 2, "Banana", 1));
JNumberTools.combinations()
    .multiset(elements, 3)
    .choice(5)
    .stream().forEach(System.out::println);

2.4 Multiset combination random sample

Generates n random multiset combinations without duplicates.

// Generate 5 random combinations of 3 items from a multiset with 2 Apples and 1 Banana, without duplicates
var elements = new LinkedHashMap<>(Map.of("Apple", 2, "Banana", 1));
JNumberTools.combinations()
    .multiset(elements, 3)
    .sample(5)
    .stream().forEach(System.out::println);

2.5 Multiset combination for ranks

Generates multiset combinations at indices specified by a custom sequence.

// Generates combinations of 3 items from a multiset with 50 Apples and 50 Bananas at specified indices
var elements = new LinkedHashMap<>(Map.of("Apple", 50, "Banana", 50));
var iterable = List.of(10, 20, 1_000_000_000L, new BigInteger("1000000000000000000000"));
JNumberTools.combinations()
    .multiset(elements, 3)
    .byRanks(iterable)
    .stream().toList();

3. Repetitive Combinations

3.1 Repetitive combination in lex order

Generates all combinations of r items from n elements with repetition allowed, also known as n+Choose-r, in lexicographical order.

// All combinations of 3 numbers with repetition from [0,5) in lex order
JNumberTools.combinations()
    .repetitive(5, 3)
    .lexOrder()
    .stream().toList();

// All combinations of 3 elements with repetition from ["A","B","C","D","E"] in lex order
JNumberTools.combinations()
    .repetitive(3, "A", "B", "C", "D", "E")
    .lexOrder()
    .stream().toList();

3.2 Every m-th repetitive combination

Generates every mth repetitive combination in lexicographical order, starting from a given index.

// 5th, 7th, 9th... combinations of 3 numbers with repetition from [0,5) in lex order
JNumberTools.combinations()
    .repetitive(5, 3)
    .lexOrderMth(2, 5)
    .stream().toList();

// 5th, 7th, 9th... combinations of 3 elements with repetition from ["A","B","C","D","E"] in lex order
JNumberTools.combinations()
    .repetitive(3, "A", "B", "C", "D", "E")
    .lexOrderMth(2, 5)
    .stream().toList();

3.3 Repetitive combination random choice

Generates n random repetitive combinations with duplicates allowed.

// Generate 5 random combinations of 3 numbers with repetition from [0,5) with duplicates
JNumberTools.combinations()
    .repetitive(5, 3)
    .choice(5)
    .stream().forEach(System.out::println);

3.4 Repetitive combination random sample

Generates n random repetitive combinations without duplicates.

// Generate 5 random combinations of 3 numbers with repetition from [0,5) without duplicates
JNumberTools.combinations()
    .repetitive(5, 3)
    .sample(5)
    .stream().forEach(System.out::println);

3.5 Repetitive combination for ranks

Generates repetitive combinations at indices specified by a custom sequence.

// Generates combinations of 100 items with repetition from 200 at specified indices
var iterable = List.of(10, 20, 1_000_000_000L, new BigInteger("1000000000000000000000"));
JNumberTools.combinations()
    .repetitive(200, 100)
    .byRanks(iterable)
    .stream().toList();

Home </br>Permutation Generators </br>Combination Generators </br>Set/Subset Generators </br>Cartesian Product Generators </br>Math Functions </br>Ranking Algorithms </br>Number System Algorithms