爲了實現Hill密碼,我們必須先實現如何求逆矩陣。
A的逆矩陣公式爲 A*/|A|,我們需要分別求出A*、|A|。
爲了求出我們的伴隨矩陣,我們要實現幾個步驟的方法:
1、實現求出(h,v)相應座標下的餘子式
2、實現求出一個矩陣的值
3、實現通過求代數餘子式並轉置來實現求逆矩陣
1、實現求出(h,v)相應座標下的餘子式
/*
* 求(h,v)座標的位置的餘子式
*/
public float[][] getConfactor(float[][] data, int h, int v) {
int H = data.length;
int V = data[0].length;
float[][] newdata = new float[H-1][V-1];
for(int i=0; i<newdata.length; i++) {
if(i < h-1) {
for(int j=0; j<newdata[i].length; j++) {
if(j < v-1) {
newdata[i][j] = data[i][j];
}else {
newdata[i][j] = data[i][j+1];
}
}
}else {
for(int j=0; j<newdata[i].length; j++) {
if(j < v-1) {
newdata[i][j] = data[i+1][j];
}else {
newdata[i][j] = data[i+1][j+1];
}
}
}
}
// for(int i=0; i<newdata.length; i ++)
// for(int j=0; j<newdata[i].length; j++) {
// System.out.println(newdata[i][j]);
// }
return newdata;
}
2、實現求出一個矩陣的值
/*
* 計算行列式的值
*/
public float getMartrixResult(float[][] data) {
/*
* 二維矩陣計算
*/
if(data.length == 2) {
return data[0][0]*data[1][1] - data[0][1]*data[1][0];
}
/*
* 二維以上的矩陣計算
*/
float result = 0;
int num = data.length;
float[] nums = new float[num];
for(int i=0; i<data.length; i++) {
if(i%2 == 0) {
nums[i] = data[0][i] * getMartrixResult(getConfactor(data, 1, i+1));
}else {
nums[i] = -data[0][i] * getMartrixResult(getConfactor(data, 1, i+1));
}
}
for(int i=0; i<data.length; i++) {
result += nums[i];
}
// System.out.println(result);
return result;
}
3、實現通過求代數餘子式並轉置來實現求逆矩陣
public float[][] getReverseMartrix(float[][] data) {
float[][] newdata = new float[data.length][data[0].length];
float A = getMartrixResult(data);
// System.out.println(A);
for(int i=0; i<data.length; i++) {
for(int j=0; j<data[0].length; j++) {
if((i+j)%2 == 0) {
newdata[i][j] = getMartrixResult(getConfactor(data, i+1, j+1)) / A;
}else {
newdata[i][j] = -getMartrixResult(getConfactor(data, i+1, j+1)) / A;
}
}
}
newdata = trans(newdata);
for(int i=0;i<newdata.length; i++) {
for(int j=0; j<newdata[0].length; j++) {
System.out.print(newdata[i][j]+ " ");
}
System.out.println();
}
return newdata;
}
private float[][] trans(float[][] newdata) {
// TODO Auto-generated method stub
float[][] newdata2 = new float[newdata[0].length][newdata.length];
for(int i=0; i<newdata.length; i++)
for(int j=0; j<newdata[0].length; j++) {
newdata2[j][i] = newdata[i][j];
}
return newdata2;
}
最後,我們通過測試代碼來驗證
public class ReverseMartrix {
static float[][] data = {
{1,2,-1 },
{3,1,0 },
{-1,-1,-2 },
};
public static void main(String[] args) {
// TODO Auto-generated method stub
ReverseMartrix rm = new ReverseMartrix();
rm.getReverseMartrix(data);
}
…………………………
}
最後,需要源代碼的,這裏給出鏈接
鏈接: http://pan.baidu.com/s/1hqiwSTm 密碼: dd9e