n次正方行列の逆行列をTeX形式で出力するプログラムを作成してみました。
言語はC++です。
#include <iostream> #include <vector> #include <algorithm> using namespace std; void make_permutation(vector<int>& a, int d, int k, vector<int> ids[]) { int n = a.size(); if(d == n){ for(int j=0; j<n; ++j) ids[k % 2].push_back(a[j] + 1); } else{ for(int i=d; i<n; ++i){ swap(a[i], a[d]); make_permutation(a, d + 1, k + (i != d), ids); swap(a[i], a[d]); } } } void expand_determinant(int n, int i, int j, const char* str, ostream& out) { vector<int> a(n); for(int k=0; k<n; ++k) a[k] = k + (j <= k); vector<int> ids[2]; make_permutation(a, 0, 0, ids); bool sign = (i + j) % 2; for(int k=0; k<2; ++k){ int id = (sign + k) % 2; for(int l=0; l<static_cast<int>(ids[id].size())/n; ++l){ if(k || l) out << (k ? "-" : "+"); for(int m=0; m<n; ++m) out << str << "_{{" << (m + (i <= m) + 1) << "}{" <<ids[id][n*l+m] << "}}"; } } } int main() { int n; cin >> n; cout << "\\frac{1}{"; expand_determinant(n, n, n, "a", cout); cout << "}"; if(2 <= n){ cout << "\\begin{pmatrix}"; for(int i=0; i<n; ++i){ cout << (i ? "\\\\" : ""); for(int j=0; j<n; ++j){ cout << (j ? "&" : ""); expand_determinant(n-1, j, i, "a", cout); } } cout << "\\end{pmatrix}"; } cout << endl; return 0; }
|
試しに、幾つか出力させてみたのを貼りつけてみました。
1次正方行列

2次正方行列

3次正方行列

4次正方行列
2011-06-07 00:22:11
twitterやってます-> @natrium11321
NazoLab大好き

このノートを携帯でも見る