using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Pqc.Math.LinearAlgebra { public class IntUtils { /** * Default constructor (private). */ private IntUtils() { // empty } /** * Compare two int arrays. No null checks are performed. * * @param left the first int array * @param right the second int array * @return the result of the comparison */ public static bool Equals(int[] left, int[] right) { return Arrays.AreEqual(left, right); } /** * Return a clone of the given int array. No null checks are performed. * * @param array the array to clone * @return the clone of the given array */ public static int[] Clone(int[] array) { return Arrays.Clone(array); } /** * Fill the given int array with the given value. * * @param array the array * @param value the value */ public static void Fill(int[] array, int value) { Arrays.Fill(array, value); } /** * Sorts this array of integers according to the Quicksort algorithm. After * calling this method this array is sorted in ascending order with the * smallest integer taking position 0 in the array. *
* This implementation is based on the quicksort algorithm as described in
* Data Structures In Java
by Thomas A. Standish, Chapter 10,
* ISBN 0-201-30564-X.
*
* @param source the array of integers that needs to be sorted.
*/
public static void Quicksort(int[] source)
{
Quicksort(source, 0, source.Length - 1);
}
/**
* Sort a subarray of a source array. The subarray is specified by its start
* and end index.
*
* @param source the int array to be sorted
* @param left the start index of the subarray
* @param right the end index of the subarray
*/
public static void Quicksort(int[] source, int left, int right)
{
if (right > left)
{
int index = Partition(source, left, right, right);
Quicksort(source, left, index - 1);
Quicksort(source, index + 1, right);
}
}
/**
* Split a subarray of a source array into two partitions. The left
* partition contains elements that have value less than or equal to the
* pivot element, the right partition contains the elements that have larger
* value.
*
* @param source the int array whose subarray will be splitted
* @param left the start position of the subarray
* @param right the end position of the subarray
* @param pivotIndex the index of the pivot element inside the array
* @return the new index of the pivot element inside the array
*/
private static int Partition(int[] source, int left, int right,
int pivotIndex)
{
int pivot = source[pivotIndex];
source[pivotIndex] = source[right];
source[right] = pivot;
int index = left;
int tmp = 0;
for (int i = left; i < right; i++)
{
if (source[i] <= pivot)
{
tmp = source[index];
source[index] = source[i];
source[i] = tmp;
index++;
}
}
tmp = source[index];
source[index] = source[right];
source[right] = tmp;
return index;
}
/**
* Generates a subarray of a given int array.
*
* @param input -
* the input int array
* @param start -
* the start index
* @param end -
* the end index
* @return a subarray of input, ranging from start to
* end
*/
public static int[] SubArray( int[] input, int start,
int end)
{
int[] result = new int[end - start];
Array.Copy(input, start, result, 0, end - start);
return result;
}
/**
* @param input an int array
* @return a human readable form of the given int array
*/
public static String ToString(int[] input)
{
String result = "";
for (int i = 0; i < input.Length; i++)
{
result += input[i] + " ";
}
return result;
}
}
}