下面的代码不起作用,因为它使用模数进行负数计算。所以我必须将值解析为声明为BigInteger的2d数组而不是int。
BigInteger bi2, bi3;
int det=(key[0][0] * key[1][1])-(key[0][1] * key[1][0]);
BigInteger bi1 = new BigInteger(String.valueOf(det));
bi2 = new BigInteger("26");
bi3 = bi1.modInverse(bi2);
int inverse= bi3.intValue();
key[0][0] = inverse * key[0][0];
key[0][1] = inverse * key[0][1];
key[1][0] = inverse * key[1][0];
key[1][1] = inverse * key[1][1];
key2[0][0] = key[1][1];
key2[1][1] = key[0][0];
key2[0][1] = -key[0][1];
key2[1][0] = -key[1][0];
问题在于: 它为每个计算打印错误答案,因为它需要使用o BigInteger而不是inetger因为负值。
key[0][0] = key2[0][0] % 26;
key[0][1] = key2[0][1] % 26;
key[1][0] = key2[1][0] % 26;
key[1][1] = key2[1][1] % 26;
此后,我想用这个BigIntegers进行一些计算。但是,计算将仅包括整数。所以在那之后我必须将数组中的那些BigIntegers转换为整数。
其余代码:
for (int i = 0; i < str.length(); i++) {
for (int j =0; j< alphabet.size() ; j++){
if (alphabet.get(j) == str.charAt(i)) {
int index = alphabet.indexOf(str.charAt(i));
store.add(index);
}
}
}
System.out.println(Arrays.toString(store.toArray()));
for (; k<store.size(); k++){
sp2 = sp +1;
int n2=0;
int n1 = 0;
if (sp==store.size()-1){
n1 = store.get(sp);
if (sp2> store.size()-1){
n2 = 23;
}
if(sp2 < store.size()) {
n2 = store.get(sp2);
}
fn1 = ((key[0][0] * n1) + (key [0][1] * n2))% 26;
fn2 = ((key[1][0] * n1) + (key [1][1] * n2))%26;
conversion.add(fn1);
conversion.add(fn2);
sp+=2;
}
if (sp > store.size() -1){
break;
}
else{
n1 = store.get(sp);
n2 = store.get(sp2);
fn1 = ((key[0][0] * n1) + (key [0][1] * n2))% 26;
fn2 = ((key[1][0] * n1) + (key [1][1] * n2))%26;
conversion.add(fn1);
conversion.add(fn2);
sp+=2;
}
}
System.out.println(Arrays.toString(conversion.toArray()));
List<Character> encrypted = new ArrayList();
for (int i=0; i<conversion.size(); i++){
int num = conversion.get(i);
char letter = alphabet.get(num);
encrypted.add(letter);
}
System.out.println(Arrays.toString(encrypted.toArray()));
错误消息:线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:-8
错误是这样的(结束前4行): char letter = alphabet.get(num);
答案 0 :(得分:1)
对于那些有数学背景的人来说,这是一个令人惊讶的特征
System.out.println("=" + (-3 % 4));
例如,返回-3而不是1(将在[0,3]范围内);
编辑:
换句话说,错误信息
error message: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -8
最终由(n%m)引起的可以返回负值。像
这样的陈述num=(26+num)%26;
会治愈它。