我送你一个小矩阵~心意全在行列式里
1. 引子
近来Maple技术交互研讨群(QQ836204107) 讨论一类矩阵的趣味行列式,大意是如何用矩阵行列式表达520、1314等情话数字。
之前有群友推送过一位搞量子力学的女up主作品,我看后也是由衷敬佩这位“喜欢物理的女孩”。当时我打趣说谁能构造一个行列式为1314520的大型矩阵放到她作品留言中看看能否让她关注到你。考虑到宇宙的本质是10=4+6&对称,随性编剧以下留言情境:
对10维弦论偏微分方程组作希尔伯特-薛定谔-爱因斯坦变换后所得到的卡拉比-丘流形,提取对应特征系数生成10阶矩阵。史聪闵格指出其行列式是解开时空之谜谎言的钥匙。你从万能淘宝上买到霍金老人家临终前的手稿,卖家说他当时得出答案后想起少年时一位故人以及为她在大榕树下立下的誓言,脸上流露出复杂一笑。于是有缘人把问题贴在此处,等待有缘up主解开~
M
=
(
1
2
9
7
8
9
4
4
5
7
2
6
30
18
22
30
14
12
12
22
9
30
154
89
109
162
82
68
59
115
7
18
89
62
71
114
70
56
52
77
8
22
109
71
86
132
88
62
75
106
9
30
162
114
132
338
316
231
230
247
4
14
82
70
88
316
973
−
1936
−
776
−
4699
4
12
68
56
62
231
−
1936
9441
4754
20278
5
12
59
52
75
230
−
776
4754
2655
10385
7
22
115
77
106
247
−
4699
20278
10385
45621
)
M=\footnotesize\left( \begin {array}{cccccccccc} 1&2&9&7&8&9&4&4&5&7 \\\\ 2&6&30&18&22&30&14&12&12&22\\\\ 9 &30&154&89&109&162&82&68&59&115\\\\ 7&18&89&62&71&114& 70&56&52&77\\\\ 8&22&109&71&86&132&88&62&75&106 \\\\ 9&30&162&114&132&338&316&231&230&247 \\\\ 4&14&82&70&88&316&973&-1936&-776&-4699 \\\\ 4&12&68&56&62&231&-1936&9441&4754&20278 \\\\ 5&12&59&52&75&230&-776&4754&2655&10385 \\\\ 7&22&115&77&106&247&-4699&20278&10385&45621 \end {array} \right)
M=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛129789445726301822301412122293015489109162826859115718896271114705652778221097186132886275106930162114132338316231230247414827088316973−1936−776−4699412685662231−19369441475420278512595275230−776475426551038572211577106247−4699202781038545621⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
d
e
t
(
M
)
=
?
det(M)=?
det(M)=?
问题描述:给出一个计算行列式为 N N N的 n n n阶对称矩阵程序。
2. 求解步骤与评价
当时群里留下问题以后我就放下手机。然而它一直困扰着我睡不着觉,等到12.过后想明白解法才有所缓解。拿起手机发现一位MMA大佬用LU分解给出做法,以下是个人思考步骤与求解过程。
step1 正常想法是构造对角矩阵,使得其行列式为
N
N
N,即:
V
=
d
i
a
g
o
n
a
l
(
λ
1
,
.
.
.
,
λ
n
)
,
∏
i
=
1
n
λ
i
=
N
V=diagonal(\lambda_1,...,\lambda_n),\prod_{i=1}^n\lambda_i=N
V=diagonal(λ1,...,λn),i=1∏nλi=N
显然,这种结果太过直白,一个因式分解加排列组合就能解决的问题,绝对无法百转千回表达藏涅在内心深处的情愫。以我19年好人、老实人的经验来判断,表达心意的矩阵一定要复杂,第一眼要给对方一脸懵逼的感觉,等Ta千辛万苦算完再送上满心万马奔腾。
step2 注意到矩阵相乘下行列式具有可交换性,尝试对
V
V
V作相似变换能否实现目的。这是因为
d
e
t
(
S
V
S
−
1
)
=
d
e
t
(
V
S
−
1
S
)
=
d
e
t
(
V
)
det(SVS^{-1})=det(VS^{-1}S)=det(V)
det(SVS−1)=det(VS−1S)=det(V)
如果能实现矩阵 S S S每个元素为整数,同时 S − 1 S^{-1} S−1每个元素亦为整数,这样能保证 M M M每个元素为整数且行列式为n。出于复杂性考虑,我们期待 S ≠ I d S\not ={Id} S=Id(稀疏性不能太差,最好是有一半以上非零元素)。随后我们会发现,这个想法实现起来较为繁琐。更重要的是,相似变换无法保证最终结果为对称矩阵。
step3 注意到对角矩阵相合变换后仍为对称阵
(
S
V
S
T
)
T
=
S
V
S
T
(SVS^T)^T=SVS^T
(SVST)T=SVST,进而考虑能够构造元素为整数的矩阵
S
S
S,使得
d
e
t
(
S
)
=
±
1
det(S)=\pm1
det(S)=±1?
“任意下(上)三角型矩阵,其行列式等于对角线元素乘积”这一事实给了我们很大启发。构造下三角型矩阵
S
S
S,使得对角线元素在集合
{
1
,
−
1
}
\{1,-1\}
{1,−1}中随机取值,其余非零元素为指定范围下的随机整数。从而控制该矩阵一半以上元素非零保持相合变换结果矩阵的复杂性。
S
=
[
1
0
⋮
⋱
a
n
1
…
−
1
]
n
×
n
S=\begin{bmatrix} 1 & & 0\\ \vdots & \ddots \\ a_{n1} & \dots & -1 \end{bmatrix}_{n \times n}
S=⎣⎢⎡1⋮an1⋱…0−1⎦⎥⎤n×n
于是我们设计如下Maple程序:
accost_matrix_generate:=proc(N::integer,n::integer:=10)
local factor_seq,num,V,RP,IR,P,Sigma;
RP,IR:=combinat[randperm],RandomTools[Generate]@integer:
#因式分解n并转化成seq型
factor_seq:=map(t->t[1]$t[2],ifactors(N)[2])[];
num:=nops([factor_seq]):
#转化成N个乘积为n的list
if num <=n then
#不足N个则补1并随机排序
V:=RP([factor_seq,1$n-num]);
else
#超过N个则取末N-1个因子、剩下因子乘积再随机排序
V:=RP([factor_seq[1-n..],`*`(factor_seq[1..num-n+1])]);
end if;
#构造对角线元素为{1,-1}、其余位置为随机正整数的下三角矩阵
P:=Matrix(n,(i,j)->if i<j then 0 elif i=j then IR(range=-1 ..1,exclude={0}) else IR(range=1..n) end if):
#构造行列式为n的对角矩阵
Sigma:=LinearAlgebra[DiagonalMatrix](V,n,n):
#如下型保持行列式乘积不变且生成矩阵为对称型
P.Sigma.P^+;
end proc:
3. 最终结果
3.1. 测试1
#一生一世我爱你
accost_matrix_generate(1314520)
M
=
(
1
2
9
7
8
9
4
4
5
7
2
6
30
18
22
30
14
12
12
22
9
30
154
89
109
162
82
68
59
115
7
18
89
62
71
114
70
56
52
77
8
22
109
71
86
132
88
62
75
106
9
30
162
114
132
338
316
231
230
247
4
14
82
70
88
316
973
−
1936
−
776
−
4699
4
12
68
56
62
231
−
1936
9441
4754
20278
5
12
59
52
75
230
−
776
4754
2655
10385
7
22
115
77
106
247
−
4699
20278
10385
45621
)
M=\left( \begin {array}{cccccccccc} 1&2&9&7&8&9&4&4&5&7 \\\\ 2&6&30&18&22&30&14&12&12&22\\\\ 9 &30&154&89&109&162&82&68&59&115\\\\ 7&18&89&62&71&114& 70&56&52&77\\\\ 8&22&109&71&86&132&88&62&75&106 \\\\ 9&30&162&114&132&338&316&231&230&247 \\\\ 4&14&82&70&88&316&973&-1936&-776&-4699 \\\\ 4&12&68&56&62&231&-1936&9441&4754&20278 \\\\ 5&12&59&52&75&230&-776&4754&2655&10385 \\\\ 7&22&115&77&106&247&-4699&20278&10385&45621 \end {array} \right)
M=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛129789445726301822301412122293015489109162826859115718896271114705652778221097186132886275106930162114132338316231230247414827088316973−1936−776−4699412685662231−19369441475420278512595275230−776475426551038572211577106247−4699202781038545621⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
d
e
t
(
M
)
=
1314520
det(M)=1314520
det(M)=1314520
我把这个矩阵给一位聪明小哥哥计算时,期望他好歹花个二三十分钟再给出一个惊鸿一瞥答案。然而10秒过后他说用Maple Companion拍照就能速出答案还给我发了张图片……
3.2. 测试2
#抱抱你亲亲你一生一世我爱你
accost_matrix_generate(8807701314520)
M
=
(
31337
250696
94011
62674
156685
250696
156685
282033
313370
219359
250696
2005569
752085
501390
1253476
2005565
1253474
2256255
2506957
1754863
94011
752085
282044
188030
470073
752113
470087
846136
940133
658116
62674
501390
188030
125355
313394
501422
313397
564104
626761
438749
156685
1253476
470073
313394
783561
1253606
783491
1410313
1566906
1096867
250696
2005565
752113
501422
1253606
2005869
1253700
2256587
2507163
1755077
156685
1253474
470087
313397
783491
1253700
1153503
−
438656
−
281990
727187
282033
2256255
846136
564104
1410313
2256587
−
438656
11784270
12066079
3823582
313370
2506957
940133
626761
1566906
2507163
−
281990
12066079
12379933
4043015
219359
1754863
658116
438749
1096867
1755077
727187
3823582
4043015
1905619
)
M=\footnotesize\left(\begin {array}{cccccccccc} 31337&250696&94011&62674&156685&250696&156685&282033&313370&219359\\\\ 250696&2005569& 752085&501390&1253476&2005565&1253474&2256255&2506957&1754863\\\\ 94011&752085&282044&188030&470073&752113&470087& 846136&940133&658116\\\\ 62674&501390&188030&125355& 313394&501422&313397&564104&626761&438749\\\\ 156685& 1253476&470073&313394&783561&1253606&783491&1410313&1566906&1096867\\\\ 250696&2005565&752113&501422&1253606&2005869& 1253700&2256587&2507163&1755077\\\\ 156685&1253474& 470087&313397&783491&1253700&1153503&-438656&-281990&727187 \\\\ 282033&2256255&846136&564104&1410313&2256587&- 438656&11784270&12066079&3823582\\\\ 313370&2506957& 940133&626761&1566906&2507163&-281990&12066079&12379933&4043015\\\\ 219359&1754863&658116&438749&1096867&1755077& 727187&3823582&4043015&1905619\end {array}\right)
M=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛31337250696940116267415668525069615668528203331337021935925069620055697520855013901253476200556512534742256255250695717548639401175208528204418803047007375211347008784613694013365811662674501390188030125355313394501422313397564104626761438749156685125347647007331339478356112536067834911410313156690610968672506962005565752113501422125360620058691253700225658725071631755077156685125347447008731339778349112537001153503−438656−281990727187282033225625584613656410414103132256587−43865611784270120660793823582313370250695794013362676115669062507163−28199012066079123799334043015219359175486365811643874910968671755077727187382358240430151905619⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞
d
e
t
(
M
)
=
8807701314520
det(M)=8807701314520
det(M)=8807701314520
虽然用Maple Companion确实可以快速输出答案,但我的程序也不能白写。拍张照片才能明白心意也算是一种浪漫,于是不甘心的我改了串更复杂的数字把矩阵发给她希望能感动到落泪~