【Just For Fun】
本系列纯粹娱乐、研究用。一些旁门左道的东西。
事实上可能完全没用。 (๑•̀ω•́๑)
重构版本: 【Just For Fun】n 階行列式計算 宏 生成器(重构)
要用用这个,下面那个有 bug。
当然你可以先透过这篇文章去了解这是什么。
___
用于生成 n 阶行列式的计算 宏,
以直接展开的方式,例如:
#define Det2_macro(a1, a2, a3, a4) ((a1) * (a4) - (a2) * (a3))
下面的代码是中学时(大約高二到三)写的,惨不忍睹,
务必不要深究,你会看得很痛苦,我有空来做重构。(【Just For Fun】n 階行列式計算 宏 生成器(重构)
▌n 阶行列式计算 宏 生成器:
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
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");
}
//packup
fprintf(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" ,意思是转为可由阵列/指标使用的方式。
___
测试:
![1da8baea2075b6ccf05b8deb4b9e20e6.png](https://i-blog.csdnimg.cn/blog_migrate/d68c1b0e8086d65ae1fe1c29a597f659.jpeg)
![3b9ac9da5586c84ddeda0938b4d4119a.png](https://i-blog.csdnimg.cn/blog_migrate/fededdb3960e48e2fe6db3d998ab8d2d.png)
![ac3d6d1fe50f16469493bf9f29c89b3d.png](https://i-blog.csdnimg.cn/blog_migrate/e3edd192e835a91be2c34af6ed35a5f6.jpeg)
答案好像差了一个负号 ?bug 在哪里已经懒得找了......
不好意思哦 (っ´ω`c) 喵
有空的话我会直接重写一个。【Just For Fun】n 階行列式計算 宏 生成器(重构)
___
这是对行列式的直接展开,貌似又称为 拉普拉斯展开 。
___
效率方面没测过,应该不强,反正只是个玩具。
___
这个不会是最优解,单单是四阶行列式就有比这个更高效率的做法。
因为中学的我很閒,很閒,超级閒(现在就不是了,・゜・(PД`q。)・゜・
去研究四阶行列式的最优展开:
当中没有一个运算是重复的,论直接展开,这应该是最优解。
五阶行列式没有如此漂亮的形式。
六阶行列式有,似乎 2n 阶行列式都有。
___
中学时期还写了很多类似的玩具,有时间会尽量放在这个专栏介绍一下。
___
▌可能有兴趣的文章 ?
![8fc5a9cfbda89f3be57386ce3690e32e.png](https://i-blog.csdnimg.cn/blog_migrate/788d2df28632d3fffdc09f8723726200.jpeg)
【Just For Fun】拉格朗日插值多项式生成器
___
【Just For Fun】俺 是 目 录 !