> int find(T[] array, T value) {
- for (int i = 0; i < array.length ; i++) {
- if (array[i].compareTo(value) == 0) {
- return i;
- }
- }
- return -1;
- }
-
-
- public static void main(String[] args) {
- //just generate data
- Random r = new Random();
- int size = 200;
- int maxElement = 100;
- Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).toArray(Integer[]::new);
-
-
- //the element that should be found
- Integer shouldBeFound = integers[r.nextInt(size - 1)];
-
- LinearSearch search = new LinearSearch();
- int atIndex = search.find(integers, shouldBeFound);
-
- System.out.println(String.format("Should be found: %d. Found %d at index %d. An array length %d"
- , shouldBeFound, integers[atIndex], atIndex, size));
- }
-
-}
diff --git a/Searches/src/search/SaddlebackSearch.java b/Searches/src/search/SaddlebackSearch.java
deleted file mode 100644
index 68779db8f79f..000000000000
--- a/Searches/src/search/SaddlebackSearch.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package search;
-
-import java.util.Scanner;
-
-/**
- * Program to perform Saddleback Search
- * Given a sorted 2D array(elements are sorted across every row and column, assuming ascending order)
- * of size n*m we can search a given element in O(n+m)
- *
- * we start from bottom left corner
- * if the current element is greater than the given element then we move up
- * else we move right
- * Sample Input:
- * 5 5 ->Dimensions
- * -10 -5 -3 4 9
- * -6 -2 0 5 10
- * -4 -1 1 6 12
- * 2 3 7 8 13
- * 100 120 130 140 150
- * 140 ->element to be searched
- * output: 4 3 // first value is row, second one is column
- *
- * @author Nishita Aggarwal
- */
-public class SaddlebackSearch {
-
- /**
- * This method performs Saddleback Search
- *
- * @param arr The **Sorted** array in which we will search the element.
- * @param row the current row.
- * @param col the current column.
- * @param key the element that we want to search for.
- * @return The index(row and column) of the element if found.
- * Else returns -1 -1.
- */
- private static int[] find(int arr[][], int row, int col, int key) {
-
- //array to store the answer row and column
- int ans[] = {-1, -1};
- if (row < 0 || col >= arr[row].length) {
- return ans;
- }
- if (arr[row][col] == key) {
- ans[0] = row;
- ans[1] = col;
- return ans;
- }
- //if the current element is greater than the given element then we move up
- else if (arr[row][col] > key) {
- return find(arr, row - 1, col, key);
- }
- //else we move right
- return find(arr, row, col + 1, key);
- }
-
- /**
- * Main method
- *
- * @param args Command line arguments
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Scanner sc = new Scanner(System.in);
- int arr[][];
- int i, j, rows = sc.nextInt(), col = sc.nextInt();
- arr = new int[rows][col];
- for (i = 0; i < rows; i++) {
- for (j = 0; j < col; j++) {
- arr[i][j] = sc.nextInt();
- }
- }
- int ele = sc.nextInt();
- //we start from bottom left corner
- int ans[] = find(arr, rows - 1, 0, ele);
- System.out.println(ans[0] + " " + ans[1]);
- sc.close();
- }
-
-}
diff --git a/Searches/src/search/SearchAlgorithm.java b/Searches/src/search/SearchAlgorithm.java
deleted file mode 100644
index ca3bf59ba552..000000000000
--- a/Searches/src/search/SearchAlgorithm.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package search;
-
-/**
- * The common interface of most searching algorithms
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- **/
-public interface SearchAlgorithm {
-
- /**
- *
- * @param key is an element which should be found
- * @param array is an array where the element should be found
- * @param Comparable type
- * @return first found index of the element
- */
- > int find(T array[], T key);
-
-}
diff --git a/Searches/src/search/TernarySearch.java b/Searches/src/search/TernarySearch.java
deleted file mode 100644
index 7e60edf3aad7..000000000000
--- a/Searches/src/search/TernarySearch.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package search;
-
-
-import java.util.Arrays;
-import java.util.Random;
-import java.util.stream.Stream;
-
-import static java.lang.String.format;
-
-/**
- *
- *
- *
- * A ternary search algorithm is a technique in computer science for finding the minimum or maximum of a unimodal function
- * The algorithm determines either that the minimum or maximum cannot be in the first third of the domain
- * or that it cannot be in the last third of the domain, then repeats on the remaining third.
- *
- * Worst-case performance Θ(log3(N))
- * Best-case performance O(1)
- * Average performance Θ(log3(N))
- * Worst-case space complexity O(1)
- *
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- * @see SearchAlgorithm
- * @see IterativeBinarySearch
- *
- */
-
-public class TernarySearch implements SearchAlgorithm{
-
- /**
- * @param arr The **Sorted** array in which we will search the element.
- * @param value The value that we want to search for.
- * @return The index of the element if found.
- * Else returns -1.
- */
- @Override
- public > int find(T[] arr, T value){
- return ternarySearch(arr, value, 0, arr.length - 1);
- }
-
- /**
- * @param arr The **Sorted** array in which we will search the element.
- * @param key The value that we want to search for.
- * @param start The starting index from which we will start Searching.
- * @param end The ending index till which we will Search.
- * @return Returns the index of the Element if found.
- * Else returns -1.
- */
- private > int ternarySearch(T[] arr, T key, int start, int end) {
- if (start > end){
- return -1;
- }
- /* First boundary: add 1/3 of length to start */
- int mid1 = start + (end - start) / 3;
- /* Second boundary: add 2/3 of length to start */
- int mid2 = start + 2 * (end - start) / 3;
-
- if (key.compareTo(arr[mid1]) == 0) {
- return mid1;
- }
- else if (key.compareTo(arr[mid2]) == 0) {
- return mid2;
- }
-
- /* Search the first (1/3) rd part of the array.*/
-
- else if (key.compareTo(arr[mid1]) < 0) {
- return ternarySearch(arr, key, start, --mid1);
- }
- /* Search 3rd (1/3)rd part of the array */
-
- else if (key.compareTo(arr[mid2]) > 0) {
- return ternarySearch(arr, key, ++mid2, end);
- }
- /* Search middle (1/3)rd part of the array */
-
- else {
- return ternarySearch(arr, key, mid1, mid2);
- }
- }
-
- public static void main(String[] args) {
- //just generate data
- Random r = new Random();
- int size = 100;
- int maxElement = 100000;
- Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).sorted().toArray(Integer[]::new);
-
-
- //the element that should be found
- Integer shouldBeFound = integers[r.nextInt(size - 1)];
-
- TernarySearch search = new TernarySearch();
- int atIndex = search.find(integers, shouldBeFound);
-
- System.out.println(format("Should be found: %d. Found %d at index %d. An array length %d"
- , shouldBeFound, integers[atIndex], atIndex, size));
-
- int toCheck = Arrays.binarySearch(integers, shouldBeFound);
- System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex));
-
- }
-}
\ No newline at end of file
diff --git a/SkylineProblem/SkylineProblem.java b/SkylineProblem/SkylineProblem.java
deleted file mode 100644
index a0b70631a527..000000000000
--- a/SkylineProblem/SkylineProblem.java
+++ /dev/null
@@ -1,131 +0,0 @@
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Scanner;
-
-public class SkylineProblem {
- Building[] building;
- int count;
-
- public void run() {
- Scanner sc = new Scanner(System.in);
-
- int num = sc.nextInt();
- this.building = new Building[num];
-
- for(int i = 0; i < num; i++) {
- String input = sc.next();
- String[] data = input.split(",");
- this.add(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2]));
- }
- this.print(this.findSkyline(0, num - 1));
-
- sc.close();
- }
-
- public void add(int left, int height, int right) {
- building[count++] = new Building(left, height, right);
- }
-
- public void print(ArrayList skyline) {
- Iterator it = skyline.iterator();
-
- while(it.hasNext()) {
- Skyline temp = it.next();
- System.out.print(temp.coordinates + "," + temp.height);
- if(it.hasNext()) {
- System.out.print(",");
- }
- }
-
- }
-
- public ArrayList findSkyline(int start, int end) {
- if(start == end) {
- ArrayList list = new ArrayList<>();
- list.add(new Skyline(building[start].left, building[start].height));
- list.add(new Skyline(building[end].right, 0));
-
- return list;
- }
-
- int mid = (start + end) / 2;
-
- ArrayList sky1 = this.findSkyline(start, mid);
- ArrayList sky2 = this.findSkyline(mid + 1, end);
-
- return this.mergeSkyline(sky1, sky2);
- }
-
- public ArrayList mergeSkyline(ArrayList sky1, ArrayList sky2) {
- int currentH1 = 0, currentH2 = 0;
- ArrayList skyline = new ArrayList<>();
- int maxH = 0;
-
- while(!sky1.isEmpty() && !sky2.isEmpty()) {
- if(sky1.get(0).coordinates < sky2.get(0).coordinates) {
- int currentX = sky1.get(0).coordinates;
- currentH1 = sky1.get(0).height;
-
- if(currentH1 < currentH2) {
- sky1.remove(0);
- if(maxH != currentH2) skyline.add(new Skyline(currentX, currentH2));
- } else {
- maxH = currentH1;
- sky1.remove(0);
- skyline.add(new Skyline(currentX, currentH1));
- }
- } else {
- int currentX = sky2.get(0).coordinates;
- currentH2 = sky2.get(0).height;
-
- if(currentH2 < currentH1) {
- sky2.remove(0);
- if(maxH != currentH1) skyline.add(new Skyline(currentX, currentH1));
- } else {
- maxH = currentH2;
- sky2.remove(0);
- skyline.add(new Skyline(currentX, currentH2));
- }
- }
- }
-
- while(!sky1.isEmpty()) {
- skyline.add(sky1.get(0));
- sky1.remove(0);
- }
-
- while(!sky2.isEmpty()) {
- skyline.add(sky2.get(0));
- sky2.remove(0);
- }
-
- return skyline;
- }
-
- public class Skyline {
- public int coordinates;
- public int height;
-
- public Skyline(int coordinates, int height) {
- this.coordinates = coordinates;
- this.height = height;
- }
- }
-
- public class Building {
- public int left;
- public int height;
- public int right;
-
- public Building(int left, int height, int right) {
- this.left = left;
- this.height = height;
- this.right = right;
- }
- }
-
- public static void main(String[] args) {
- SkylineProblem skylineProblem = new SkylineProblem();
- skylineProblem.run();
- }
-}
diff --git a/Sorts/src/sort/BinaryTreeSort.java b/Sorts/src/sort/BinaryTreeSort.java
deleted file mode 100644
index 59d58ab61987..000000000000
--- a/Sorts/src/sort/BinaryTreeSort.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package sort;
-
-import static sort.SortUtils.less;
-import static sort.SortUtils.print;
-
-/**
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- * @see SortAlgorithm
- *
- */
-public class BinaryTreeSort implements SortAlgorithm {
-
- interface TreeVisitor> {
- void visit(Node node);
- }
-
- private static class SortVisitor> implements TreeVisitor {
-
- private final T[] array;
- private int counter;
-
- SortVisitor(T[] array) {
- this.array = array;
- }
-
- @Override
- public void visit(Node node) {
- array[counter++] = node.value;
- }
- }
-
- private static class Node>{
- private T value;
- private Node left;
- private Node right;
-
- Node(T value) {
- this.value = value;
- }
-
- void insert(Node node) {
- if (less(node.value, value)){
- if (left != null) left.insert(node);
- else left = node;
- }
- else {
- if (right != null) right.insert(node);
- else right = node;
- }
- }
-
- void traverse(TreeVisitor visitor) {
- if ( left != null)
- left.traverse(visitor);
-
- visitor.visit(this);
-
- if ( right != null )
- right.traverse(visitor );
- }
-
- }
-
-
- @Override
- public > T[] sort(T[] array) {
-
- Node root = new Node<>(array[0]);
- for (int i = 1; i < array.length; i++) {
- root.insert(new Node<>(array[i]));
- }
-
- root.traverse(new SortVisitor<>(array));
-
- return array;
- }
-
-
- public static void main(String args[]) {
-
- Integer[] intArray = {12, 40, 9, 3, 19, 74, 7, 31, 23, 54, 26, 81, 12};
- BinaryTreeSort treeSort = new BinaryTreeSort();
- Integer[] sorted = treeSort.sort(intArray);
- print(sorted);
-
- Double[] decimalArray = {8.2, 1.5, 3.14159265, 9.3, 5.1, 4.8, 2.6};
- print(treeSort.sort(decimalArray));
-
- String[] stringArray = {"c", "a", "e", "b","d", "dd","da","zz", "AA", "aa","aB","Hb", "Z"};
- print(treeSort.sort(stringArray));
- }
-
-}
-
diff --git a/Sorts/src/sort/BogoSort.java b/Sorts/src/sort/BogoSort.java
deleted file mode 100644
index 1079ca21c27a..000000000000
--- a/Sorts/src/sort/BogoSort.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package sort;
-
-import java.util.Random;
-
-import static sort.SortUtils.*;
-
-
-/**
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- * @see SortAlgorithm
- *
- */
-public class BogoSort implements SortAlgorithm {
-
- private static final Random random = new Random();
-
-
- private static > boolean isSorted(T array[]){
- for(int i = 0; i void nextPermutation(T array[]){
- int length = array.length;
-
- for (int i = 0; i < array.length; i++) {
- int randomIndex = i + random.nextInt(length - i);
- swap(array, randomIndex, i);
- }
- }
-
- public > T[] sort(T array[]) {
- while(!isSorted(array)){
- nextPermutation(array);
- }
- return array;
- }
-
- // Driver Program
- public static void main(String[] args) {
- // Integer Input
- Integer[] integers = {4, 23, 6, 78, 1, 54, 231, 9, 12};
-
- BogoSort bogoSort = new BogoSort();
-
- // print a sorted array
- print(bogoSort.sort(integers));
-
- // String Input
- String[] strings = {"c", "a", "e", "b","d"};
-
- print(bogoSort.sort(strings));
- }
-}
diff --git a/Sorts/src/sort/BubbleSort.java b/Sorts/src/sort/BubbleSort.java
deleted file mode 100644
index 1173245fcabf..000000000000
--- a/Sorts/src/sort/BubbleSort.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-/**
- *
- * @author Varun Upadhyay (https://github.com/varunu28)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- * @see SortAlgorithm
- */
-
-class BubbleSort implements SortAlgorithm {
- /**
- * This method implements the Generic Bubble Sort
- *
- * @param array The array to be sorted
- * Sorts the array in increasing order
- **/
-
- @Override
- public > T[] sort(T array[]) {
- int last = array.length;
- //Sorting
- boolean swap;
- do {
- swap = false;
- for (int count = 0; count < last-1; count++) {
- if (less(array[count], array[count + 1])) {
- swap = swap(array, count, count + 1);
- }
- }
- last--;
- } while (swap);
- return array;
- }
-
- // Driver Program
- public static void main(String[] args) {
-
- // Integer Input
- Integer[] integers = {4, 23, 6, 78, 1, 54, 231, 9, 12};
- BubbleSort bubbleSort = new BubbleSort();
- bubbleSort.sort(integers);
-
- // Output => 231, 78, 54, 23, 12, 9, 6, 4, 1
- print(integers);
-
- // String Input
- String[] strings = {"c", "a", "e", "b","d"};
- //Output => e, d, c, b, a
- print(bubbleSort.sort(strings));
-
- }
-}
diff --git a/Sorts/src/sort/CocktailShakerSort.java b/Sorts/src/sort/CocktailShakerSort.java
deleted file mode 100644
index 7982b8fcfcae..000000000000
--- a/Sorts/src/sort/CocktailShakerSort.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-/**
- *
- * @author Mateus Bizzo (https://github.com/MattBizzo)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- */
-
-class CocktailShakerSort implements SortAlgorithm {
-
- /**
- * This method implements the Generic Cocktail Shaker Sort
- *
- * @param array The array to be sorted
- * Sorts the array in increasing order
- **/
-
- @Override
- public > T[] sort(T[] array) {
-
- int length = array.length;
- int left = 0;
- int right = length - 1;
- int swappedLeft, swappedRight;
- while (left < right) {
- // front
- swappedRight = 0;
- for (int i = left; i < right; i++) {
- if (less(array[i + 1], array[i])) {
- swap(array, i, i + 1);
- swappedRight = i;
- }
- }
- // back
- right = swappedRight;
- swappedLeft = length - 1;
- for (int j = right; j > left; j--) {
- if (less(array[j], array[j - 1])) {
- swap(array, j - 1, j);
- swappedLeft = j;
- }
- }
- left = swappedLeft;
- }
- return array;
-
- }
-
- // Driver Program
- public static void main(String[] args) {
- // Integer Input
- Integer[] integers = { 4, 23, 6, 78, 1, 54, 231, 9, 12 };
- CocktailShakerSort shakerSort = new CocktailShakerSort();
-
- // Output => 1 4 6 9 12 23 54 78 231
- print(shakerSort.sort(integers));
-
- // String Input
- String[] strings = { "c", "a", "e", "b", "d" };
- print(shakerSort.sort(strings));
- }
-
-
-}
diff --git a/Sorts/src/sort/CombSort.java b/Sorts/src/sort/CombSort.java
deleted file mode 100644
index 492605ca56e7..000000000000
--- a/Sorts/src/sort/CombSort.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-
-/**
- *
- * Comb Sort algorithm implementation
- *
- * Best-case performance O(n * log(n))
- * Worst-case performance O(n ^ 2)
- * Worst-case space complexity O(1)
- *
- * Comb sort improves on bubble sort.
- *
- *
- * @see BubbleSort
- * @see SortAlgorithm
- *
- * @author Sandeep Roy (https://github.com/sandeeproy99)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- */
-class CombSort implements SortAlgorithm {
-
- // To find gap between elements
- private int nextGap(int gap) {
- // Shrink gap by Shrink factor
- gap = ( gap * 10 ) / 13;
- return ( gap < 1 ) ? 1 : gap;
- }
-
- /**
- * Function to sort arr[] using Comb
- * @param arr - an array should be sorted
- * @return sorted array
- */
- @Override
- public > T[] sort(T arr[]) {
- int size = arr.length;
-
- // initialize gap
- int gap = size;
-
- // Initialize swapped as true to make sure that loop runs
- boolean swapped = true;
-
- // Keep running while gap is more than 1 and last iteration caused a swap
- while (gap != 1 || swapped) {
- // Find next gap
- gap = nextGap(gap);
-
- // Initialize swapped as false so that we can check if swap happened or not
- swapped = false;
-
- // Compare all elements with current gap
- for (int i = 0; i < size - gap ; i++) {
- if (less(arr[i + gap], arr[i])) {
- // Swap arr[i] and arr[i+gap]
- swapped = swap(arr, i, i + gap);
- }
- }
- }
- return arr;
- }
-
- // Driver method
- public static void main(String args[]) {
- CombSort ob = new CombSort();
- Integer arr[] = {8, 4, 1, 56, 3, -44, -1 , 0 , 36, 34, 8, 12 , -66, - 78, 23, -6, 28, 0};
- ob.sort(arr);
-
- System.out.println("sorted array");
- print(arr);
- }
-}
diff --git a/Sorts/src/sort/CountingSort.java b/Sorts/src/sort/CountingSort.java
deleted file mode 100644
index 39442a00fbb8..000000000000
--- a/Sorts/src/sort/CountingSort.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package sort;
-
-import java.util.*;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toMap;
-import static sort.SortUtils.print;
-
-/**
- *
- * @author Youssef Ali (https://github.com/youssefAli11997)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- */
-class CountingSort implements SortAlgorithm {
-
-
-
- @Override
- public > T[] sort(T[] unsorted) {
- return sort(Arrays.asList(unsorted)).toArray(unsorted);
- }
-
- /**
- * This method implements the Generic Counting Sort
- *
- * @param list The list to be sorted
- *
- * Sorts the list in increasing order
- * The method uses list elements as keys in the frequency map
- **/
- @Override
- public > List sort(List list) {
-
- Map frequency = new TreeMap<>();
- // The final output array
- List sortedArray = new ArrayList<>(list.size());
-
- // Counting the frequency of @param array elements
- list.forEach(v -> frequency.put(v, frequency.getOrDefault(v, 0) + 1));
-
- // Filling the sortedArray
- for(Map.Entry element : frequency.entrySet()) {
- for(int j=0; j> List streamSort(List list) {
- return list.stream()
- .collect(toMap(k -> k, v -> 1, (v1, v2) -> v1 + v2, TreeMap::new))
- .entrySet()
- .stream()
- .flatMap(entry -> IntStream.rangeClosed(1, entry.getValue()).mapToObj(t -> entry.getKey()))
- .collect(toList());
- }
-
- // Driver Program
- public static void main(String[] args) {
- // Integer Input
- List unsortedInts = Stream.of(4, 23, 6, 78, 1, 54, 23, 1, 9, 231, 9, 12).collect(toList());
- CountingSort countingSort = new CountingSort();
-
- System.out.println("Before Sorting:");
- print(unsortedInts);
-
- // Output => 1 1 4 6 9 9 12 23 23 54 78 231
- System.out.println("After Sorting:");
- print(countingSort.sort(unsortedInts));
- System.out.println("After Sorting By Streams:");
- print(streamSort(unsortedInts));
-
- System.out.println("\n------------------------------\n");
-
- // String Input
- List unsortedStrings = Stream.of("c", "a", "e", "b","d", "a", "f", "g", "c").collect(toList());
-
- System.out.println("Before Sorting:");
- print(unsortedStrings);
-
- //Output => a a b c c d e f g
- System.out.println("After Sorting:");
- print(countingSort.sort(unsortedStrings));
-
- System.out.println("After Sorting By Streams:");
- print(streamSort(unsortedStrings));
-
- }
-}
diff --git a/Sorts/src/sort/CycleSort.java b/Sorts/src/sort/CycleSort.java
deleted file mode 100644
index ea4f05535c7a..000000000000
--- a/Sorts/src/sort/CycleSort.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package sort;
-
-import static sort.SortUtils.less;
-import static sort.SortUtils.print;
-
-/**
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- */
-class CycleSort implements SortAlgorithm {
-
-
- @Override
- public > T[] sort(T[] arr) {
- int n = arr.length;
-
- // traverse array elements
- for (int j = 0; j <= n - 2; j++) {
- // initialize item as starting point
- T item = arr[j];
-
- // Find position where we put the item.
- int pos = j;
- for (int i = j + 1; i < n; i++)
- if (less(arr[i], item)) pos++;
-
- // If item is already in correct position
- if (pos == j) continue;
-
- // ignore all duplicate elements
- while (item.compareTo(arr[pos]) == 0)
- pos += 1;
-
- // put the item to it's right position
- if (pos != j) {
- item = replace(arr, pos, item);
- }
-
- // Rotate rest of the cycle
- while (pos != j) {
- pos = j;
-
- // Find position where we put the element
- for (int i = j + 1; i < n; i++)
- if (less(arr[i], item)){
- pos += 1;
- }
-
-
- // ignore all duplicate elements
- while (item.compareTo(arr[pos]) == 0)
- pos += 1;
-
- // put the item to it's right position
- if (item != arr[pos]) {
- item = replace(arr, pos, item);
- }
- }
- }
-
- return arr;
- }
-
- private > T replace(T[] arr, int pos, T item){
- T temp = item;
- item = arr[pos];
- arr[pos] = temp;
- return item;
- }
-
-
-
- public static void main(String[] args) {
- Integer arr[] = { 4, 23, 6, 78, 1, 26, 11, 23 , 0, -6, 3, 54, 231, 9, 12 };
- CycleSort cycleSort = new CycleSort();
- cycleSort.sort(arr);
-
- System.out.println("After sort : ");
- print(arr);
- }
-
-}
diff --git a/Sorts/src/sort/GnomeSort.java b/Sorts/src/sort/GnomeSort.java
deleted file mode 100644
index 14af67c65bb6..000000000000
--- a/Sorts/src/sort/GnomeSort.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-/**
- * Implementation of gnome sort
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- * @since 2018-04-10
- *
- **/
-public class GnomeSort implements SortAlgorithm{
-
- @Override
- public > T[] sort(T[] arr) {
- int i = 1;
- int j = 2;
- while (i < arr.length){
- if ( less(arr[i - 1], arr[i]) ) i = j++;
- else {
- swap(arr, i - 1, i);
- if (--i == 0){ i = j++; }
- }
- }
-
- return null;
- }
-
- public static void main(String[] args) {
- Integer[] integers = { 4, 23, 6, 78, 1, 26, 11, 23 , 0, -6, 3, 54, 231, 9, 12 };
- String[] strings = {"c", "a", "e", "b","d", "dd","da","zz", "AA", "aa","aB","Hb", "Z"};
- GnomeSort gnomeSort = new GnomeSort();
-
- gnomeSort.sort(integers);
- gnomeSort.sort(strings);
-
- System.out.println("After sort : ");
- print(integers);
- print(strings);
-
-
- }
-
-}
diff --git a/Sorts/src/sort/HeapSort.java b/Sorts/src/sort/HeapSort.java
deleted file mode 100644
index 6fab3747fd2f..000000000000
--- a/Sorts/src/sort/HeapSort.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package sort;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static sort.SortUtils.*;
-
-/**
- * Heap Sort Algorithm
- * Implements MinHeap
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- */
-public class HeapSort implements SortAlgorithm {
-
-
- private static class Heap> {
- /** Array to store heap */
- private T[] heap;
-
- /**
- * Constructor
- *
- * @param heap array of unordered integers
- */
- public Heap(T[] heap) {
- this.heap = heap;
- }
-
- /**
- * Heapifies subtree from top as root to last as last child
- *
- * @param rootIndex index of root
- * @param lastChild index of last child
- */
- private void heapSubtree(int rootIndex, int lastChild) {
- int leftIndex = rootIndex * 2 + 1;
- int rightIndex = rootIndex * 2 + 2;
- T root = heap[rootIndex];
- if (rightIndex <= lastChild) { // if has right and left children
- T left = heap[leftIndex];
- T right = heap[rightIndex];
- if (less(left, right) && less(left, root)) {
- swap(heap, leftIndex, rootIndex);
- heapSubtree(leftIndex, lastChild);
- } else if (less(right, root)) {
- swap(heap, rightIndex, rootIndex);
- heapSubtree(rightIndex, lastChild);
- }
- } else if (leftIndex <= lastChild) { // if no right child, but has left child
- T left = heap[leftIndex];
- if (less(left, root)) {
- swap(heap, leftIndex, rootIndex);
- heapSubtree(leftIndex, lastChild);
- }
- }
- }
-
-
- /**
- * Makes heap with root as root
- *
- * @param root index of root of heap
- */
- private void makeMinHeap(int root) {
- int leftIndex = root * 2 + 1;
- int rightIndex = root * 2 + 2;
- boolean hasLeftChild = leftIndex < heap.length;
- boolean hasRightChild = rightIndex < heap.length;
- if (hasRightChild) { //if has left and right
- makeMinHeap(leftIndex);
- makeMinHeap(rightIndex);
- heapSubtree(root, heap.length - 1);
- } else if (hasLeftChild) {
- heapSubtree(root, heap.length - 1);
- }
- }
-
- /**
- * Gets the root of heap
- *
- * @return root of heap
- */
- private T getRoot(int size) {
- swap(heap, 0, size);
- heapSubtree(0, size - 1);
- return heap[size]; // return old root
- }
-
-
-
-
-
- }
-
- @Override
- public > T[] sort(T[] unsorted) {
- return sort(Arrays.asList(unsorted)).toArray(unsorted);
- }
-
- @Override
- public > List sort(List unsorted) {
- int size = unsorted.size();
-
- @SuppressWarnings("unchecked")
- Heap heap = new Heap<>(unsorted.toArray((T[]) new Comparable[unsorted.size()]));
-
- heap.makeMinHeap(0); // make min heap using index 0 as root.
- List sorted = new ArrayList<>(size);
- while (size > 0) {
- T min = heap.getRoot(--size);
- sorted.add(min);
- }
-
- return sorted;
- }
-
- /**
- * Main method
- *
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- Integer[] heap = {4, 23, 6, 78, 1, 54, 231, 9, 12};
- HeapSort heapSort = new HeapSort();
- print(heapSort.sort(heap));
- }
-
-}
diff --git a/Sorts/src/sort/InsertionSort.java b/Sorts/src/sort/InsertionSort.java
deleted file mode 100644
index 593614304c5b..000000000000
--- a/Sorts/src/sort/InsertionSort.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package sort;
-
-import static sort.SortUtils.less;
-import static sort.SortUtils.print;
-
-/**
- *
- * @author Varun Upadhyay (https://github.com/varunu28)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- */
-
-class InsertionSort implements SortAlgorithm {
-
- /**
- * This method implements the Generic Insertion Sort
- * Sorts the array in increasing order
- *
- * @param array The array to be sorted
- *
- **/
-
- @Override
- public > T[] sort(T[] array) {
- for (int j = 1; j < array.length; j++) {
-
- // Picking up the key(Card)
- T key = array[j];
- int i = j - 1;
-
- while (i >= 0 && less(key, array[i])) {
- array[i + 1] = array[i];
- i--;
- }
- // Placing the key (Card) at its correct position in the sorted subarray
- array[i + 1] = key;
- }
- return array;
- }
-
- // Driver Program
- public static void main(String[] args) {
- // Integer Input
- Integer[] integers = {4, 23, 6, 78, 1, 54, 231, 9, 12};
-
- InsertionSort sort = new InsertionSort();
-
- sort.sort(integers);
-
- // Output => 1 4 6 9 12 23 54 78 231
- print(integers);
-
- // String Input
- String[] strings = {"c", "a", "e", "b","d"};
-
- sort.sort(strings);
-
- //Output => a b c d e
- print(strings);
- }
-}
diff --git a/Sorts/src/sort/MergeSort.java b/Sorts/src/sort/MergeSort.java
deleted file mode 100644
index 2c7a141bdc32..000000000000
--- a/Sorts/src/sort/MergeSort.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package sort;
-
-import static sort.SortUtils.print;
-
-/**
- * This method implements the Generic Merge Sort
- *
- *
- * @author Varun Upadhyay (https://github.com/varunu28)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- *
- * @see SortAlgorithm
- *
- */
-
-class MergeSort implements SortAlgorithm {
-
-
- /**
- * This method implements the Generic Merge Sort
- * @param unsorted the array which should be sorted
- * @param Comparable class
- * @return sorted array
- */
- @Override
- @SuppressWarnings("unchecked")
- public > T[] sort(T[] unsorted) {
- T[] tmp = (T[]) new Comparable[unsorted.length];
- doSort(unsorted, tmp, 0, unsorted.length - 1);
- return unsorted;
- }
-
- /**
- *
- * @param arr The array to be sorted
- * @param temp The copy of the actual array
- * @param left The first index of the array
- * @param right The last index of the array
- * Recursively sorts the array in increasing order
- **/
- private static > void doSort(T[] arr, T[] temp, int left, int right) {
- if (left < right) {
- int mid = left + (right - left) / 2;
- doSort(arr, temp, left, mid);
- doSort(arr, temp,mid + 1, right);
- merge(arr, temp, left, mid, right);
- }
-
- }
-
- /**
- * This method implements the merge step of the merge sort
- *
- * @param arr The array to be sorted
- * @param temp The copy of the actual array
- * @param left The first index of the array
- * @param mid The middle index of the array
- * @param right The last index of the array
- * merges two parts of an array in increasing order
- **/
-
- private static > void merge(T[] arr, T[] temp, int left, int mid, int right) {
- System.arraycopy(arr, left, temp, left, right - left + 1);
-
-
- int i= left;
- int j = mid + 1;
- int k = left;
-
- while (i <= mid && j <= right) {
- if (temp[i].compareTo(temp[j]) <= 0) {
- arr[k] = temp[i];
- i++;
- }
- else {
- arr[k] = temp[j];
- j++;
- }
- k++;
- }
-
- while (i <= mid) {
- arr[k] = temp[i];
- i++;
- k++;
- }
-
- while (j <= right) {
- arr[k] = temp[j];
- j++;
- k++;
- }
- }
-
- // Driver program
- public static void main(String[] args) {
-
- // Integer Input
- Integer[] arr = {4, 23, 6, 78, 1, 54, 231, 9, 12};
- MergeSort mergeSort = new MergeSort();
- mergeSort.sort(arr);
-
- // Output => 1 4 6 9 12 23 54 78 231
- print(arr);
-
- // String Inpu
- String[] stringArray = {"c", "a", "e", "b","d"};
- mergeSort.sort(stringArray);
- //Output => a b c d e
- print(stringArray);
- }
-}
diff --git a/Sorts/src/sort/PancakeSort.java b/Sorts/src/sort/PancakeSort.java
deleted file mode 100644
index 902db4b39cb8..000000000000
--- a/Sorts/src/sort/PancakeSort.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-/**
- * Implementation of gnome sort
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- * @since 2018-04-10
- *
- **/
-public class PancakeSort implements SortAlgorithm {
-
-
- @Override
- public > T[] sort(T[] array){
- int size = array.length;
-
- for (int i = 0; i < size; i++) {
- T max = array[0];
- int index = 0;
- for (int j = 0; j < size - i; j++) {
- if ( less(max, array[j]) ) {
- max = array[j];
- index = j;
- }
- }
- flip(array, index, array.length - 1 - i);
- }
- return array;
- }
-
-
- public static void main(String[] args) {
-
- Integer[] arr = {10, 9, 8, 7, 6, 15, 14, 7, 4, 3, 8, 6, 3, 1 ,2, -2, -5, -8, -3, -1, 13, 12, 11, 5, 4, 3, 2, 1};
- PancakeSort pancakeSort = new PancakeSort();
- System.out.println("After sorting:");
- pancakeSort.sort(arr);
- print(arr);
- }
-
-
-
-
-
-}
diff --git a/Sorts/src/sort/QuickSort.java b/Sorts/src/sort/QuickSort.java
deleted file mode 100644
index 4159fc829881..000000000000
--- a/Sorts/src/sort/QuickSort.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-/**
- *
- * @author Varun Upadhyay (https://github.com/varunu28)
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- *
- * @see SortAlgorithm
- *
- */
-class QuickSort implements SortAlgorithm {
-
-
-
- /**
- * This method implements the Generic Quick Sort
- *
- * @param array The array to be sorted
- * Sorts the array in increasing order
- **/
-
- @Override
- public > T[] sort(T[] array) {
- doSort(array, 0, array.length - 1);
- return array;
- }
-
-
- /**
- * The sorting process
- *
- * @param left The first index of an array
- * @param right The last index of an array
- * @param array The array to be sorted
- *
- **/
-
- private static > void doSort(T[] array, int left, int right) {
- if (left < right) {
- int pivot = partition(array, left, right);
- doSort(array, left, pivot - 1);
- doSort(array, pivot , right);
- }
- }
-
- /**
- * This method finds the partition index for an array
- *
- * @param array The array to be sorted
- * @param left The first index of an array
- * @param right The last index of an array
- * Finds the partition index of an array
- **/
-
- private static > int partition(T[] array, int left, int right) {
- int mid = (left + right) / 2;
- T pivot = array[mid];
-
- while(left <= right) {
- while(less(array[left], pivot)){
- ++left;
- }
- while(less(pivot, array[right])) {
- --right;
- }
- if(left <= right) {
- swap(array, left, right);
- ++left;
- --right;
- }
- }
- return left;
- }
-
- // Driver Program
- public static void main(String[] args) {
-
- // For integer input
- Integer[] array = {3, 4, 1, 32, 0, 1, 5, 12 ,2, 5 ,7 ,8 ,9, 2, 44, 111, 5};
-
- QuickSort quickSort = new QuickSort();
- // quickSort.sort(array);
-
- //Output => 0 1 1 2 2 3 4 5 5 5 7 8 9 12 32 44 111
- print(array);
-
- String[] stringArray = {"c", "a", "e", "b", "d"};
- quickSort.sort(stringArray);
-
- //Output => a b c d e
- print(stringArray);
- }
-}
-
diff --git a/Sorts/src/sort/RadixSort.java b/Sorts/src/sort/RadixSort.java
deleted file mode 100644
index 0d1e6966101a..000000000000
--- a/Sorts/src/sort/RadixSort.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package sort;
-
-import java.util.Arrays;
-
-class RadixSort {
-
-
- private static int getMax(int arr[], int n) {
- int mx = arr[0];
- for (int i = 1; i < n; i++)
- if (arr[i] > mx)
- mx = arr[i];
- return mx;
- }
-
- private static void countSort(int arr[], int n, int exp)
- {
- int output[] = new int[n];
- int i;
- int count[] = new int[10];
- Arrays.fill(count,0);
-
- for (i = 0; i < n; i++)
- count[ (arr[i]/exp)%10 ]++;
-
- for (i = 1; i < 10; i++)
- count[i] += count[i - 1];
-
- for (i = n - 1; i >= 0; i--)
- {
- output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
- count[ (arr[i]/exp)%10 ]--;
- }
-
- for (i = 0; i < n; i++)
- arr[i] = output[i];
- }
-
- private static void radixsort(int arr[], int n) {
-
- int m = getMax(arr, n);
-
-
- for (int exp = 1; m/exp > 0; exp *= 10)
- countSort(arr, n, exp);
- }
-
-
- static void print(int arr[], int n)
- {
- for (int i=0; i> T[] sort(T[] arr) {
- int n = arr.length;
- for (int i = 0; i < n - 1; i++) {
- // Initial index of min
- int min = i;
-
- for (int j = i +1 ; j < n; j++) {
- if (less(arr[j], arr[min])) {
- min = j;
- }
- }
-
- // Swapping if index of min is changed
- if (min != i) {
- swap(arr, i , min);
- }
- }
-
- return arr;
- }
-
- // Driver Program
- public static void main(String[] args) {
-
- Integer[] arr = {4, 23, 6, 78, 1, 54, 231, 9, 12};
-
- SelectionSort selectionSort = new SelectionSort();
-
- Integer[] sorted = selectionSort.sort(arr);
-
- // Output => 1 4 6 9 12 23 54 78 231
- print(sorted);
-
- // String Input
- String[] strings = {"c", "a", "e", "b","d"};
- String[] sortedStrings = selectionSort.sort(strings);
-
- //Output => a b c d e
- print(sortedStrings);
- }
-}
diff --git a/Sorts/src/sort/ShellSort.java b/Sorts/src/sort/ShellSort.java
deleted file mode 100644
index bafd19b145d7..000000000000
--- a/Sorts/src/sort/ShellSort.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package sort;
-
-import static sort.SortUtils.*;
-
-
-/**
- * @author dpunosevac
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- * @see SortAlgorithm
- *
- */
-public class ShellSort implements SortAlgorithm {
-
- /**
- * This method implements Generic Shell Sort.
- * @param array The array to be sorted
- */
- @Override
- public > T[] sort(T[] array) {
- int N = array.length;
- int h = 1;
-
- while (h < N/3) {
- h = 3 * h + 1;
- }
-
- while (h >= 1) {
- for (int i = h; i < N; i++) {
- for (int j = i; j >= h && less(array[j], array[j-h]); j -= h) {
- swap(array, j, j - h);
- }
- }
-
- h /= 3;
- }
-
- return array;
- }
-
- public static void main(String[] args) {
- Integer[] toSort = {4, 23, 6, 78, 1, 54, 231, 9, 12};
-
- ShellSort sort = new ShellSort();
- Integer[] sorted = sort.sort(toSort);
-
- print(sorted);
-
- }
-}
diff --git a/Sorts/src/sort/SortUtils.java b/Sorts/src/sort/SortUtils.java
deleted file mode 100644
index 8766e9d0e4d7..000000000000
--- a/Sorts/src/sort/SortUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package sort;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * The class contains util methods
- *
- * @author Podshivalov Nikita (https://github.com/nikitap492)
- *
- **/
-final class SortUtils {
-
-
- /**
- * Helper method for swapping places in array
- * @param array The array which elements we want to swap
- * @param idx index of the first element
- * @param idy index of the second element
- */
- static boolean swap(T[] array, int idx, int idy){
- T swap = array[idx];
- array[idx] = array[idy];
- array[idy] = swap;
- return true;
- }
-
-
- /**
- * This method checks if first element is less then the other element
- * @param v first element
- * @param w second element
- * @return true if the first element is less then the second element
- */
- static > boolean less(T v, T w) {
- return v.compareTo(w) < 0;
- }
-
-
- /**
- * Just print list
- * @param toPrint - a list which should be printed
- */
- static void print(List> toPrint){
- toPrint.stream()
- .map(Object::toString)
- .map(str -> str + " ")
- .forEach(System.out::print);
-
- System.out.println();
- }
-
-
- /**
- * Prints an array
- * @param toPrint - the array which should be printed
- */
- static void print(Object[] toPrint){
- System.out.println(Arrays.toString(toPrint));
- }
-
-
-
- /**
- * Swaps all position from {@param left} to @{@param right} for {@param array}
- * @param array is an array
- * @param left is a left flip border of the array
- * @param right is a right flip border of the array
- */
- static > void flip(T[] array, int left, int right) {
- while (left <= right) {
- swap(array, left++ , right--);
- }
- }
-}
diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 000000000000..d78724455af7
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ciphers/AES.java b/ciphers/AES.java
deleted file mode 100644
index 75ae8db768c7..000000000000
--- a/ciphers/AES.java
+++ /dev/null
@@ -1,605 +0,0 @@
-package ciphers;
-
-import java.math.BigInteger;
-import java.util.Scanner;
-
-/**
- * This class is build to demonstrate the application of the AES-algorithm on a
- * single 128-Bit block of data.
- *
- * @see khalil2535
- */
-public class AES {
-
- /**
- * Precalculated values for x to the power of 2 in Rijndaels galois field. Used
- * as 'RCON' during the key expansion.
- */
- private static final int[] RCON = { 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
- 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91,
- 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74,
- 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4,
- 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d,
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
- 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61,
- 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
- 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97,
- 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25,
- 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
- 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
- 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33,
- 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d };
-
- /**
- * Rijndael S-box Substitution table used for encryption in the subBytes step,
- * as well as the key expansion.
- */
- private static final int[] SBOX = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE,
- 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72,
- 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04,
- 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C,
- 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20,
- 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33,
- 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC,
- 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E,
- 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE,
- 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4,
- 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA,
- 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5,
- 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69,
- 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42,
- 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 };
-
- /**
- * Inverse Rijndael S-box Substitution table used for decryption in the
- * subBytesDec step.
- */
- private static final int[] INVERSE_SBOX = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E,
- 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE,
- 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
- 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8,
- 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50,
- 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC,
- 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
- 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2,
- 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8,
- 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18,
- 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
- 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51,
- 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
- 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77,
- 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D };
-
- /**
- * Precalculated lookup table for galois field multiplication by 2 used in the
- * MixColums step during encryption.
- */
- private static final int[] MULT2 = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18,
- 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c,
- 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60,
- 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84,
- 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 0xa8,
- 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc,
- 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0,
- 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f,
- 0x0d, 0x03, 0x01, 0x07, 0x05, 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23,
- 0x21, 0x27, 0x25, 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47,
- 0x45, 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, 0x9b,
- 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, 0xbb, 0xb9, 0xbf,
- 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, 0xdb, 0xd9, 0xdf, 0xdd, 0xd3,
- 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7,
- 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5 };
-
- /**
- * Precalculated lookup table for galois field multiplication by 3 used in the
- * MixColums step during encryption.
- */
- private static final int[] MULT3 = { 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14,
- 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22,
- 0x21, 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, 0x50,
- 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, 0xc0, 0xc3, 0xc6,
- 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, 0xf0, 0xf3, 0xf6, 0xf5, 0xfc,
- 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa,
- 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88,
- 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85,
- 0x86, 0x8f, 0x8c, 0x89, 0x8a, 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf,
- 0xbc, 0xb9, 0xba, 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9,
- 0xea, 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, 0x5b,
- 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, 0x6b, 0x68, 0x6d,
- 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, 0x3b, 0x38, 0x3d, 0x3e, 0x37,
- 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01,
- 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a };
-
- /**
- * Precalculated lookup table for galois field multiplication by 9 used in the
- * MixColums step during decryption.
- */
- private static final int[] MULT9 = { 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c,
- 0x65, 0x7e, 0x77, 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee,
- 0xe7, 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0xab,
- 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, 0x76, 0x7f, 0x64,
- 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, 0xe6, 0xef, 0xf4, 0xfd, 0xc2,
- 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b,
- 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95,
- 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6,
- 0xbf, 0x80, 0x89, 0x92, 0x9b, 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10,
- 0x19, 0x02, 0x0b, 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9,
- 0xa0, 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, 0x9a,
- 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, 0x0a, 0x03, 0x18,
- 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, 0xa1, 0xa8, 0xb3, 0xba, 0x85,
- 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07,
- 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46 };
-
- /**
- * Precalculated lookup table for galois field multiplication by 11 used in the
- * MixColums step during decryption.
- */
- private static final int[] MULT11 = { 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74,
- 0x7f, 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2,
- 0xd9, 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, 0xcb,
- 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, 0xf6, 0xfd, 0xe0,
- 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, 0x46, 0x4d, 0x50, 0x5b, 0x6a,
- 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7,
- 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65,
- 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9,
- 0xb2, 0x83, 0x88, 0x95, 0x9e, 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33,
- 0x38, 0x25, 0x2e, 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee,
- 0xe5, 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, 0x01,
- 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, 0xb1, 0xba, 0xa7,
- 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, 0x7a, 0x71, 0x6c, 0x67, 0x56,
- 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0,
- 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3 };
-
- /**
- * Precalculated lookup table for galois field multiplication by 13 used in the
- * MixColums step during decryption.
- */
- private static final int[] MULT13 = { 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c,
- 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96,
- 0x9b, 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, 0x6b,
- 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, 0x6d, 0x60, 0x77,
- 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, 0xbd, 0xb0, 0xa7, 0xaa, 0x89,
- 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8,
- 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e,
- 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8,
- 0xa5, 0x86, 0x8b, 0x9c, 0x91, 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56,
- 0x5b, 0x4c, 0x41, 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27,
- 0x2a, 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, 0xb7,
- 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, 0x67, 0x6a, 0x7d,
- 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0x0c, 0x01, 0x16, 0x1b, 0x38,
- 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2,
- 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97 };
-
- /**
- * Precalculated lookup table for galois field multiplication by 14 used in the
- * MixColums step during decryption.
- */
- private static final int[] MULT14 = { 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48,
- 0x46, 0x54, 0x5a, 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4,
- 0xba, 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, 0x3b,
- 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, 0xad, 0xa3, 0xb1,
- 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, 0x4d, 0x43, 0x51, 0x5f, 0x75,
- 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52,
- 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6,
- 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d,
- 0x23, 0x09, 0x07, 0x15, 0x1b, 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9,
- 0xe7, 0xf5, 0xfb, 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce,
- 0xc0, 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, 0xec,
- 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, 0x0c, 0x02, 0x10,
- 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, 0x37, 0x39, 0x2b, 0x25, 0x0f,
- 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3,
- 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d };
-
- /**
- * Subroutine of the Rijndael key expansion.
- *
- * @param t
- * @param rconCounter
- * @return
- */
- public static BigInteger scheduleCore(BigInteger t, int rconCounter) {
- String rBytes = t.toString(16);
-
- // Add zero padding
- int rBytesLength = rBytes.length();
- while (rBytesLength < 8) {
- rBytes = "0" + rBytes;
- }
-
- // rotate the first 16 bits to the back
- String rotatingBytes = rBytes.substring(0, 2);
- String fixedBytes = rBytes.substring(2);
-
- rBytes = fixedBytes + rotatingBytes;
-
- // apply S-Box to all 8-Bit Substrings
- for (int i = 0; i < 4; i++) {
- String currentByteBits = rBytes.substring(i * 2, (i + 1) * 2);
-
- int currentByte = Integer.parseInt(currentByteBits, 16);
- currentByte = SBOX[currentByte];
-
- // add the current RCON value to the first byte
- if (i == 0) {
- currentByte = currentByte ^ RCON[rconCounter];
- }
-
- currentByteBits = Integer.toHexString(currentByte);
-
- // Add zero padding
- int currentByteBitsLength = currentByteBits.length();
- while (currentByteBitsLength < 2) {
- currentByteBits = '0' + currentByteBits;
- }
-
- // replace bytes in original string
- rBytes = rBytes.substring(0, i * 2) + currentByteBits + rBytes.substring((i + 1) * 2);
- }
-
- // t = new BigInteger(rBytes, 16);
- // return t;
- return new BigInteger(rBytes, 16);
- }
-
- /**
- *
- * Returns an array of 10 + 1 round keys that are calculated by using Rijndael
- * key schedule
- *
- * @param initialKey
- * @return array of 10 + 1 round keys
- */
- public static BigInteger[] keyExpansion(BigInteger initialKey) {
- BigInteger[] roundKeys = { initialKey, new BigInteger("0"), new BigInteger("0"), new BigInteger("0"),
- new BigInteger("0"), new BigInteger("0"), new BigInteger("0"), new BigInteger("0"), new BigInteger("0"),
- new BigInteger("0"), new BigInteger("0"), };
-
- // initialize rcon iteration
- int rconCounter = 1;
-
- for (int i = 1; i < 11; i++) {
-
- // get the previous 32 bits the key
- BigInteger t = roundKeys[i - 1].remainder(new BigInteger("100000000", 16));
-
- // split previous key into 8-bit segments
- BigInteger[] prevKey = { roundKeys[i - 1].remainder(new BigInteger("100000000", 16)),
- roundKeys[i - 1].remainder(new BigInteger("10000000000000000", 16))
- .divide(new BigInteger("100000000", 16)),
- roundKeys[i - 1].remainder(new BigInteger("1000000000000000000000000", 16))
- .divide(new BigInteger("10000000000000000", 16)),
- roundKeys[i - 1].divide(new BigInteger("1000000000000000000000000", 16)), };
-
- // run schedule core
- t = scheduleCore(t, rconCounter);
- rconCounter += 1;
-
- // Calculate partial round key
- BigInteger t0 = t.xor(prevKey[3]);
- BigInteger t1 = t0.xor(prevKey[2]);
- BigInteger t2 = t1.xor(prevKey[1]);
- BigInteger t3 = t2.xor(prevKey[0]);
-
- // Join round key segments
- t2 = t2.multiply(new BigInteger("100000000", 16));
- t1 = t1.multiply(new BigInteger("10000000000000000", 16));
- t0 = t0.multiply(new BigInteger("1000000000000000000000000", 16));
- roundKeys[i] = t0.add(t1).add(t2).add(t3);
-
- }
- return roundKeys;
- }
-
- /**
- * representation of the input 128-bit block as an array of 8-bit integers.
- *
- * @param block
- * of 128-bit integers
- * @return array of 8-bit integers
- */
- public static int[] splitBlockIntoCells(BigInteger block) {
-
- int[] cells = new int[16];
- String blockBits = block.toString(2);
-
- // Append leading 0 for full "128-bit" string
- int blockBitsLength = blockBits.length();
- while (blockBitsLength < 128) {
- blockBits = '0' + blockBits;
- }
-
- // split 128 to 8 bit cells
- for (int i = 0; i < cells.length; i++) {
- String cellBits = blockBits.substring(8 * i, 8 * (i + 1));
- cells[i] = Integer.parseInt(cellBits, 2);
- }
-
- return cells;
- }
-
- /**
- * Returns the 128-bit BigInteger representation of the input of an array of
- * 8-bit integers.
- *
- * @param cells
- * that we need to merge
- * @return block of merged cells
- */
- public static BigInteger mergeCellsIntoBlock(int[] cells) {
-
- String blockBits = "";
- for (int i = 0; i < 16; i++) {
- String cellBits = Integer.toBinaryString(cells[i]);
-
- // Append leading 0 for full "8-bit" strings
- int cellBitsLength = cellBits.length();
- while (cellBitsLength < 8) {
- cellBits = '0' + cellBits;
- }
-
- blockBits += cellBits;
- }
-
- return new BigInteger(blockBits, 2);
- }
-
- /**
- *
- * @param ciphertext
- * @param key
- * @return ciphertext XOR key
- */
- public static BigInteger addRoundKey(BigInteger ciphertext, BigInteger key) {
- return ciphertext.xor(key);
- }
-
- /**
- * substitutes 8-Bit long substrings of the input using the S-Box and returns
- * the result.
- *
- * @param ciphertext
- * @return subtraction Output
- */
- public static BigInteger subBytes(BigInteger ciphertext) {
-
- int[] cells = splitBlockIntoCells(ciphertext);
-
- for (int i = 0; i < 16; i++) {
- cells[i] = SBOX[cells[i]];
- }
-
- return mergeCellsIntoBlock(cells);
- }
-
- /**
- * substitutes 8-Bit long substrings of the input using the inverse S-Box for
- * decryption and returns the result.
- *
- * @param ciphertext
- * @return subtraction Output
- */
- public static BigInteger subBytesDec(BigInteger ciphertext) {
-
- int[] cells = splitBlockIntoCells(ciphertext);
-
- for (int i = 0; i < 16; i++) {
- cells[i] = INVERSE_SBOX[cells[i]];
- }
-
- return mergeCellsIntoBlock(cells);
- }
-
- /**
- * Cell permutation step. Shifts cells within the rows of the input and returns
- * the result.
- *
- * @param ciphertext
- */
- public static BigInteger shiftRows(BigInteger ciphertext) {
- int[] cells = splitBlockIntoCells(ciphertext);
- int[] output = new int[16];
-
- // do nothing in the first row
- output[0] = cells[0];
- output[4] = cells[4];
- output[8] = cells[8];
- output[12] = cells[12];
-
- // shift the second row backwards by one cell
- output[1] = cells[5];
- output[5] = cells[9];
- output[9] = cells[13];
- output[13] = cells[1];
-
- // shift the third row backwards by two cell
- output[2] = cells[10];
- output[6] = cells[14];
- output[10] = cells[2];
- output[14] = cells[6];
-
- // shift the forth row backwards by tree cell
- output[3] = cells[15];
- output[7] = cells[3];
- output[11] = cells[7];
- output[15] = cells[11];
-
- return mergeCellsIntoBlock(output);
- }
-
- /**
- * Cell permutation step for decryption . Shifts cells within the rows of the
- * input and returns the result.
- *
- * @param ciphertext
- */
- public static BigInteger shiftRowsDec(BigInteger ciphertext) {
- int[] cells = splitBlockIntoCells(ciphertext);
- int[] output = new int[16];
-
- // do nothing in the first row
- output[0] = cells[0];
- output[4] = cells[4];
- output[8] = cells[8];
- output[12] = cells[12];
-
- // shift the second row forwards by one cell
- output[1] = cells[13];
- output[5] = cells[1];
- output[9] = cells[5];
- output[13] = cells[9];
-
- // shift the third row forwards by two cell
- output[2] = cells[10];
- output[6] = cells[14];
- output[10] = cells[2];
- output[14] = cells[6];
-
- // shift the forth row forwards by tree cell
- output[3] = cells[7];
- output[7] = cells[11];
- output[11] = cells[15];
- output[15] = cells[3];
-
- return mergeCellsIntoBlock(output);
- }
-
- /**
- * Applies the Rijndael MixColumns to the input and returns the result.
- *
- * @param ciphertext
- */
- public static BigInteger mixColumns(BigInteger ciphertext) {
-
- int[] cells = splitBlockIntoCells(ciphertext);
- int[] outputCells = new int[16];
-
- for (int i = 0; i < 4; i++) {
- int[] row = { cells[i * 4], cells[i * 4 + 1], cells[i * 4 + 2], cells[i * 4 + 3] };
-
- outputCells[i * 4] = MULT2[row[0]] ^ MULT3[row[1]] ^ row[2] ^ row[3];
- outputCells[i * 4 + 1] = row[0] ^ MULT2[row[1]] ^ MULT3[row[2]] ^ row[3];
- outputCells[i * 4 + 2] = row[0] ^ row[1] ^ MULT2[row[2]] ^ MULT3[row[3]];
- outputCells[i * 4 + 3] = MULT3[row[0]] ^ row[1] ^ row[2] ^ MULT2[row[3]];
- }
- return mergeCellsIntoBlock(outputCells);
- }
-
- /**
- * Applies the inverse Rijndael MixColumns for decryption to the input and
- * returns the result.
- *
- * @param ciphertext
- */
- public static BigInteger mixColumnsDec(BigInteger ciphertext) {
-
- int[] cells = splitBlockIntoCells(ciphertext);
- int[] outputCells = new int[16];
-
- for (int i = 0; i < 4; i++) {
- int[] row = { cells[i * 4], cells[i * 4 + 1], cells[i * 4 + 2], cells[i * 4 + 3] };
-
- outputCells[i * 4] = MULT14[row[0]] ^ MULT11[row[1]] ^ MULT13[row[2]] ^ MULT9[row[3]];
- outputCells[i * 4 + 1] = MULT9[row[0]] ^ MULT14[row[1]] ^ MULT11[row[2]] ^ MULT13[row[3]];
- outputCells[i * 4 + 2] = MULT13[row[0]] ^ MULT9[row[1]] ^ MULT14[row[2]] ^ MULT11[row[3]];
- outputCells[i * 4 + 3] = MULT11[row[0]] ^ MULT13[row[1]] ^ MULT9[row[2]] ^ MULT14[row[3]];
- }
- return mergeCellsIntoBlock(outputCells);
- }
-
- /**
- * Encrypts the plaintext with the key and returns the result
- *
- * @param plainText
- * which we want to encrypt
- * @param key
- * the key for encrypt
- * @return EncryptedText
- */
- public static BigInteger encrypt(BigInteger plainText, BigInteger key) {
- BigInteger[] roundKeys = keyExpansion(key);
-
- // Initial round
- plainText = addRoundKey(plainText, roundKeys[0]);
-
- // Main rounds
- for (int i = 1; i < 10; i++) {
- plainText = subBytes(plainText);
- plainText = shiftRows(plainText);
- plainText = mixColumns(plainText);
- plainText = addRoundKey(plainText, roundKeys[i]);
- }
-
- // Final round
- plainText = subBytes(plainText);
- plainText = shiftRows(plainText);
- plainText = addRoundKey(plainText, roundKeys[10]);
-
- return plainText;
- }
-
- /**
- * Decrypts the ciphertext with the key and returns the result
- *
- * @param cipherText
- * The Encrypted text which we want to decrypt
- * @param key
- * @return decryptedText
- */
- public static BigInteger decrypt(BigInteger cipherText, BigInteger key) {
-
- BigInteger[] roundKeys = keyExpansion(key);
-
- // Invert final round
- cipherText = addRoundKey(cipherText, roundKeys[10]);
- cipherText = shiftRowsDec(cipherText);
- cipherText = subBytesDec(cipherText);
-
- // Invert main rounds
- for (int i = 9; i > 0; i--) {
- cipherText = addRoundKey(cipherText, roundKeys[i]);
- cipherText = mixColumnsDec(cipherText);
- cipherText = shiftRowsDec(cipherText);
- cipherText = subBytesDec(cipherText);
- }
-
- // Invert initial round
- cipherText = addRoundKey(cipherText, roundKeys[0]);
-
- return cipherText;
- }
-
- public static void main(String[] args) {
-
- try (Scanner input = new Scanner(System.in)) {
- System.out.println("Enter (e) letter for encrpyt or (d) letter for decrypt :");
- char choice = input.nextLine().charAt(0);
- String in;
- switch (choice) {
- case 'E':
- case 'e':
- System.out.println("Choose a plaintext block (128-Bit Integer in base 16):");
- in = input.nextLine();
- BigInteger plaintext = new BigInteger(in, 16);
- System.out.println("Choose a Key (128-Bit Integer in base 16):");
- in = input.nextLine();
- BigInteger encryptionKey = new BigInteger(in, 16);
- System.out.println("The encrypted message is: \n" + encrypt(plaintext, encryptionKey).toString(16));
- break;
- case 'D':
- case 'd':
- System.out.println("Enter your ciphertext block (128-Bit Integer in base 16):");
- in = input.nextLine();
- BigInteger ciphertext = new BigInteger(in, 16);
- System.out.println("Choose a Key (128-Bit Integer in base 16):");
- in = input.nextLine();
- BigInteger decryptionKey = new BigInteger(in, 16);
- System.out.println("The deciphered message is:\n" + decrypt(ciphertext, decryptionKey).toString(16));
- break;
- default:
- System.out.println("** End **");
- }
- }
-
- }
-}
diff --git a/ciphers/AESEncryption.java b/ciphers/AESEncryption.java
deleted file mode 100644
index 871bd52e2d14..000000000000
--- a/ciphers/AESEncryption.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package ciphers;
-
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.KeyGenerator;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.xml.bind.DatatypeConverter;
-
-/**
- * This example program shows how AES encryption and decryption can be done in
- * Java. Please note that secret key and encrypted text is unreadable binary and
- * hence in the following program we display it in hexadecimal format of the
- * underlying bytes.
- *
- */
-public class AESEncryption {
-
- /**
- * 1. Generate a plain text for encryption 2. Get a secret key (printed in
- * hexadecimal form). In actual use this must by encrypted and kept safe. The
- * same key is required for decryption.
- *
- */
- public static void main(String[] args) throws Exception {
- String plainText = "Hello World";
- SecretKey secKey = getSecretEncryptionKey();
- byte[] cipherText = encryptText(plainText, secKey);
- String decryptedText = decryptText(cipherText, secKey);
-
- System.out.println("Original Text:" + plainText);
- System.out.println("AES Key (Hex Form):" + bytesToHex(secKey.getEncoded()));
- System.out.println("Encrypted Text (Hex Form):" + bytesToHex(cipherText));
- System.out.println("Descrypted Text:" + decryptedText);
-
- }
-
- /**
- * gets the AES encryption key. In your actual programs, this should be safely
- * stored.
- *
- * @return secKey (Secret key that we encrypt using it)
- * @throws NoSuchAlgorithmException
- * (from KeyGenrator)
- *
- */
- public static SecretKey getSecretEncryptionKey() throws NoSuchAlgorithmException {
- KeyGenerator aesKeyGenerator = KeyGenerator.getInstance("AES");
- aesKeyGenerator.init(128); // The AES key size in number of bits
- SecretKey secKey = aesKeyGenerator.generateKey();
- return secKey;
- }
-
- /**
- * Encrypts plainText in AES using the secret key
- *
- * @param plainText
- * @param secKey
- * @return byteCipherText (The encrypted text)
- * @throws NoSuchPaddingException
- * (from Cipher)
- * @throws NoSuchAlgorithmException
- * (from Cipher)
- * @throws InvalidKeyException
- * (from Cipher)
- * @throws BadPaddingException
- * (from Cipher)
- * @throws IllegalBlockSizeException
- * (from Cipher)
- */
- public static byte[] encryptText(String plainText, SecretKey secKey) throws NoSuchAlgorithmException,
- NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
- // AES defaults to AES/ECB/PKCS5Padding in Java 7
- Cipher aesCipher = Cipher.getInstance("AES");
- aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
- byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
- return byteCipherText;
- }
-
- /**
- * Decrypts encrypted byte array using the key used for encryption.
- *
- * @param byteCipherText
- * @param secKey
- * @return plainText
- * @throws NoSuchPaddingException
- * @throws NoSuchAlgorithmException
- * @throws InvalidKeyException
- * @throws BadPaddingException
- * @throws IllegalBlockSizeException
- */
- public static String decryptText(byte[] byteCipherText, SecretKey secKey) throws NoSuchAlgorithmException,
- NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
- // AES defaults to AES/ECB/PKCS5Padding in Java 7
- Cipher aesCipher = Cipher.getInstance("AES");
- aesCipher.init(Cipher.DECRYPT_MODE, secKey);
- byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
- return new String(bytePlainText);
- }
-
- /**
- * Convert a binary byte array into readable hex form
- *
- * @param hash
- * (in binary)
- * @return hexHash
- */
- private static String bytesToHex(byte[] hash) {
- return DatatypeConverter.printHexBinary(hash);
- }
-}
diff --git a/ciphers/Caesar.java b/ciphers/Caesar.java
deleted file mode 100644
index 77cd5b9ebcf6..000000000000
--- a/ciphers/Caesar.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package ciphers;
-
-import java.util.Scanner;
-
-/**
- *
- * A Java implementation of Caesar Cipher. /It is a type of substitution cipher
- * in which each letter in the plaintext is replaced by a letter some fixed
- * number of positions down the alphabet. /
- *
- * @author FAHRI YARDIMCI
- * @author khalil2535
- */
-public class Caesar {
-
- /**
- * Encrypt text by shifting every Latin char by add number shift for ASCII
- * Example : A + 1 -> B
- *
- * @param message
- * @param shift
- * @return Encrypted message
- */
- public static String encode(String message, int shift) {
- String encoded = "";
-
- while (shift >= 26) { // 26 = number of latin letters
- shift -= 26;
- }
-
- final int length = message.length();
- for (int i = 0; i < length; i++) {
-
-// int current = message.charAt(i); //using char to shift characters because ascii is in-order latin alphabet
- char current = message.charAt(i); // Java law : char + int = char
-
- if (IsCapitalLatinLetter(current)) {
-
- current += shift;
- encoded += (char) (current > 'Z' ? current - 26 : current); // 26 = number of latin letters
-
- } else if (IsSmallLatinLetter(current)) {
-
- current += shift;
- encoded += (char) (current > 'z' ? current - 26 : current); // 26 = number of latin letters
-
- } else {
- encoded += current;
- }
- }
- return encoded;
- }
-
- /**
- * Decrypt message by shifting back every Latin char to previous the ASCII
- * Example : B - 1 -> A
- *
- * @param encryptedMessage
- * @param shift
- * @return message
- */
- public static String decode(String encryptedMessage, int shift) {
- String decoded = "";
-
- while (shift >= 26) { // 26 = number of latin letters
- shift -= 26;
- }
-
- final int length = encryptedMessage.length();
- for (int i = 0; i < length; i++) {
- char current = encryptedMessage.charAt(i);
- if (IsCapitalLatinLetter(current)) {
-
- current -= shift;
- decoded += (char) (current < 'A' ? current + 26 : current);// 26 = number of latin letters
-
- } else if (IsSmallLatinLetter(current)) {
-
- current -= shift;
- decoded += (char) (current < 'a' ? current + 26 : current);// 26 = number of latin letters
-
- } else {
- decoded += current;
- }
- }
- return decoded;
- }
-
- /**
- *
- * @param c
- * @return true if character is capital Latin letter or false for others
- */
- private static boolean IsCapitalLatinLetter(char c) {
- return c >= 'A' && c <= 'Z';
- }
-
- /**
- *
- * @param c
- * @return true if character is small Latin letter or false for others
- */
- private static boolean IsSmallLatinLetter(char c) {
- return c >= 'a' && c <= 'z';
- }
-
- /**
- *
- * @deprecated TODO remove main and make JUnit Testing
- */
- public static void main(String[] args) {
- Scanner input = new Scanner(System.in);
- System.out.println("Please enter the message (Latin Alphabet)");
- String message = input.nextLine();
- System.out.println(message);
- System.out.println("Please enter the shift number");
- int shift = input.nextInt() % 26;
- System.out.println("(E)ncode or (D)ecode ?");
- char choice = input.next().charAt(0);
- switch (choice) {
- case 'E':
- case 'e':
- System.out.println("ENCODED MESSAGE IS \n" + encode(message, shift)); //send our function to handle
- break;
- case 'D':
- case 'd':
- System.out.println("DECODED MESSAGE IS \n" + decode(message, shift));
- }
- }
-
-}
diff --git a/ciphers/ColumnarTranspositionCipher.java b/ciphers/ColumnarTranspositionCipher.java
deleted file mode 100644
index 26acc628e393..000000000000
--- a/ciphers/ColumnarTranspositionCipher.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package ciphers;
-
-/**
- * Columnar Transposition Cipher Encryption and Decryption.
- *
- * @author freitzzz
- */
-public class ColumnarTranspositionCipher {
-
- private static String keyword;
- private static Object[][] table;
- private static String abecedarium;
- public static final String ABECEDARIUM = "abcdefghijklmnopqrstuvwxyzABCDEFG"
- + "HIJKLMNOPQRSTUVWXYZ0123456789,.;:-@";
- private static final String ENCRYPTION_FIELD = "≈";
- private static final char ENCRYPTION_FIELD_CHAR = '≈';
-
- /**
- * Encrypts a certain String with the Columnar Transposition Cipher Rule
- *
- * @param word Word being encrypted
- * @param keyword String with keyword being used
- * @return a String with the word encrypted by the Columnar Transposition
- * Cipher Rule
- */
- public static String encrpyter(String word, String keyword) {
- ColumnarTranspositionCipher.keyword = keyword;
- abecedariumBuilder(500);
- table = tableBuilder(word);
- Object[][] sortedTable = sortTable(table);
- String wordEncrypted = "";
- for (int i = 0; i < sortedTable[i].length; i++) {
- for (int j = 1; j < sortedTable.length; j++) {
- wordEncrypted += sortedTable[j][i];
- }
- }
- return wordEncrypted;
- }
-
- /**
- * Encrypts a certain String with the Columnar Transposition Cipher Rule
- *
- * @param word Word being encrypted
- * @param keyword String with keyword being used
- * @param abecedarium String with the abecedarium being used. null for
- * default one
- * @return a String with the word encrypted by the Columnar Transposition
- * Cipher Rule
- */
- public static String encrpyter(String word, String keyword,
- String abecedarium) {
- ColumnarTranspositionCipher.keyword = keyword;
- if (abecedarium != null) {
- ColumnarTranspositionCipher.abecedarium = abecedarium;
- } else {
- ColumnarTranspositionCipher.abecedarium = ABECEDARIUM;
- }
- table = tableBuilder(word);
- Object[][] sortedTable = sortTable(table);
- String wordEncrypted = "";
- for (int i = 0; i < sortedTable[0].length; i++) {
- for (int j = 1; j < sortedTable.length; j++) {
- wordEncrypted += sortedTable[j][i];
- }
- }
- return wordEncrypted;
- }
-
- /**
- * Decrypts a certain encrypted String with the Columnar Transposition
- * Cipher Rule
- *
- * @return a String decrypted with the word encrypted by the Columnar
- * Transposition Cipher Rule
- */
- public static String decrypter() {
- String wordDecrypted = "";
- for (int i = 1; i < table.length; i++) {
- for (Object item : table[i]) {
- wordDecrypted += item;
- }
- }
- return wordDecrypted.replaceAll(ENCRYPTION_FIELD, "");
- }
-
- /**
- * Builds a table with the word to be encrypted in rows by the Columnar
- * Transposition Cipher Rule
- *
- * @return An Object[][] with the word to be encrypted filled in rows and
- * columns
- */
- private static Object[][] tableBuilder(String word) {
- Object[][] table = new Object[numberOfRows(word) + 1][keyword.length()];
- char[] wordInChards = word.toCharArray();
- //Fils in the respective numbers
- table[0] = findElements();
- int charElement = 0;
- for (int i = 1; i < table.length; i++) {
- for (int j = 0; j < table[i].length; j++) {
- if (charElement < wordInChards.length) {
- table[i][j] = wordInChards[charElement];
- charElement++;
- } else {
- table[i][j] = ENCRYPTION_FIELD_CHAR;
- }
- }
- }
- return table;
- }
-
- /**
- * Determines the number of rows the table should have regarding the
- * Columnar Transposition Cipher Rule
- *
- * @return an int with the number of rows that the table should have in
- * order to respect the Columnar Transposition Cipher Rule.
- */
- private static int numberOfRows(String word) {
- if ((double) word.length() / keyword.length() > word.length() / keyword.length()) {
- return (word.length() / keyword.length()) + 1;
- } else {
- return word.length() / keyword.length();
- }
- }
-
- /**
- *
- * @return charValues
- */
- private static Object[] findElements() {
- Object[] charValues = new Object[keyword.length()];
- for (int i = 0; i < charValues.length; i++) {
- int charValueIndex = abecedarium.indexOf(keyword.charAt(i));
- charValues[i] = charValueIndex > -1 ? charValueIndex : null;
- }
- return charValues;
- }
-
- /**
- *
- * @param table
- * @return tableSorted
- */
- private static Object[][] sortTable(Object[][] table) {
- Object[][] tableSorted = new Object[table.length][table[0].length];
- for (int i = 0; i < tableSorted.length; i++) {
- System.arraycopy(table[i], 0, tableSorted[i], 0, tableSorted[i].length);
- }
- for (int i = 0; i < tableSorted[0].length; i++) {
- for (int j = i + 1; j < tableSorted[0].length; j++) {
- if ((int) tableSorted[0][i] > (int) table[0][j]) {
- Object[] column = getColumn(tableSorted, tableSorted.length, i);
- switchColumns(tableSorted, j, i, column);
- }
- }
- }
- return tableSorted;
- }
-
- /**
- *
- * @param table
- * @param rows
- * @param column
- * @return columnArray
- */
- private static Object[] getColumn(Object[][] table, int rows, int column) {
- Object[] columnArray = new Object[rows];
- for (int i = 0; i < rows; i++) {
- columnArray[i] = table[i][column];
- }
- return columnArray;
- }
-
- /**
- *
- * @param table
- * @param firstColumnIndex
- * @param secondColumnIndex
- * @param columnToSwitch
- */
- private static void switchColumns(Object[][] table, int firstColumnIndex,
- int secondColumnIndex, Object[] columnToSwitch) {
- for (int i = 0; i < table.length; i++) {
- table[i][secondColumnIndex] = table[i][firstColumnIndex];
- table[i][firstColumnIndex] = columnToSwitch[i];
- }
- }
-
- /**
- * Creates an abecedarium with a specified ascii inded
- *
- * @param value Number of characters being used based on the ASCII Table
- */
- private static void abecedariumBuilder(int value) {
- abecedarium = "";
- for (int i = 0; i < value; i++) {
- abecedarium += (char) i;
- }
- }
-
- private static void showTable() {
- for (Object[] table1 : table) {
- for (Object item : table1) {
- System.out.print(item + " ");
- }
- System.out.println();
- }
- }
-
- public static void main(String[] args) {
- String keywordForExample = "asd215";
- String wordBeingEncrypted = "This is a test of the Columnar Transposition Cipher";
- System.out.println("### Example of Columnar Transposition Cipher ###\n");
- System.out.println("Word being encryped ->>> " + wordBeingEncrypted);
- System.out.println("Word encrypted ->>> " + ColumnarTranspositionCipher
- .encrpyter(wordBeingEncrypted, keywordForExample));
- System.out.println("Word decryped ->>> " + ColumnarTranspositionCipher
- .decrypter());
- System.out.println("\n### Encrypted Table ###");
- showTable();
- }
-}
diff --git a/ciphers/RSA.java b/ciphers/RSA.java
deleted file mode 100644
index acb99f0f664a..000000000000
--- a/ciphers/RSA.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package ciphers;
-
-import java.math.BigInteger;
-import java.security.SecureRandom;
-import javax.swing.JOptionPane;
-
-/**
- * @author Nguyen Duy Tiep on 23-Oct-17.
- */
-public final class RSA {
-
- /**
- * Trivial test program.
- *
- * @param args
- * @deprecated TODO remove main and make JUnit Testing or any other
- * methodology
- */
- public static void main(String[] args) {
-
- RSA rsa = new RSA(1024);
- String text1 = JOptionPane.showInputDialog("Enter a message to encrypt :");
-
- String ciphertext = rsa.encrypt(text1);
- JOptionPane.showMessageDialog(null, "Your encrypted message : " + ciphertext);
-
- JOptionPane.showMessageDialog(null, "Your message after decrypt : " + rsa.decrypt(ciphertext));
- }
-
- private BigInteger modulus, privateKey, publicKey;
-
- /**
- *
- * @param bits
- */
- public RSA(int bits) {
- generateKeys(bits);
- }
-
- /**
- *
- * @param message
- * @return encrypted message
- */
- public synchronized String encrypt(String message) {
- return (new BigInteger(message.getBytes())).modPow(publicKey, modulus).toString();
- }
-
- /**
- *
- * @param message
- * @return encrypted message as big integer
- */
- public synchronized BigInteger encrypt(BigInteger message) {
- return message.modPow(publicKey, modulus);
- }
-
- /**
- *
- * @param encryptedMessage
- * @return plain message
- */
- public synchronized String decrypt(String encryptedMessage) {
- return new String((new BigInteger(encryptedMessage)).modPow(privateKey, modulus).toByteArray());
- }
-
- /**
- *
- * @param encryptedMessage
- * @return plain message as big integer
- */
- public synchronized BigInteger decrypt(BigInteger encryptedMessage) {
- return encryptedMessage.modPow(privateKey, modulus);
- }
-
- /**
- * Generate a new public and private key set.
- *
- * @param bits
- */
- public synchronized void generateKeys(int bits) {
- SecureRandom r = new SecureRandom();
- BigInteger p = new BigInteger(bits / 2, 100, r);
- BigInteger q = new BigInteger(bits / 2, 100, r);
- modulus = p.multiply(q);
-
- BigInteger m = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
-
- publicKey = new BigInteger("3");
-
- while (m.gcd(publicKey).intValue() > 1) {
- publicKey = publicKey.add(new BigInteger("2"));
- }
-
- privateKey = publicKey.modInverse(m);
- }
-
-}
diff --git a/ciphers/Vigenere.java b/ciphers/Vigenere.java
deleted file mode 100644
index 48c54288dcf8..000000000000
--- a/ciphers/Vigenere.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package ciphers;
-
-/**
- * A Java implementation of Vigenere Cipher.
- * @author straiffix
- */
-
-
-public class Vigenere {
-
- public static String encrypt(final String message, final String key)
- {
-
- String result = "";
-
- for (int i = 0, j = 0; i < message.length(); i++) {
- char c = message.charAt(i);
- if (Character.isLetter(c)){
- if(Character.isUpperCase(c)) {
- result += (char) ((c + key.toUpperCase().charAt(j) - 2 * 'A') % 26 + 'A');
-
- } else {
- result += (char) ((c + key.toLowerCase().charAt(j) - 2 * 'a') % 26 + 'a');
-
- }
- } else {
- result+=c;
- }
- j = ++j % key.length();
- }
- return result;
- }
-
- public static String decrypt( final String message, final String key)
- {
- String result ="";
-
- for(int i = 0, j = 0; i < message.length(); i++){
-
- char c = message.charAt(i);
- if (Character.isLetter(c)){
- if(Character.isUpperCase(c)) {
- result += ((char)('Z'-(25-(c-key.toUpperCase().charAt(j)))%26));
-
- } else {
- result += ((char)('z'-(25-(c-key.toLowerCase().charAt(j)))%26));
-
- }
- } else {
- result+=c;
- }
-
- j = ++j % key.length();
-
- }
- return result;
- }
- public static void main (String [] args){
- String text="Hello World!";
- String key="itsakey";
- System.out.println(text);
- String ciphertext=encrypt(text, key);
- System.out.println(ciphertext);
- System.out.println(decrypt(ciphertext, key));
-
- }
-}
diff --git a/divideconquer/ClosestPair.java b/divideconquer/ClosestPair.java
deleted file mode 100644
index 93a5d164dd88..000000000000
--- a/divideconquer/ClosestPair.java
+++ /dev/null
@@ -1,348 +0,0 @@
-package divideconquer;
-
-/**
-
-* For a set of points in a coordinates system (10000 maximum),
-* ClosestPair class calculates the two closest points.
-
-* @author: anonymous
-* @author: Marisa Afuera
-*/
-
- public final class ClosestPair {
-
-
- /** Number of points */
- int numberPoints = 0;
- /** Input data, maximum 10000. */
- private Location[] array;
- /** Minimum point coordinate. */
- Location point1 = null;
- /** Minimum point coordinate. */
- Location point2 = null;
- /** Minimum point length. */
- private static double minNum = Double.MAX_VALUE;
- /** secondCount */
- private static int secondCount = 0;
-
- /**
- * Constructor.
- */
- ClosestPair(int points) {
- numberPoints = points;
- array = new Location[numberPoints];
- }
-
- /**
- Location class is an auxiliary type to keep points coordinates.
- */
-
- public static class Location {
-
- double x = 0;
- double y = 0;
-
- /**
- * @param xpar (IN Parameter) x coordinate
- * @param ypar (IN Parameter) y coordinate
- */
-
- Location(final double xpar, final double ypar) { //Save x, y coordinates
- this.x = xpar;
- this.y = ypar;
- }
-
- }
-
- public Location[] createLocation(int numberValues) {
- return new Location[numberValues];
-
- }
-
- public Location buildLocation(double x, double y){
- return new Location(x,y);
- }
-
-
- /** xPartition function: arrange x-axis.
- * @param a (IN Parameter) array of points
- * @param first (IN Parameter) first point
- * @param last (IN Parameter) last point
- * @return pivot index
- */
-
- public int xPartition(
- final Location[] a, final int first, final int last) {
-
- Location pivot = a[last]; // pivot
- int pIndex = last;
- int i = first - 1;
- Location temp; // Temporarily store value for position transformation
- for (int j = first; j <= last - 1; j++) {
- if (a[j].x <= pivot.x) { // Less than or less than pivot
- i++;
- temp = a[i]; // array[i] <-> array[j]
- a[i] = a[j];
- a[j] = temp;
- }
- }
- i++;
- temp = a[i]; // array[pivot] <-> array[i]
- a[i] = a[pIndex];
- a[pIndex] = temp;
- return i; // pivot index
- }
-
- /** yPartition function: arrange y-axis.
- * @param a (IN Parameter) array of points
- * @param first (IN Parameter) first point
- * @param last (IN Parameter) last point
- * @return pivot index
- */
-
- public int yPartition(
- final Location[] a, final int first, final int last) {
-
- Location pivot = a[last]; // pivot
- int pIndex = last;
- int i = first - 1;
- Location temp; // Temporarily store value for position transformation
- for (int j = first; j <= last - 1; j++) {
- if (a[j].y <= pivot.y) { // Less than or less than pivot
- i++;
- temp = a[i]; // array[i] <-> array[j]
- a[i] = a[j];
- a[j] = temp;
- }
- }
- i++;
- temp = a[i]; // array[pivot] <-> array[i]
- a[i] = a[pIndex];
- a[pIndex] = temp;
- return i; // pivot index
- }
-
- /** xQuickSort function: //x-axis Quick Sorting.
- * @param a (IN Parameter) array of points
- * @param first (IN Parameter) first point
- * @param last (IN Parameter) last point
- */
-
- public void xQuickSort(
- final Location[] a, final int first, final int last) {
-
- if (first < last) {
- int q = xPartition(a, first, last); // pivot
- xQuickSort(a, first, q - 1); // Left
- xQuickSort(a, q + 1, last); // Right
- }
- }
-
- /** yQuickSort function: //y-axis Quick Sorting.
- * @param a (IN Parameter) array of points
- * @param first (IN Parameter) first point
- * @param last (IN Parameter) last point
- */
-
- public void yQuickSort(
- final Location[] a, final int first, final int last) {
-
- if (first < last) {
- int q = yPartition(a, first, last); // pivot
- yQuickSort(a, first, q - 1); // Left
- yQuickSort(a, q + 1, last); // Right
- }
- }
-
- /** closestPair function: find closest pair.
- * @param a (IN Parameter) array stored before divide
- * @param indexNum (IN Parameter) number coordinates divideArray
- * @return minimum distance
- */
-
- public double closestPair(final Location[] a, final int indexNum) {
-
- Location[] divideArray = new Location[indexNum];
- System.arraycopy(a, 0, divideArray, 0, indexNum); // Copy previous array
- int totalNum = indexNum; // number of coordinates in the divideArray
- int divideX = indexNum / 2; // Intermediate value for divide
- Location[] leftArray = new Location[divideX]; //divide - left array
- //divide-right array
- Location[] rightArray = new Location[totalNum - divideX];
- if (indexNum <= 3) { // If the number of coordinates is 3 or less
- return bruteForce(divideArray);
- }
- //divide-left array
- System.arraycopy(divideArray, 0, leftArray, 0, divideX);
- //divide-right array
- System.arraycopy(
- divideArray, divideX, rightArray, 0, totalNum - divideX);
-
- double minLeftArea = 0; //Minimum length of left array
- double minRightArea = 0; //Minimum length of right array
- double minValue = 0; //Minimum lengt
-
- minLeftArea = closestPair(leftArray, divideX); // recursive closestPair
- minRightArea = closestPair(rightArray, totalNum - divideX);
- // window size (= minimum length)
- minValue = Math.min(minLeftArea, minRightArea);
-
- // Create window. Set the size for creating a window
- // and creating a new array for the coordinates in the window
- for (int i = 0; i < totalNum; i++) {
- double xGap = Math.abs(divideArray[divideX].x - divideArray[i].x);
- if (xGap < minValue) {
- secondCount++; // size of the array
- } else {
- if (divideArray[i].x > divideArray[divideX].x) {
- break;
- }
- }
- }
- // new array for coordinates in window
- Location[] firstWindow = new Location[secondCount];
- int k = 0;
- for (int i = 0; i < totalNum; i++) {
- double xGap = Math.abs(divideArray[divideX].x - divideArray[i].x);
- if (xGap < minValue) { // if it's inside a window
- firstWindow[k] = divideArray[i]; // put in an array
- k++;
- } else {
- if (divideArray[i].x > divideArray[divideX].x) {
- break;
- }
- }
- }
- yQuickSort(firstWindow, 0, secondCount - 1); // Sort by y coordinates
- /* Coordinates in Window */
- double length = 0;
- // size comparison within window
- for (int i = 0; i < secondCount - 1; i++) {
- for (int j = (i + 1); j < secondCount; j++) {
- double xGap = Math.abs(firstWindow[i].x - firstWindow[j].x);
- double yGap = Math.abs(firstWindow[i].y - firstWindow[j].y);
- if (yGap < minValue) {
- length = Math.sqrt(Math.pow(xGap, 2) + Math.pow(yGap, 2));
- // If measured distance is less than current min distance
- if (length < minValue) {
- // Change minimum distance to current distance
- minValue = length;
- // Conditional for registering final coordinate
- if (length < minNum) {
- minNum = length;
- point1 = firstWindow[i];
- point2 = firstWindow[j];
- }
- }
- }
- else {
- break;
- }
- }
- }
- secondCount = 0;
- return minValue;
- }
-
- /** bruteForce function: When the number of coordinates is less than 3.
- * @param arrayParam (IN Parameter) array stored before divide
- * @return
- */
-
- public double bruteForce(final Location[] arrayParam) {
-
- double minValue = Double.MAX_VALUE; // minimum distance
- double length = 0;
- double xGap = 0; // Difference between x coordinates
- double yGap = 0; // Difference between y coordinates
- double result = 0;
-
- if (arrayParam.length == 2) {
- // Difference between x coordinates
- xGap = (arrayParam[0].x - arrayParam[1].x);
- // Difference between y coordinates
- yGap = (arrayParam[0].y - arrayParam[1].y);
- // distance between coordinates
- length = Math.sqrt(Math.pow(xGap, 2) + Math.pow(yGap, 2));
- // Conditional statement for registering final coordinate
- if (length < minNum) {
- minNum = length;
-
- }
- point1 = arrayParam[0];
- point2 = arrayParam[1];
- result = length;
- }
- if (arrayParam.length == 3) {
- for (int i = 0; i < arrayParam.length - 1; i++) {
- for (int j = (i + 1); j < arrayParam.length; j++) {
- // Difference between x coordinates
- xGap = (arrayParam[i].x - arrayParam[j].x);
- // Difference between y coordinates
- yGap = (arrayParam[i].y - arrayParam[j].y);
- // distance between coordinates
- length =
- Math.sqrt(Math.pow(xGap, 2) + Math.pow(yGap, 2));
- // If measured distance is less than current min distance
- if (length < minValue) {
- // Change minimum distance to current distance
- minValue = length;
- if (length < minNum) {
- // Registering final coordinate
- minNum = length;
- point1 = arrayParam[i];
- point2 = arrayParam[j];
- }
- }
- }
- }
- result = minValue;
-
- }
- return result; // If only one point returns 0.
- }
-
- /** main function: execute class.
- * @param args (IN Parameter)
- * @throws IOException If an input or output
- * exception occurred
- */
-
- public static void main(final String[] args) {
-
- //Input data consists of one x-coordinate and one y-coordinate
-
- ClosestPair cp = new ClosestPair(12);
- cp.array[0]=cp.buildLocation(2,3);
- cp.array[1]=cp.buildLocation(2,16);
- cp.array[2]=cp.buildLocation(3,9);
- cp.array[3]=cp.buildLocation(6,3);
- cp.array[4]=cp.buildLocation(7,7);
- cp.array[5]=cp.buildLocation(19,4);
- cp.array[6]=cp.buildLocation(10,11);
- cp.array[7]=cp.buildLocation(15,2);
- cp.array[8]=cp.buildLocation(15,19);
- cp.array[9]=cp.buildLocation(16,11);
- cp.array[10]=cp.buildLocation(17,13);
- cp.array[11]=cp.buildLocation(9,12);
-
- System.out.println("Input data");
- System.out.println("Number of points: "+ cp.array.length);
- for (int i=0;i
+
+
+ Custom PMD checks for TheAlgorithms/Java
+
+
+
+ Avoid using the main method.
+
+ 3
+
+
+
+
+
+
+
+
+
diff --git a/pmd-exclude.properties b/pmd-exclude.properties
new file mode 100644
index 000000000000..4c0ed625d884
--- /dev/null
+++ b/pmd-exclude.properties
@@ -0,0 +1,120 @@
+com.thealgorithms.ciphers.AES=UselessMainMethod
+com.thealgorithms.ciphers.AESEncryption=UselessMainMethod
+com.thealgorithms.ciphers.AffineCipher=UselessParentheses
+com.thealgorithms.ciphers.DES=UselessParentheses
+com.thealgorithms.ciphers.ProductCipher=UselessMainMethod
+com.thealgorithms.ciphers.RSA=UselessParentheses
+com.thealgorithms.conversions.AnyBaseToAnyBase=UselessMainMethod,UselessParentheses
+com.thealgorithms.conversions.AnytoAny=UselessParentheses
+com.thealgorithms.conversions.RgbHsvConversion=UselessMainMethod
+com.thealgorithms.datastructures.crdt.Pair=UnusedPrivateField
+com.thealgorithms.datastructures.graphs.AStar=UselessParentheses
+com.thealgorithms.datastructures.graphs.AdjacencyMatrixGraph=CollapsibleIfStatements,UnnecessaryFullyQualifiedName,UselessParentheses
+com.thealgorithms.datastructures.graphs.BellmanFord=UselessMainMethod
+com.thealgorithms.datastructures.graphs.BipartiteGraphDFS=CollapsibleIfStatements
+com.thealgorithms.datastructures.graphs.ConnectedComponent=UselessMainMethod
+com.thealgorithms.datastructures.graphs.Cycles=UselessMainMethod
+com.thealgorithms.datastructures.graphs.Graphs=UselessMainMethod
+com.thealgorithms.datastructures.graphs.KahnsAlgorithm=UselessMainMethod
+com.thealgorithms.datastructures.graphs.MatrixGraphs=UselessMainMethod
+com.thealgorithms.datastructures.hashmap.hashing.HashMapCuckooHashing=UselessParentheses
+com.thealgorithms.datastructures.hashmap.hashing.MainCuckooHashing=UselessMainMethod
+com.thealgorithms.datastructures.heaps.FibonacciHeap=UselessParentheses
+com.thealgorithms.datastructures.heaps.HeapNode=UselessParentheses
+com.thealgorithms.datastructures.lists.DoublyLinkedList=UselessParentheses
+com.thealgorithms.datastructures.lists.Link=UselessMainMethod
+com.thealgorithms.datastructures.lists.RandomNode=UselessMainMethod
+com.thealgorithms.datastructures.lists.SearchSinglyLinkedListRecursion=UselessParentheses
+com.thealgorithms.datastructures.lists.SinglyLinkedList=UnusedLocalVariable,UselessMainMethod
+com.thealgorithms.datastructures.queues.Deque=UselessMainMethod
+com.thealgorithms.datastructures.queues.PriorityQueue=UselessParentheses
+com.thealgorithms.datastructures.trees.BSTRecursiveGeneric=UselessMainMethod
+com.thealgorithms.datastructures.trees.CheckBinaryTreeIsValidBST=UselessParentheses
+com.thealgorithms.datastructures.trees.LCA=UselessMainMethod
+com.thealgorithms.datastructures.trees.NearestRightKey=UselessMainMethod
+com.thealgorithms.datastructures.trees.PrintTopViewofTree=UselessMainMethod
+com.thealgorithms.datastructures.trees.SegmentTree=UselessParentheses
+com.thealgorithms.devutils.nodes.LargeTreeNode=UselessParentheses
+com.thealgorithms.devutils.nodes.SimpleNode=UselessParentheses
+com.thealgorithms.devutils.nodes.SimpleTreeNode=UselessParentheses
+com.thealgorithms.devutils.nodes.TreeNode=UselessParentheses
+com.thealgorithms.divideandconquer.ClosestPair=UnnecessaryFullyQualifiedName,UselessMainMethod,UselessParentheses
+com.thealgorithms.divideandconquer.Point=UselessParentheses
+com.thealgorithms.dynamicprogramming.CatalanNumber=UselessMainMethod
+com.thealgorithms.dynamicprogramming.EggDropping=UselessMainMethod
+com.thealgorithms.dynamicprogramming.LongestPalindromicSubsequence=UselessMainMethod
+com.thealgorithms.dynamicprogramming.WineProblem=UselessParentheses
+com.thealgorithms.maths.BinomialCoefficient=UselessParentheses
+com.thealgorithms.maths.Complex=UselessParentheses
+com.thealgorithms.maths.DistanceFormulaTest=UnnecessaryFullyQualifiedName
+com.thealgorithms.maths.EulerMethod=UselessMainMethod
+com.thealgorithms.maths.GCDRecursion=UselessMainMethod
+com.thealgorithms.maths.Gaussian=UselessParentheses
+com.thealgorithms.maths.GcdSolutionWrapper=UselessParentheses
+com.thealgorithms.maths.HeronsFormula=UselessParentheses
+com.thealgorithms.maths.JugglerSequence=UselessMainMethod
+com.thealgorithms.maths.KaprekarNumbers=UselessParentheses
+com.thealgorithms.maths.KeithNumber=UselessMainMethod,UselessParentheses
+com.thealgorithms.maths.LeonardoNumber=UselessParentheses
+com.thealgorithms.maths.LinearDiophantineEquationsSolver=UselessMainMethod,UselessParentheses
+com.thealgorithms.maths.MagicSquare=UselessMainMethod
+com.thealgorithms.maths.PiNilakantha=UselessMainMethod
+com.thealgorithms.maths.Prime.PrimeCheck=UselessMainMethod
+com.thealgorithms.maths.PythagoreanTriple=UselessMainMethod
+com.thealgorithms.maths.RomanNumeralUtil=UselessParentheses
+com.thealgorithms.maths.SecondMinMax=UselessParentheses
+com.thealgorithms.maths.SecondMinMaxTest=UnnecessaryFullyQualifiedName
+com.thealgorithms.maths.SimpsonIntegration=UselessMainMethod
+com.thealgorithms.maths.StandardDeviation=UselessParentheses
+com.thealgorithms.maths.SumOfArithmeticSeries=UselessParentheses
+com.thealgorithms.maths.TrinomialTriangle=UselessMainMethod,UselessParentheses
+com.thealgorithms.maths.VectorCrossProduct=UselessMainMethod
+com.thealgorithms.maths.Volume=UselessParentheses
+com.thealgorithms.matrix.RotateMatrixBy90Degrees=UselessMainMethod
+com.thealgorithms.misc.Sparsity=UselessParentheses
+com.thealgorithms.others.BankersAlgorithm=UselessMainMethod
+com.thealgorithms.others.BrianKernighanAlgorithm=UselessMainMethod
+com.thealgorithms.others.CRC16=UselessMainMethod,UselessParentheses
+com.thealgorithms.others.CRC32=UselessMainMethod
+com.thealgorithms.others.Damm=UnnecessaryFullyQualifiedName,UselessMainMethod
+com.thealgorithms.others.Dijkstra=UselessMainMethod
+com.thealgorithms.others.GaussLegendre=UselessMainMethod
+com.thealgorithms.others.HappyNumbersSeq=UselessMainMethod
+com.thealgorithms.others.Huffman=UselessMainMethod
+com.thealgorithms.others.InsertDeleteInArray=UselessMainMethod
+com.thealgorithms.others.KochSnowflake=UselessMainMethod
+com.thealgorithms.others.Krishnamurthy=UselessMainMethod
+com.thealgorithms.others.LinearCongruentialGenerator=UselessMainMethod
+com.thealgorithms.others.Luhn=UnnecessaryFullyQualifiedName,UselessMainMethod
+com.thealgorithms.others.Mandelbrot=UselessMainMethod,UselessParentheses
+com.thealgorithms.others.MiniMaxAlgorithm=UselessMainMethod,UselessParentheses
+com.thealgorithms.others.PageRank=UselessMainMethod,UselessParentheses
+com.thealgorithms.others.PerlinNoise=UselessMainMethod,UselessParentheses
+com.thealgorithms.others.QueueUsingTwoStacks=UselessParentheses
+com.thealgorithms.others.Trieac=UselessMainMethod,UselessParentheses
+com.thealgorithms.others.Verhoeff=UnnecessaryFullyQualifiedName,UselessMainMethod
+com.thealgorithms.puzzlesandgames.Sudoku=UselessMainMethod
+com.thealgorithms.searches.HowManyTimesRotated=UselessMainMethod
+com.thealgorithms.searches.InterpolationSearch=UselessParentheses
+com.thealgorithms.searches.KMPSearch=UselessParentheses
+com.thealgorithms.searches.RabinKarpAlgorithm=UselessParentheses
+com.thealgorithms.searches.RecursiveBinarySearch=UselessMainMethod
+com.thealgorithms.sorts.BogoSort=UselessMainMethod
+com.thealgorithms.sorts.CircleSort=EmptyControlStatement
+com.thealgorithms.sorts.DutchNationalFlagSort=UselessParentheses
+com.thealgorithms.sorts.MergeSortNoExtraSpace=UselessParentheses
+com.thealgorithms.sorts.RadixSort=UselessParentheses
+com.thealgorithms.sorts.TreeSort=UselessMainMethod
+com.thealgorithms.sorts.WiggleSort=UselessParentheses
+com.thealgorithms.stacks.LargestRectangle=UselessMainMethod
+com.thealgorithms.stacks.MaximumMinimumWindow=UselessMainMethod
+com.thealgorithms.stacks.PostfixToInfix=UselessParentheses
+com.thealgorithms.strings.Alphabetical=UselessMainMethod
+com.thealgorithms.strings.HorspoolSearch=UnnecessaryFullyQualifiedName,UselessParentheses
+com.thealgorithms.strings.KMP=UselessMainMethod
+com.thealgorithms.strings.Lower=UselessMainMethod
+com.thealgorithms.strings.Palindrome=UselessParentheses
+com.thealgorithms.strings.Pangram=UselessMainMethod
+com.thealgorithms.strings.RabinKarp=UselessMainMethod
+com.thealgorithms.strings.Rotation=UselessMainMethod
+com.thealgorithms.strings.Upper=UselessMainMethod
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 000000000000..a87a7157c2f9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,159 @@
+
+
+ 4.0.0
+ com.thealgorithms
+ Java
+ 1.0-SNAPSHOT
+ jar
+
+
+ UTF-8
+ 21
+ 21
+ 3.27.3
+
+
+
+
+
+ org.junit
+ junit-bom
+ 5.13.1
+ pom
+ import
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ 5.18.0
+ test
+
+
+ org.apache.commons
+ commons-lang3
+ 3.17.0
+
+
+ org.apache.commons
+ commons-collections4
+ 4.5.0
+
+
+
+
+
+
+ maven-surefire-plugin
+ 3.5.3
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.14.0
+
+ 21
+ 21
+
+