四阶行列式直接展开_【Just For Fun】n 階行列式計算 宏 生成器,四阶行列式的最优展开…「终于解决」

四阶行列式直接展开_【Just For Fun】n 階行列式計算 宏 生成器,四阶行列式的最优展开…「终于解决」【JustForFun】本系列纯粹娱乐、研究用。一些旁门左道的东西。事实上可能完全没用。(๑•̀ω•́๑)要用用这个,下面那个有bug。当然你可以先透过这篇文章去了解这是什么。___用于生成n阶行列式的计算宏,以直接展开的方式,例如:#defineDet2_macro(a1,a2,a3,a4)((a1)*(a4)-(a2)*(a3))下面的代码是中学时(大約高二…

大家好,欢迎来到IT知识分享网。

【Just For Fun】本系列纯粹娱乐、研究用。一些旁门左道的东西。

事实上可能完全没用。 (๑•̀ω•́๑)

要用用这个,下面那个有 bug。

当然你可以先透过这篇文章去了解这是什么。

___

用于生成 n 阶行列式的计算 宏,

以直接展开的方式,例如:

#define Det2_macro(a1, a2, a3, a4) ((a1) * (a4) – (a2) * (a3))

下面的代码是中学时(大約高二到三)写的,惨不忍睹,

▌n 阶行列式计算 宏 生成器:

//#define _CRT_SECURE_NO_WARNINGS

#include #include

int main() {

int upperlimit;

printf(“It will pack up last one, upperlimit direct ratio to data side,\n”);

printf(“upperlimit(<3 || >20 = exit):”);

scanf_s(“%d”, &upperlimit);

if (upperlimit < 3 || upperlimit > 20) {

return -1;

}

errno_t err;

FILE* wf;

err = fopen_s(&wf, “Det_macro.txt”, “w”);

int posneg = 1;

int firstone;

int printf_k;

fprintf(wf, “#define Det2_macro(a1, a2, a3, a4) ((a1) * (a4) – (a2) * (a3))\n”);

for (int side = 3; side <= upperlimit; side++) {

fprintf(wf, “#define Det%d_macro(“, side);

for (int j = 1; j < side * side; j++) {

fprintf(wf, “a%d,”, j);

}

fprintf(wf, “a%d) (“, side * side);

for (int ax = 1; ax <= side; ax++) {

if (posneg) {

fprintf(wf, “+”);

posneg–;

}

else {

fprintf(wf, “-“);

posneg++;

}

fprintf(wf, “(a%d) * Det%d_macro(“, ax, side – 1);

firstone = 1;

for (int k = side + 1; k <= side * side; k++) {

printf_k = 0;

for (int j = 1; j < side; j++) {

if (k – j * side == ax) {

printf_k = 1;

}

}

if (!printf_k) {

if (firstone) {

fprintf(wf, “a%d”, k);

firstone–;

}

else {

fprintf(wf, “,a%d”, k);

}

}

}

fprintf(wf, “)”);

}

fprintf(wf, “)\n”);

}

//packupfprintf(wf, “#define Det%d_macro2(a) (“, upperlimit);

for (int ax = 1; ax <= upperlimit; ax++) {

if (posneg) {

fprintf(wf, “+”);

posneg–;

}

else {

fprintf(wf, “-“);

posneg++;

}

fprintf(wf, “*(a + %d) * Det%d_macro(“, ax – 1, upperlimit – 1);

firstone = 1;

for (int k = upperlimit + 1; k <= upperlimit * upperlimit; k++) {

printf_k = 0;

for (int j = 1; j < upperlimit; j++) {

if (k – j * upperlimit == ax) {

printf_k = 1;

}

}

if (!printf_k) {

if (firstone) {

fprintf(wf, “*(a + %d)”, k – 1);

firstone–;

}

else {

fprintf(wf, “,*(a + %d)”, k – 1);

}

}

}

fprintf(wf, “)”);

}

fprintf(wf, “)\n”);

fclose(wf);

}

// 可读性极差,痛苦(掩面(扶额

这个程序会生成以下的文件:

#define Det2_macro(a1, a2, a3, a4) ((a1) * (a4) – (a2) * (a3))

#define Det3_macro(a1,a2,a3,a4,a5,a6,a7,a8,a9) (+(a1) * Det2_macro(a5,a6,a8,a9)-(a2) * Det2_macro(a4,a6,a7,a9)+(a3) * Det2_macro(a4,a5,a7,a8))

#define Det4_macro(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16) (-(a1) * Det3_macro(a6,a7,a8,a10,a11,a12,a14,a15,a16)+(a2) * Det3_macro(a5,a7,a8,a9,a11,a12,a13,a15,a16)-(a3) * Det3_macro(a5,a6,a8,a9,a10,a12,a13,a14,a16)+(a4) * Det3_macro(a5,a6,a7,a9,a10,a11,a13,a14,a15))

