[心得] 產生GL(n,F_p)的矩陣
標題的意思是,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
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章