四阶行列式直接展开_【Just For Fun】n 階行列式計算 宏 生成器,四阶行列式的最优展开...

【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

3b9ac9da5586c84ddeda0938b4d4119a.png

ac3d6d1fe50f16469493bf9f29c89b3d.png

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

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

有空的话我会直接重写一个。【Just For Fun】n 階行列式計算 宏 生成器(重构)

___

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

___

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

___

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

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

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

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

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

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

___

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

___

▌可能有兴趣的文章 ?

8fc5a9cfbda89f3be57386ce3690e32e.png

【Just For Fun】拉格朗日插值多项式生成器

___

【Just For Fun】俺 是 目 录 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值