将 bigInteger 值添加到二维数组

add a bigInteger value to a 2d array

下面的代码不起作用,因为它使用模对负数进行计算。所以我必须将值解析为声明为 BigInteger 而不是 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行): 字符字母 = alphabet.get(num);

对于那些有数学背景的人来说,这是一个令人惊讶的特点

 System.out.println("=" + (-3 % 4));

例如,returns -3 而不是 1(在 [0,3] 范围内);

编辑:

换句话说,错误信息

error message: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -8

最终是由 (n % m) 可以 return 负值引起的。像

这样的语句
num=(26+num)%26;

会治愈它。