【线性代数】行列式的概念

d e t ( A ) = ∑ i 1 , i 2 , ⋯   , i n ( − 1 ) σ ( i 1 , ⋯   , i n ) a 1 , i 1 a 2 , i 2 , ⋯   , a n , i n det(A) =\sum_{i_1,i_2,\cdots,i_n } (-1)^{\sigma(i_1,\cdots,i_n)} a_{1,i_1}a_{2,i_2},\cdots, a_{n,i_n} det(A)=i1,i2,⋯,in∑(−1)σ(i1,⋯,in)a1,i1a2,i2,⋯,an,in

i 1 , ⋯   , i n i_1,\cdots,i_n i1,⋯,in 是 1 , ⋯   , n 1,\cdots,n 1,⋯,n 的排列.

计算复杂度

O ( n ⋅ n ! ) O(n\cdot n!) O(n⋅n!)

{ 1 , 2 } \{1,2\} {1,2} 的全排列如下

排列 逆序数 奇偶性
1 , 2 1,2 1,2 0
2 , 1 2,1 2,1 1

a 1 , 1 a 1 , 2 a 2 , 1 a 2 , 2 \] \\left\[\\begin{matrix}a_{1,1} \&a_{1,2}\\\\ a_{2,1} \& a_{2,2}\\end{matrix}\\right\] \[a1,1a2,1a1,2a2,2

{ 1 , 2 , 3 } \{1,2,3\} {1,2,3} 的全排列如下

排列 逆序数 奇偶性
1 , 2 , 3 1,2,3 1,2,3 0
1 , 3 , 2 1,3,2 1,3,2 1
2 , 1 , 3 2,1,3 2,1,3 1
2 , 3 , 1 2,3,1 2,3,1 2
3 , 1 , 2 3,1,2 3,1,2 2
3 , 2 , 1 3,2,1 3,2,1 3

a 1 , 1 a 1 , 2 a 1 , 3 a 2 , 1 a 2 , 2 a 2 , 3 a 3 , 1 a 3 , 2 a 3 , 3 \left\\begin{matrix}a_{1,1} \&a_{1,2} \& a_{1,3}\\\\ a_{2,1} \& a_{2,2}\& a_{2,3} \\\\ a_{3,1} \& a_{3,2} \& a_{3,3}\\end{matrix}\\right a1,1a2,1a3,1a1,2a2,2a3,2a1,3a2,3a3,3

递归法生成全排列

julia 复制代码
using CSV, DataFrames, Tables
function OE(sigma)   # 判断奇偶置换
   n=length(sigma); out=1
   for i=1:n
      for j=1:n-1
         if sigma[j] > sigma[j+1]
            out=-out;  sigma[j],sigma[j+1]=sigma[j+1], sigma[j]
         end
      end
   end
   return(out)
end
function remove_last(seq)   # 删除序列最后一个元素
lth=length(seq)
z=copy(seq[1:lth-1])
return(z)
end
function rankfull(seq,n,cpl)  # 递归全排列生成器
   lth=length(seq)
   if lth==1
      m=[cpl; seq]
      open("rankfull_sol.txt","a") do io
          for i=1:n
              s=m[i];  write(io, "$s,")
          end
          write(io,"\n");
      end
   else
      for i=1:lth
         s=seq[i];    idx=0;
         list=zeros(Int,lth-1)
         for j=1:lth
            if !(seq[j]==s)
               idx=idx+1;  list[idx]=seq[j]
            end
         end
         cpl=[cpl; s];
         rankfull(list,n,cpl)
         cpl=remove_last(cpl)
      end
   end
end
function det_defn(A)  # 定义法求行列式
   lth=size(A,1)
   seq=1:lth
   global ranksol=[seq];
   lth=length(seq); cpl=[]; iters=factorial(lth)
   try
       rankfull(seq,lth,cpl)
   catch nothing
   end
   io=open("rankfull_sol.txt","r")
   data=read(io,String)
   file = CSV.File(IOBuffer(data), header=false)
   CSV.write("fullrank.csv", file)
   close(io)
   sigma=zeros(Int64,iters,lth);
   for i=1:factorial(lth)
       for j=1:lth
          sigma[i,j]=file[i][j]
       end
   end
   DETs=0*A[1,1]
   for i=1:iters
      Prs=1
      for j=1:lth
         Prs=Prs*M[j,sigma[i,j]]
      end
      DETs=DETs+ OE(sigma[i,:])*Prs
   end
   return(DETs)
end
M=[4//1 3 2 1;
   3 2 1 4;
   2 1 4 3;
   1 4 3 2]
a= det_defn(M)
println("\n")
println("defn=",a)

-160//1

邻近对换算法生成全排列

julia 复制代码
function ranking(lth)  # 邻近对换全排列生成器
    prd=1;  arr=zeros(Int64,lth);
    for i=1:lth arr[i]=i end
    for i=1:lth   prd=prd*i end
    jx=lth  ; dr=-1;   s=0;
    for j=1:prd
        if dr<0
            if jx>1
                arr[jx],arr[jx+dr] =   arr[jx+dr],arr[jx]
                jx=jx+dr
            else
                arr[lth],arr[lth-1] =   arr[lth-1],arr[lth]
                dr=-dr
            end
        else
            if jx<lth
                arr[jx],arr[jx+dr] =   arr[jx+dr],arr[jx];
                jx=jx+dr
            else
                arr[1],arr[2] =   arr[2],arr[1];   dr=-dr
            end
        end
        open("ranking_sol.txt","a") do io
            for i=1:lth
                s=arr[i];  write(io, "$s,")
            end
            write(io,"\n");
        end    
    end
end
function det_defn2(A)  # 定义法求行列式
   lth=size(A,1)
   seq=1:lth
   global ranksol=[seq];
   lth=length(seq); cpl=[]; iters=factorial(lth)
   try rm("ranking_sol.txt")
    catch
        nothing
   end
   ranking(lth)
   io=open("ranking_sol.txt","r")
   data=read(io,String)
   file = CSV.File(IOBuffer(data), header=false)
   CSV.write("fullrank.csv", file)
   close(io)
   sigma=zeros(Int64,iters,lth);
   for i=1:factorial(lth)
       for j=1:lth
          sigma[i,j]=file[i][j]
       end
   end
   DETs=0*A[1,1]
   for i=1:iters
      Prs=1
      for j=1:lth
         Prs=Prs*M[j,sigma[i,j]]
      end
      DETs=DETs+ OE(sigma[i,:])*Prs
   end
   return(DETs)
end    
M=[4//1 3 2 ;
   3 2 1 ;
   2 1 4]
a= det_defn2(M)

-160//1

相关推荐
Uncommon.5 小时前
线性代数与向量
pytorch·python·线性代数·机器学习
知识分享小能手1 天前
线性代数学习教程,从入门到精通,相似矩阵及二次型 — 知识点详解(9)
学习·线性代数·机器学习
知识分享小能手2 天前
线性代数学习教程,从入门到精通,向量组的线性相关性 — 完整知识点梳理(7)
学习·线性代数·机器学习
ACP广源盛139246256732 天前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
ACP广源盛139246256732 天前
WAIC2026 国产算力浪潮下@ACP#IX8024 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
haohao34302 天前
B4259 [GESP202503 二级] 等差矩阵
线性代数·矩阵
粉色大象2 天前
考研线代重难点:二阶实对称矩阵合同快速判定|2008数二第8题真题精讲
线性代数·考研·矩阵
A_cainiao_A2 天前
【ggml系列】【第五篇】ggml_compute_forward_mul_mat 矩阵乘法算子源码与性能优化深度解析
线性代数·性能优化·矩阵
TechEdu2026062 天前
[通信与计算]线性代数:概念及其在通信中的应用
线性代数·机器学习·通信系统·信息通信
瑞码空间3 天前
线性代数核心概念与实战应用详解
线性代数