[心得] 產生GL(n,F_p)的矩陣

看板Mathematica作者 (Hysterisis)時間12年前 (2012/11/03 15:47), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
標題的意思是,General Linear group of order n of 某某 field = GL[n, F] = 所有判別式非零(可逆)的n階方陣,每個元素屬於F 而域 F_p 是 Z/pZ 是對p的同餘 所以例如說 F_2 = {0,1} GL_2 [F_2] 只有六個元素 (1 0) (1 0) (1 1) (0 1) (1 1) (0 1) (0 1),(1 1),(0 1),(1 0),(1 0),(1 1) 每個元素的order = 自乘幾次會變成 (1 0) 也可以算,以上面為例是 1,2,2,2,3,3 (0 1) 所以我要怎麼自動生成所有可能的矩陣? 以Z/2Z, 2階GL為例 第一步: 產生所有數組就用Tuples Tuples[{0,1},2^2] {{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0}, ...} 第二步: 餵進去矩陣 之一: 把矩陣寫出來 mtx[n_]:=Function[Evaluate[ Table[Table[ Slot[n(j-1)+i], {i,n}], {j,n}] //MatrixForm (*Table我喜歡每層分別寫,不會搞錯順序*) ]] (*那個Evaluate的目的,是說明文件叫我加的,否則程式讀不懂QQ*) 之二: 一項項塞進去 = Map Apply[mtx[2],#]& /@ Tuples[{0,1},2^2] 第三步: 幹掉Determinant是零的 Cases[ Apply[mtx[2],#]& /@ Tuples[{0,1},2^2], _?(Det[#/.MatrixForm[x_]->x]!=0&)] (* /.MatrixForm[x_]->x 存在的目的是Det看不懂被前者包住的矩陣,算是前面貪圖 顯示方便而付出的代價*) 大功告成! Cases最後面那個奇怪的運算子 _?(純函數) 是硬要把函數寫進pattern 的用法,因為Cases和DeleteCases只能看pattern。它的意思跟 Select[%, Det[#/.MatrixForm[x_]->x]!=0 &] 一模一樣,只是看來比較高級,因為 _?(純函數) 的用法說明文件裡沒有範例XD 寫在一起就是 GLF[dim_, Fn_] := Cases[Apply[mtx[dim], #] & /@ Tuples[Range[Fn]-1, dim^2], _?(Det[# /. MatrixForm[x_] -> x] != 0 &)] -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.213.88 ※ 編輯: jurian0101 來自: 140.112.213.88 (11/03 15:49)

11/03 15:50, , 1F
阿咧阿咧? 查了維基發現跑出來的元素數目不對...
11/03 15:50, 1F
文章代碼(AID): #1GbCmXeX (Mathematica)
文章代碼(AID): #1GbCmXeX (Mathematica)