大家好,欢迎来到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。)・゜・
去研究四阶行列式的最优展开:
当中没有一个运算是重复的,论直接展开,这应该是最优解。
五阶行列式没有如此漂亮的形式。
六阶行列式有,似乎 2n 阶行列式都有。
___
中学时期还写了很多类似的玩具,有时间会尽量放在这个专栏介绍一下。
___
▌可能有兴趣的文章 ?
___
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/25116.html