+ -
当前位置:首页 → 问答吧 → 很笨的方法计算行列式的值

很笨的方法计算行列式的值

时间:2006-12-30

来源:互联网

两个核心函数分别是
计算逆序数
全排列函数

哪位高人帮我把这两个核心函数改改(主要是full_sort函数,效率太低了),
整个运算会加快,也会减少限制
计算公式是

$p的属于1,2,3。。。。n全排列中的一个
所有可能的$p代入下式
array[0][$p[0]]×array[1][$p[1]]×array[2][$p[2]]×.......×array[n-1][$p[n-1]]

再乘上(-1)^$P的逆序数
然后把所有的加起来
结果得出#
举个列子
行列式:
  1   2   3
   4   5   6
   7   8   9
所有可能的
$p=array(0,1,2);逆序数为0
$p=array(1,0,2);逆序数为1
$p=array(1,2,0);逆序数为2
$p=array(2,0,1);逆序数为2
$p=array(2,1,0);逆序数为3
$p=array(0,2,1);逆序数为1

则有
array[0][0]×array[1][1]×array[2][2]×(-1)^0
+
array[0][1]×array[1][0]×array[2][2]×(-1)^1
+
array[0][1]×array[1][2]×array[2][0]×(-1)^2
+
array[0][2]×array[1][0]×array[2][1]×(-1)^2
+
array[0][2]×array[1][1]×array[2][0]×(-1)^3
+
array[0][0]×array[1][2]×array[2][1]×(-1)^1
=结果
复制PHP内容到剪贴板
PHP代码:

<?php
function num_sort($array){//计算逆序数
    $t = 0;
    $length = strlen($array);
    for($j=1;$j < $length;$j++){
        for($i=0;$i<$length-$j;$i++){
            if($array[$i]<$array[$i+1]){
                $temp = $array[$i];
                $array[$i] = $array[$i+1];
                $array[$i+1] = $temp;
                $t++;
            }
        }
    }
    return $t;
}
function calculate($array,$rank,$sort){
    $result=pow(-1,num_sort($sort));
    for($i=0;$i<$rank;$i++){
        $result*= $array[$i][$sort[$i]];
    }
    return $result;
}
function full_sort($pullin,$level){//全排列函数  并计算
    $len = $level;
    for($i=0;$i<$len;$i++){
        $a[]    = 0;
        $numr[] = $i;
    }
    for($a[$len-1]=0;$a[$len-1]<=$len;$a[$len-1]++){
        if($a[0]==$len) break;
        for($i=1;$i<$len;$i++){
            if($a[$i]==$len){
                $a[$i-1]++;
                for($j=$i;$j<$len-1;$j++){
                    $a[$i]=0;
                }
                $a[$len-1]=-1;
                $skip=true;
                break;
            }
        }
        if($skip){
            $skip=false;
            continue;
        }
        $pass =1;
        foreach($numr as $num){
            if(in_array($num,$a)){
                $pass *= 1;
            }else{
                $pass *= 0;
            }
        }
        if($pass){
            $k++;
            for($i=0;$i<$len;$i++){
                $str[$i] = $numr[$a[$i]];
            }
            $result += calculate($pullin,$level,$str);
        }
    }
    return $result;
}
$n           = 4;
$array[0][0] = 1; $array[0][1] = 1; $array[0][2] = 1; $array[0][3] = 1;
$array[1][0] = 1; $array[1][1] = 2; $array[1][2] = 4; $array[1][3] = 8;
$array[2][0] = 1; $array[2][1] = 3; $array[2][2] = 9; $array[2][3] = 27;
$array[3][0] = 1; $array[3][1] = 4; $array[3][2] = 16;$array[3][3] = 64;
set_time_limit(0);
$begin = explode(' ', microtime());
echo full_sort($array,4);
$end = explode(' ', microtime());
$time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
echo '<br>';
echo "执行时间:{$time}秒";
?>

作者: muqiao   发布时间: 2006-12-30


顶下lz

作者: fengyun   发布时间: 2007-01-08

热门下载

更多