/// <inheritdoc cref="GetEnumerator"/>
        public IEnumerator <int[]> iterator()
        {
            if (k == 0 ||
                k == n)
            {
                return(new SingletonIterator(MathArrays.natural(k)));
            }

            switch (iterationOrder)
            {
            case IterationOrder.LEXICOGRAPHIC:
                return(new LexicographicIterator(n, k));

            default:
                throw new MathInternalError();     // Should never happen.
            }
        }
        /// <inheritdoc/>
        /// <remarks>
        /// This method calls <see cref="MathArrays.shuffle(int[],RandomGenerator)"/>
        /// in order to create a random shuffle of the set
        /// of natural numbers <c>{ 0, 1, ..., n - 1 </c>}.
        /// </remarks>
        /// <exception cref="NumberIsTooLargeException"> if <c>k > n</c>.</exception>
        /// <exception cref="NotStrictlyPositiveException"> if <c>k <= 0</c>.</exception>
        public int[] nextPermutation(int n, int k)
        {
            if (k > n)
            {
                throw new NumberIsTooLargeException <Int32, Int32>(new LocalizedFormats("PERMUTATION_EXCEEDS_N"), k, n, true);
            }
            if (k <= 0)
            {
                throw new NotStrictlyPositiveException <Int32>(new LocalizedFormats("PERMUTATION_SIZE"), k);
            }

            int[] index = MathArrays.natural(n);
            MathArrays.shuffle(index, getRandomGenerator());

            // Return a new array containing the first "k" entries of "index".
            return(MathArrays.copyOf(index, k));
        }