兴趣来了,编写一个求行列式的程序,关键要解决两个问题
1)行列式列序号的全排列
2)行列式的符号
#include <iostream>
#include <vector>
using namespace std;
#define LEN 3
#define COUNT 3*2*1 // the count of premutation for length 3
int idx[LEN] = { 0,1,2};
int premus[COUNT][LEN+1]; // last elemet for store inversion number
int premus_pos = 0;
int box[LEN][LEN] = { // sample data
{ 1, 2, 3 },
{ 4, 5, 5 },
{ 2, 4, 6 } };
void arrayCopy(int src[], int dst[]) {
for( int i=0; i<LEN; i++)
dst[i] = src[i];
}
int inveNumber(int a[]){ // return inversion number
int num = 0;
for(int i=1; i<LEN; i++){
for( int j=0; j<i; j++){
if ( a[i] < a[j])
num++;
}
}
return num;
}
void premu( int a[], int begin, int size) { // premutation
if ( begin == size-1){
arrayCopy( idx, premus[premus_pos]);
premus[premus_pos][LEN] = inveNumber(idx);
for( int i=0; i<= LEN; i++)
cout << " " << premus[premus_pos][i];
cout << endl;
premus_pos++;
return;
}
premu( a, begin+1, size);
for(int i=begin+1; i< size; i++) {
//switch first element
int t=a[begin];
a[begin] = a[i];
a[i] = t;
//recurisive
premu( a,begin+1, size);
//switch back
a[i] = a[begin];
a[begin] = t;
}
}
int main() {
cout << "---go---" << endl;
// get permeations
premu(idx,0,LEN);
cout << "premus_pos:" << premus_pos << endl;
int result = 0;
for(int i=0; i<COUNT; i++){
int item=1;
for( int j=0; j<LEN; j++){
item *= box[j][premus[i][j]];
}
// check sign
if ( premus[i][LEN]%2 != 0)
item = -item;
result += item;
}
cout << "result is " << result << endl;
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
#define LEN 3
#define COUNT 3*2*1
int idx[LEN] = { 0,1,2};
int premus[COUNT][LEN+1]; // last elemet for store inversion number
int premus_pos = 0;
int box[LEN][LEN] = {
{ 1, 2, 3 },
{ 4, 5, 5 },
{ 2, 4, 6 } };
/*
int box[LEN][LEN] = {
{ 1, 2 },
{ 6, 7 } };
*/
void arrayCopy(int src[], int dst[]) {
for( int i=0; i<LEN; i++)
dst[i] = src[i];
}
int inveNumber(int a[]){
int num = 0;
for(int i=1; i<LEN; i++){
for( int j=0; j<i; j++){
if ( a[i] < a[j])
num++;
}
}
return num;
}
void premu( int a[], int begin, int size) {
if ( begin == size-1){
arrayCopy( idx, premus[premus_pos]);
premus[premus_pos][LEN] = inveNumber(idx);
for( int i=0; i<= LEN; i++)
cout << " " << premus[premus_pos][i];
cout << endl;
premus_pos++;
return;
}
premu( a, begin+1, size);
for(int i=begin+1; i< size; i++) {
//switch first element
int t=a[begin];
a[begin] = a[i];
a[i] = t;
//recurisive
premu( a,begin+1, size);
//switch back
a[i] = a[begin];
a[begin] = t;
}
}
int main() {
cout << "---go---" << endl;
// get permeations
premu(idx,0,LEN);
cout << "premus_pos:" << premus_pos << endl;
int result = 0;
for(int i=0; i<COUNT; i++){
int item=1;
for( int j=0; j<LEN; j++){
item *= box[j][premus[i][j]];
}
// check sign
if ( premus[i][LEN]%2 != 0)
item = -item;
result += item;
}
cout << "result is " << result << endl;
return 0;
}
int main() {
cout << "---go---" << endl;
// get permeations
premu(idx,0,LEN);
cout << "premus_pos:" << premus_pos << endl;
int result = 0;
for(int i=0; i<COUNT; i++){
int item=1;
for( int j=0; j<LEN; j++){
item *= box[j][premus[i][j]];
}
// check sign
if ( premus[i][LEN]%2 != 0)
item = -item;
result += item;
}
cout << "result is " << result << endl;
return 0;
}---- 输出如下--- 可以看了列序号为 0 1 2 的全排列和对应的逆序数
---go---
0 1 2 0
0 2 1 1
1 0 2 1
1 2 0 2
2 1 0 3
2 0 1 2
premus_pos:6
result is 0 // 当然是 0, sample data 中有两行对应成比例
1万+



被折叠的 条评论
为什么被折叠?



