//Freehold High
School
//David Goldman
//School Code:
2100
//Advisor : Mr. James Gill
//Intermediate 5
//ACSL Matrix
Encryption
//This program
decodes a matrix encryption.
import
java.util.Scanner;
public class
DG_INT_4 {
public static void main(String[] args)
{
Scanner scan = new
Scanner(System.in);
for (int i = 1; i <=5; i++)
{
System.out.println(i+".
");
String[] input =
scan.nextLine().replaceAll("\\s", "").split(",");
int numOf =
Integer.parseInt(input[0]);
int numPairs = numOf/2;
int[][] inverse=
getInverse(parseInput(input));
int[] result = new
int[numPairs*2];
for (int a = 1;
a<=numPairs; a++)
{
int[][] current =
{{Integer.parseInt(input[a])},{Integer.parseInt(input[a+numPairs])}};
int[][] translated = multiply(inverse,current);
result[a*2-2]=translated[0][0];
result[a*2-1]=translated[1][0];
}
print(result);
}
}
private static int[][] multiply(int[][]
arg1, int[][] arg2)
{
int temp;
int[][] array = new
int[arg1.length][arg2[0].length];
for (int i = 0;
i<arg1.length;i++)
for (int a = 0; a <arg2[0].length;a++)
{
temp = 0;
for (int index = 0; index <
arg1[i].length;index++)
temp+=arg1[i][index]*arg2[index][a];
array[i][a]=temp;
}
return array;
}
private static int[][]
getInverse(int[][]arg1)
{
int determinant =
arg1[0][0]*arg1[1][1] - arg1[1][0]*arg1[0][1];
int[][] result = new
int[arg1.length][arg1[0].length];
result[0][0] =( int) (arg1[1][1] *
(1.0/determinant));
result[1][1] = (int) (arg1[0][0] *
(1.0/determinant));
result[1][0] = (int) (arg1[1][0]*-1
* (1.0/determinant));
result[0][1] = (int) (arg1[0][1]*-1
* (1.0/determinant));
return result;
}
//Should be called parseEncodingArray
//Could have been combined with getInverse
to only use half of the code
private static int[][] parseInput(String[]
input)
{
int[][] decode = new int[2][2];
int count = 0;
for (int i =0; i <
decode.length;i++)
for (int j = 0; j<decode[i].length;j++)
{
decode[i][j] =
Integer.parseInt(input[input.length-4+count]);
count++;
}
return decode;
}
private static void print(int[] result)
{
for (int index = 0; index<
result.length; index++)
{
if (result[index] >27)
result[index] = result[index]% 27;
else if (result[index] <1)
result[index] = result[index] +27;
}
String message="";
for (int i = 0; i<result.length;
i++)
{
if (result[i] == 27)
message+=" ";
else
message+=
"" + (char) ('A' + result[i] -1);
}
System.out.println(message);
}
}