YarЬ, без динамического программирования обычной рекурсией алгоритм вычисления определителя N-го порядка может выглядеть примерно так:
class Matrix
def initialize(n)
@rows,@n=Array.new,n
for i in 0..@n
column=Array.new
for j in 0..@n
column.push(0)
end
@rows.push(column)
end
end
def [](x,y)
return @rows[y][x]
end
def []=(x,y,value)
@rows[y][x]=value
end
def calculateDeterminant
if @n==2 then
a1=self[0,0];a2=self[0,1];b1=self[1,0];b2=self[1,1]
return a1*b2-a2*b1
else
j,determinant=0,0
for i in 0..@n
ai=self[i,j]
if ai!=0 then
sign=(i+j)%2==0?1:-1
aai=buildSubmatrix(i,j).calculateDeterminant
determinant+=sign*ai*aai
end
end
return determinant
end
end
def buildSubmatrix(x,y)
submatrix=Matrix.new(@n-1)
k=0
for i in 0..@n
if i!=x then
l=0
for j in 0..@n
if j!=y then
submatrix[k,l]=self[i,j]
l+=1
end
end
k+=1
end
end
return submatrix
end
end
Как видно из алгоритма (но нереализовано в нём), сокращение количества вычисляемых миноров обеспечивается поиском строки с наибольшим количеством нулей и пропусканием этих нулей при расчёте. Количество нулей можно увеличивать преобразованиями, но тогда задача сведётся к приведению матрицы к треугольному виду (о чём
Вад говорил) и вычислению ранга более простым способом.