垃圾行列式 学习笔记

这东西坑人……

整数

一般会要求取模,而且模数不一定是质数。

void Dswap(int N,int p,int q){
	rep(i,1,N)swap(a[p][i],a[q][i]);
}

void deter(int N){
	bool fu=0;
	rep(i,1,N){
		int wei=i;bool flag=0;
		rep(j,i,N){
			if(a[j][i]&&!flag)flag=1;
			if(a[j][i]&&a[j][i]<a[wei][i])wei=j;
		}
		if(!flag){ans=0;return;}
		if(i!=wei)Dswap(N,i,wei),fu=1-fu;
		rep(j,i+1,N){
			if(a[j][i]>a[i][i]){Dswap(N,i,j);fu=1-fu;}
			while(a[j][i]){
				lon tmp=a[i][i]/a[j][i];
				rep(k,i,N)a[i][k]=(a[i][k]+(mo-tmp)*a[j][k])%mo;				
				Dswap(N,i,j);
				fu=1-fu;
			}
		}
		ans=ans*a[i][i]%mo;
	}
	if(fu)ans=(-ans+mo)%mo;
}

常数小,但是不能处理模数不是质数的情况:(有锅待修,先别用!!)

void Dswap(int N,int p,int q){
	rep(i,1,N)swap(a[p][i],a[q][i]);
}

void deter(int N){
    bool fu=0;
	rep(i,1,n){
		rep(j,i+1,n)while(a[j][i]){
			lon tmp=a[i][i]/a[j][i];
			rep(k,i,n)a[i][k]=(a[i][k]-tmp*a[j][k]%mo+mo)%mo;
			Dswap(N,i,j);
			fu=1-fu;
		}
		ans=(ans*a[i][i]%mo+mo)%mo;
	}
	if(fu)ans=(-ans+mo)%mo;
}

小数

注意精度,所以判断 0 的方式是 fabs(a)>eps 而不是 a==0。(eps=1e-15)

void Dswap(int N,int p,int q){
	rep(i,1,N)swap(a[p][i],a[q][i]);
}

void deter(int N){
	bool fu=0;
	rep(i,1,N){
		int wei=i;
		rep(j,i,N)if(zro(a[j][i])){wei=j;break;}
		if(i!=wei)Dswap(N,i,wei),fu=1-fu;
		rep(j,i+1,N){
			while(zro(a[j][i])&&zro(a[i][i])){
				if(a[j][i]>a[i][i]){Dswap(N,i,j);fu=1-fu;}
				lod tmp=a[j][i]/a[i][i];
				rep(k,i,N)a[j][k]=a[j][k]-tmp*a[i][k];
			}
			if(!zro(a[i][i]))Dswap(N,i,j),fu=1-fu;
		}
		ans=ans*a[i][i];
	}
	if(fu)ans=-ans;
}
原文地址:https://www.cnblogs.com/BlankAo/p/14263643.html