2013-12-01 2 views
0

Я делаю проект на Java, где мне нужно использовать класс BigInteger для реализации метода шифрования.Определитель огромной матрицы Java

У меня квадратные матрицы nxn, где n может быть 200, и мне нужно вычислить определитель. Я использовал этот метод, используя детерминант подматриц, но навсегда его вычислял.

public BigInteger determinant(Matrix matrix){ 
    if (matrix.getColumns()!=matrix.getRows()){ 
     System.out.println("The matrix is not square"); 
     return BigInteger.valueOf(-1); 
    } 
    if (matrix.getColumns() == 1) { 
    return matrix.getMatrix()[0][0]; 
    } 
    if (matrix.getRows()==2) { 
     return ((matrix.getValueAt(0, 0).multiply(matrix.getValueAt(1, 1)))).subtract((matrix.getValueAt(0, 1).multiply(matrix.getValueAt(1, 0)))); 
    } 
    BigInteger sum = BigInteger.valueOf(0); 
    for (int i=0; i<matrix.getColumns(); i++) { 
     sum = sum.add(this.changeSign(BigInteger.valueOf(i)).multiply(matrix.getValueAt(0, i)).multiply(determinant(createSubMatrix(matrix, 0, i))));// * determinant(createSubMatrix(matrix, 0, i)); 
    } 
    return sum; 
    } 

Есть ли нерекурсивный способ вычисления детерминанта?

Заранее спасибо.

+0

Вычисление детерминанта дорого, но редко требуется. Что такое метод шифрования, который вы пытаетесь реализовать? – NPE

+0

Быстрый ответ был бы: да, потому что все написанное рекурсивно может быть написано нерекурсивно. Но вы действительно уверены, что вам нужно вычислить детерминант? Если вам это действительно нужно, взгляните на этот пакет: http://math.nist.gov/javanumerics/jama/ –

+0

Мне нужно вычислить определитель, чтобы сделать обратный. плюс мне нужно, когда я создаю случайные матрицы, чтобы убедиться, что они обратимы. Шифрование - это новое полностью гомоморфное шифрование. к сожалению, я не могу опубликовать публикацию –

ответ

1

Я разместил это как комментарий, но я думаю, что это действительно может решить вашу проблему, поэтому я отправляю ее как ответ. Вы можете использовать этот пакет: http://math.nist.gov/javanumerics/jama/

+0

Могу ли я использовать его с BigInteger? –

+0

@OrestisIoannou Кажется, работает с «двойным». Вы уверены, что BigInteger нужен? –

+0

да заставляют числа в матрицах иметь 300 цифр. –

0

Общей практикой расчета детернаната огромных матриц является использование разложения LUP. В этом случае детерминант может быть рассчитан по следующим идеям:

{L, U, P} = LUP(A) 
sign = -1^'number of permutations in P' 
det(A) = diagonalProduct(U) * sign 

Вот как это делают большие математические пакеты. Вероятно, вы должны реализовать LU самостоятельно.

Смежные вопросы