本文主要是介绍Maple与生活,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我送你一个小矩阵~心意全在行列式里
- 1. 引子
- 2. 求解步骤与评价
- 3. 最终结果
- 3.1. 测试1
- 3.2. 测试2
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的listif 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确实可以快速输出答案,但我的程序也不能白写。拍张照片才能明白心意也算是一种浪漫,于是不甘心的我改了串更复杂的数字把矩阵发给她希望能感动到落泪~
这篇关于Maple与生活的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!