#define Det5_macro(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25) (-(a1) * Det4_macro(a7,a8,a9,a10,a12,a13,a14,a15,a17,a18,a19,a20,a22,a23,a24,a25)+(a2) * Det4_macro(a6,a8,a9,a10,a11,a13,a14,a15,a16,a18,a19,a20,a21,a23,a24,a25)-(a3) * Det4_macro(a6,a7,a9,a10,a11,a12,a14,a15,a16,a17,a19,a20,a21,a22,a24,a25)+(a4) * Det4_macro(a6,a7,a8,a10,a11,a12,a13,a15,a16,a17,a18,a20,a21,a22,a23,a25)-(a5) * Det4_macro(a6,a7,a8,a9,a11,a12,a13,a14,a16,a17,a18,a19,a21,a22,a23,a24))

#define Det5_macro2(a) (+*(a + 0) * Det4_macro(*(a + 6),*(a + 7),*(a + 8),*(a + 9),*(a + 11),*(a + 12),*(a + 13),*(a + 14),*(a + 16),*(a + 17),*(a + 18),*(a + 19),*(a + 21),*(a + 22),*(a + 23),*(a + 24))-*(a + 1) * Det4_macro(*(a + 5),*(a + 7),*(a + 8),*(a + 9),*(a + 10),*(a + 12),*(a + 13),*(a + 14),*(a + 15),*(a + 17),*(a + 18),*(a + 19),*(a + 20),*(a + 22),*(a + 23),*(a + 24))+*(a + 2) * Det4_macro(*(a + 5),*(a + 6),*(a + 8),*(a + 9),*(a + 10),*(a + 11),*(a + 13),*(a + 14),*(a + 15),*(a + 16),*(a + 18),*(a + 19),*(a + 20),*(a + 21),*(a + 23),*(a + 24))-*(a + 3) * Det4_macro(*(a + 5),*(a + 6),*(a + 7),*(a + 9),*(a + 10),*(a + 11),*(a + 12),*(a + 14),*(a + 15),*(a + 16),*(a + 17),*(a + 19),*(a + 20),*(a + 21),*(a + 22),*(a + 24))+*(a + 4) * Det4_macro(*(a + 5),*(a + 6),*(a + 7),*(a + 8),*(a + 10),*(a + 11),*(a + 12),*(a + 13),*(a + 15),*(a + 16),*(a + 17),*(a + 18),*(a + 20),*(a + 21),*(a + 22),*(a + 23)))

这是输入 5 的情况,程序限制了上限,避免生成的文件太大。(3 <= n <= 20)

有需要的自己修改源代码。

___

程序会把最后一个做 “packup” ,意思是转为可由阵列/指标使用的方式。

___

测试:

答案好像差了一个负号 ?bug 在哪里已经懒得找了……

不好意思哦 (っ´ω`c) 喵

___

这是对行列式的直接展开,貌似又称为 拉普拉斯展开 。

___

效率方面没测过,应该不强,反正只是个玩具。

___

这个不会是最优解,单单是四阶行列式就有比这个更高效率的做法。

因为中学的我很閒,很閒,超级閒(现在就不是了,・゜・(PД`q。)・゜・

去研究四阶行列式的最优展开:

equation?tex=%7B%5Cbegin%7Bvmatrix%7Da%26b%26c%26d%5C%5Ce%26f%26g%26h%5C%5Ci%26j%26k%26l%5C%5Cm%26n%26o%26p%5Cend%7Bvmatrix%7D%7D

equation?tex=%3D+%7B%5Cbegin%7Bvmatrix%7Da%26b%5C%5Ce%26f%5Cend%7Bvmatrix%7D%7D%7B%5Cbegin%7Bvmatrix%7Dk%26l%5C%5Co%26p%5Cend%7Bvmatrix%7D%7D+-+%7B%5Cbegin%7Bvmatrix%7Da%26c%5C%5Ce%26g%5Cend%7Bvmatrix%7D%7D%7B%5Cbegin%7Bvmatrix%7Dj%26l%5C%5Cn%26p%5Cend%7Bvmatrix%7D%7D%2B+%7B%5Cbegin%7Bvmatrix%7Da%26d%5C%5Ce%26h%5Cend%7Bvmatrix%7D%7D%7B%5Cbegin%7Bvmatrix%7Dj%26k%5C%5Cn%26o%5Cend%7Bvmatrix%7D%7D%2B%7B%5Cbegin%7Bvmatrix%7Db%26c%5C%5Cf%26g%5Cend%7Bvmatrix%7D%7D%7B%5Cbegin%7Bvmatrix%7Di%26l%5C%5Cm%26p%5Cend%7Bvmatrix%7D%7D-+%7B%5Cbegin%7Bvmatrix%7Db%26d%5C%5Cf%26h%5Cend%7Bvmatrix%7D%7D%7B%5Cbegin%7Bvmatrix%7Di%26k%5C%5Cm%26o%5Cend%7Bvmatrix%7D%7D%2B%7B%5Cbegin%7Bvmatrix%7Dc%26d%5C%5Cg%26h%5Cend%7Bvmatrix%7D%7D%7B%5Cbegin%7Bvmatrix%7Di%26j%5C%5Cm%26n%5Cend%7Bvmatrix%7D%7D

当中没有一个运算是重复的,论直接展开,这应该是最优解。

五阶行列式没有如此漂亮的形式。

六阶行列式有,似乎 2n 阶行列式都有。

___

中学时期还写了很多类似的玩具,有时间会尽量放在这个专栏介绍一下。

___

▌可能有兴趣的文章 ?

___

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25116.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信