require 'matrix' class Matrix def det_b abort '!error: not square!' unless square? n=row_size a=to_a (0...n).inject(1) do |det,k| i=a.transpose[k].slice(k...n).index{|e| e!=0} return 0 if i.nil? #not full ranked if i!=0 then a[k],a[k+i]=a[k+i],a[k] det*=-1 end for i in (k+1)...n for j in (k...n).to_a.reverse a[i][j]=a[k][k]*a[i][j]-a[i][k]*a[k][j] a[i][j]/=a[k-1][k-1] if k!=0 end end det/=a[k-1][k-1] if k!=0 det*a[k][k] end end end n=44 require 'mathn' 10.times do a=Matrix.unit(n).map{|_| rand(10)-5} #a=Matrix.unit(n).map{|_| 10.0*rand-5.0} puts '@@@@@@@@@@@@@@@@@@@@@@@@@' puts 'det: ' << a.det.to_s puts 'det_e: ' << a.det_e.to_s puts 'det_b: ' << a.det_b.to_s end