精华内容
下载资源
问答
  • 基于AWGN信道循环置换矩阵的LDPC编码的新构造
  • 有效地计算基本 NxN 循环置换矩阵的 'l' 次幂(默认值:l = 1)。 基于“循环置换矩阵”的定义:“矩阵分析”,Rogers A. Horn 和 Charles A. Johnson,剑桥大学出版社,1985(第 26 页) 例如 rand*circperm(5,1...
  • 基于随机置换矩阵循环耦合LDPC码
  • 置换矩阵

    2021-04-05 19:39:45
    置换矩阵 题解 首先对于有大于1个环的情况,明显行列式值是为零的。 因为这种情况必定有一个环的长度小于∣n2∣\left|\frac{n}{2}\right|∣∣​2n​∣∣​,所以就一定可以将一个环的区域全部消成0,这样答案就肯定...

    置换矩阵

    在这里插入图片描述

    题解

    首先对于有大于1个环的情况,明显行列式值是为零的。
    因为这种情况必定有一个环的长度小于n2\left|\frac{n}{2}\right|,所以就一定可以将一个环的区域全部消成0,这样答案就肯定为0了。

    那么对于p1=n,pi=i1p_{1}=n,p_{i}=i-1的部分呢,我可以很容易看出这是一个循环行列式。
    对于循环行列式的值,我们有着一种特别的求法。
    det(A)=i=0i1(j=0n1ajωij) det(A)=\prod_{i=0}^{i-1}(\sum_{j=0}^{n-1}a_j\omega^{ij})
    f(x)=j=0n1ajxjf(x)=\sum_{j=0}^{n-1}a_jx^{j},那么有
    det(A)=i=0i1f(ωi) det(A)=\prod_{i=0}^{i-1}f(\omega^i)
    其中ω\omega表示单位根

    证明
    考虑范蒙德矩阵,
    在这里插入图片描述
    其中ωn\omega_n表示nn次单位根,即ωn=e2πn\omega_{n}=e^{\frac{2\pi}{n}}
    将范德蒙矩阵与nn阶循环行列式相乘,由于ωnn+k=ωnk\omega_n^{n+k}=\omega_n^k,有
    在这里插入图片描述
    两边取行列式,则有
    det(A)det(V)=(i=0n1f(ωnj))det(V) det(A)det(V)=(\prod_{i=0}^{n-1}f(\omega_n^j))det(V)
    考虑到det(V)=0j<i<n(ωniωnj)det(V)=\prod_{0\leqslant j<i<n}(\omega_n^i-\omega_n^j)
    wn0,wn1,...wnn1w_n^0,w_n^1,...w_n^{n-1}互不相等,故det(V)0det(V)\not = 0,有
    det(A)=i=0i1f(ωi) det(A)=\prod_{i=0}^{i-1}f(\omega^i)
    证毕

    但我们在模的意义下有如何计算呢?
    考虑到ω0,ω1,...,ωn1\omega^0,\omega^1,...,\omega^{n-1}B(x)=xn1B(x)=x^n-1的所有根,我们可以通过这东西来进行计算。
    λ1,λn\lambda_1,\lambda_nnn次多项式A(x)=f(x)A(x)=f(x)的所有根,μ1,...,μm\mu_1,...,\mu_mmm次多项式B(x)B(x)的所有根,
    定义函数F(AB)=bmni=1mA(μi)F(A,B)=b_m^n\prod_{i=1}^{m}A(\mu_i),显然F(A,B)F(A,B)就是我们要求的答案
    显然有
    F(A,B)=bmni=1nA(μi)=anmbmn(μiλj)=(1)nmanmi=1nB(λi) F(A,B)=b_m^n\prod_{i=1}^{n}A(\mu_i)=a_n^mb_m^n\prod(\mu_i-\lambda_j)=(-1)^{nm}a_n^m\prod_{i=1}^{n}B(\lambda_i)
    结合定义,可以得到以下性质

    • F(A,B)=(1)nmF(B,A)F(A,B)=(-1)^{nm}F(B,A)
    • F(A,B)=anmbmn(n=0m=0)F(A,B)=a_n^mb_m^n(n=0\lor m=0)
    • F(ACB,B)=F(A,B)(bm=1)F(A-CB,B)=F(A,B)(b_m=1)
    • F(A,B)=(1)deg(A)deg(ACB)F(ACB,B)F(A,B)=(-1)^{deg(A)-deg(A-CB)}F(A-CB,B)

    于是此时我们就可以O(n2)O(n^2)地计算出这样行列式的值了。

    但对于不是循环行列式的行列式呢?
    我们发现我们对于原循环求出的行列式可以通过对某些列的交换达到来改变原序列,从而使它成为循环行列式。
    我们接着就可以发现交换次数只会改变的行列式的正负,而交换次数又是等于点一的路径的序列的逆序对数的。
    所以我们只需要做完子任务3后求一下逆序对数,将答案改变一下正负就能够完成subtask4了。

    总时间复杂度还是O(n2)O\left(n^2\right)

    源码

    一个正负判断了一个下午。。。

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<set>
    #include<map>
    using namespace std;
    #define MAXN 5005
    #define lowbit(x) (x&-x)
    #define reg register
    typedef long long LL;
    typedef unsigned long long uLL;
    typedef unsigned int uint;
    typedef pair<int,int> pii;
    const int INF=0x7f7f7f7f;
    const int mo=1e9+7;
    const double PI=acos(-1.0);
    template<typename _T>
    _T Fabs(_T x){return x<0?-x:x;}
    template<typename _T>
    void read(_T &x){
    	_T f=1;x=0;char s=getchar();
    	while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
    	while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}
    	x*=f;
    }
    int n,m,a[MAXN],p[MAXN],q[MAXN],A[MAXN],B[MAXN],pp[MAXN];
    int add(int x,int y){return x+y<mo?x+y:x+y-mo;}
    int qkpow(int a,int s){int t=1;while(s){if(s&1)t=1ll*a*t%mo;a=1ll*a*a%mo;s>>=1;}return t;}
    signed main(){
    	freopen("matrix.in","r",stdin);
    	freopen("matrix.out","w",stdout);
    	read(n);m=n;int ans=1,now=1,tmp=0,sum=0;
    	for(int i=1;i<=n;i++)read(a[i]);
    	for(int i=1;i<=n;i++)read(p[i]),q[p[i]]=i;pp[1]=1;
    	now=q[1];tmp++;while(now^1)pp[tmp+1]=now,now=q[now],tmp++;
    	if(tmp<n){puts("0");return 0;}
    	for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(pp[i]>pp[j])sum++;
    	for(int i=0;i<n;i++)A[i]=a[pp[i+1]];B[0]=mo-1;B[m]=1;n--;ans=1;
    	while(1){
    		if(n<m)swap(A,B),ans=(n&m)&1?mo-ans:ans,swap(n,m);
    		if(!m){ans=1ll*ans*qkpow(B[0],n)%mo;break;}const int d=1ll*A[n]*qkpow(B[m],mo-2)%mo;
    		for(int i=m;i>=0;i--)A[n-m+i]=add(A[n-m+i],mo-1ll*d*B[i]%mo);
    		int L=0;while(n&&!A[n])n--,L++;ans=1ll*ans*qkpow(B[m],L)%mo;
    	}
    	printf("%d\n",(sum&1)?add(mo,-ans):ans);
    	return 0;
    }
    

    谢谢!!!

    展开全文
  • PMn(B)表示布尔代数B = {0,1}上的所有nxn置换因子循环矩阵组成的集合.PMn(B)对于矩阵乘法成为一个半群.刻画了PMn(B)中的幂等元,并给出了半群PMn(B)中的Euler-Fermat定理.
  • 借助于快速傅氏变换(FFT)技术,给出了计算2个n阶置换因子循环矩阵之乘积阵的一种快速算法,其算术复杂性为O(nlog2n),最后给出一个算例。
  • 置换矩阵(permutation matrix)

    万次阅读 2016-06-22 22:27:12
    左行:一个矩阵或向量左乘一个 permutation matrix,交换的是该矩阵或向量的行; 右列:一个矩阵或向量右乘一个 permutation matrix,交换的是该矩阵或向量的列;
    • 左行:一个矩阵或向量左乘一个 permutation matrix,交换的是该矩阵或向量的行;
    • 右列:一个矩阵或向量右乘一个 permutation matrix,交换的是该矩阵或向量的列;

    P,A,B 分别为三阶方阵,其中 P 为置换矩阵,则 PABP=P(AB)P,也即先计算 AB,再对乘机做相应的行(P(AB))列((AB)P)交换。

    展开全文
  • 一个置换中,循环的元素的所有颜色必须相同,所以我们要计算有多少个循环,这些循环有多少种染色方法 计算染色方法 考虑在该置换内一个循环一个循环的染色,我们可以看做从不同颜色节点走向另一节点 用邻接矩阵 ...

    也许刚好的阅读体验
    Description\mathcal{Description}

    大意:给一条长度为nn的项链,有mm种颜色,另有kk条限制,每条限制为不允许x,yx,y颜色连在一起。要求有多少种本质不同的染色方式,本质不同的两种染色方式必须旋转不能互相得到。
    输入方式:
    第一行 t,t,表示t组数据
    接下来tt组数据:
    每组数据第一行为n,m,kn,m,k
    接下来kk行,每行两个数x,yx,y表示不允许x,yx,y颜色连在一起。
    答案对9973取模
    (1n109,gcd(n,9973)=1),m(1m10),k(1km(m1)/2)(1 ≤ n ≤ 10^9, gcd(n, 9973) = 1), m (1 ≤ m ≤ 10), k (1 ≤ k ≤ m(m − 1) /2)
    Solution\mathcal{Solution}

    本篇题解假设大家都会没有kk条限制的版本

    由于染色有限制,所以polyapolya定理就不好用了
    burnsideburnside定理解决(发现大家标题都打得polya,于是也这么打标题了)

    首先枚举不同的置换,即枚举循环长度,这一块和用polyapolya定理有点像
    由于nn很大,要用φ\varphi来优化
    一个置换中,循环的元素的所有颜色必须相同,所以我们要计算有多少个循环,这些循环有多少种染色方法

    计算染色方法
    考虑在该置换内一个循环一个循环的染色,我们可以看做从不同颜色节点走向另一节点
    用邻接矩阵f[i][j]f[i][j]表示从ii能否走向jj
    除去那kk条限制,所有其他的i,ji,j , f[i][j]=1f[i][j]=1,即在染为第ii种颜色后是可以染为第jj种颜色的

    这时候想到邻接矩阵的妙用,用矩乘计算nn次之后得到的f[i][j]f[i][j]的意义发生改变
    f[i][j]f[i][j]表示从ii出发,走nn步,最后结束在jj有多少种走法。
    由于是一个走一圈,所以 ii出发应在ii结束,答案贡献为f[i][i]f[i][i]
    这样就可以计算长度为nn的循环的染色方法了:求出原矩阵的nn次方后的矩阵后i=1mf[i][i]\sum_{i=1}^mf[i][i]

    注意取模
    代码

    /*******************************
    Author:Morning_Glory
    LANG:C++
    Created Time:2019年07月04日 星期四 14时25分13秒
    *******************************/
    #include <cstdio>
    #include <fstream>
    #include <cstring>
    using namespace std;
    const int maxn = 25;
    const int mod = 9973;
    //{{{cin 读入优化
    struct IO{
    	template<typename T>
    	IO & operator>>(T&res){
    		res=0;
    		bool flag=false;
    		char ch;
    		while((ch=getchar())>'9'||ch<'0')	 flag|=ch=='-';
    		while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
    		if (flag)	 res=~res+1;
    		return *this;
    	}
    }cin;
    //}}}
    int t,n,m,k,x,y,ni,ans;
    //{{{Matrix
    struct Matrix{
    	int rec[maxn][maxn];
    	Matrix(){	memset(rec,0,sizeof(rec));}
    	Matrix operator = (const Matrix &y){
    		for (int i=1;i<=m;++i)
    			for (int j=1;j<=m;++j)
    				rec[i][j]=y.rec[i][j];
    		return *this;
    	}
    	friend Matrix operator * (const Matrix &a,const Matrix &b){
    		Matrix t;
    		for (int i=1;i<=m;++i)
    			for (int j=1;j<=m;++j)
    				for (int k=1;k<=m;++k)
    					t.rec[i][j]=(t.rec[i][j]+a.rec[i][k]*b.rec[k][j])%mod;
    		return t;
    	}
    	Matrix operator ^ (int b){
    		Matrix s,a;
    		a=*this;
    		for (int i=1;i<=m;++i)	s.rec[i][i]=1;
    		for (;b;b>>=1,a=a*a)
    			if (b&1)	s=s*a;
    		return s;
    	}
    }a,b;
    //}}}Martix
    //{{{get_phi
    int get_phi (int x)
    {
    	int res=x;
    	for (int i=2;i*i<=x;++i)
    		if (x%i==0){
    			res=res/i*(i-1);
    			while (x%i==0)	x/=i;
    		}
    	if (x>1)	res=res/x*(x-1);
    	return res%mod;//此处要取模
    }
    //}}}
    //{{{ksm
    int ksm (int a,int b)
    {
    	int s=1;
    	a%=mod;
    	for (;b;a=1ll*a*a%mod,b>>=1)
    		if (b&1)	s=1ll*s*a%mod;
    	return s;
    }
    //}}}
    //{{{calc
    int calc (int x)
    {
    	b=a^x;
    	int res=0;
    	for (int i=1;i<=m;++i)	res=(res+b.rec[i][i])%mod;
    	return res;
    }
    //}}}
    int main()
    {
    	cin>>t;
    	while (t--){
    		cin>>n>>m>>k;
    		ans=0,ni=ksm(n,mod-2);//ni n的逆元
    		for (int i=1;i<=m;++i)
    			for (int j=1;j<=m;++j)
    				a.rec[i][j]=1;
    		while (k--){
    			cin>>x>>y;
    			a.rec[x][y]=a.rec[y][x]=0;
    		}
    		for (int i=1;i*i<=n;++i)
    			if (n%i==0){
    				ans=(ans+get_phi(i)*calc(n/i)%mod)%mod;
    				if (i*i!=n)	ans=(ans+get_phi(n/i)*calc(i)%mod)%mod;
    			}
    		ans=ans*ni%mod;
    		printf("%d\n",ans);
    	}
    	return 0;
    }
    
    
    展开全文
  • 循环矩阵

    千次阅读 2016-12-05 22:46:06
    今天讲讲线性代数中的一类特殊的矩阵———循环矩阵。形如:∥∥∥∥∥∥∥a1anan−1⋯a2a2a1an⋯a3a3a2a31⋯a4⋯⋯⋯⋯⋯anan−1an−2⋯a1∥∥∥∥∥∥∥\begin{Vmatrix} a_1&a_2&a_3 &\cdots &a_n \\ a_n&a_1&a_...

    今天讲讲线性代数中的一类特殊的矩阵———循环矩阵。

    形如:

    a1anan1a2a2a1ana3a3a2a3a4anan1an2a1

    的矩阵称为循环矩阵,记为A=Circ(a1,a2,a3,,an)

    P=Circ(0,1,0,,0)称为基本循环矩阵。(同时也是一个置换矩阵)

    我们有:

    A=k=0n1ak+1Pk

    P的特征多项式为:λn1
    因此它的特征值为:

    zj(j=0,1,,n1,z=e2πni,i=1)


    xj=1n(1,zj,z2j,,z(n1)j)T

    x0,x1,,xn1P的一组标准正交特征向量

    记:

    U=(x0,x1,,xn1)

    U为酉矩阵,且:
    P=Udiag(1,z,z2,,zn1)U


    f(t)=k=0n1ak+1tk

    那么:
    A=Udiag(f(1),f(z),f(z2),,f(zn1))U

    结论是:
    我们可以用一个固定的酉矩阵将所有循环矩阵酉对角化!!!

    展开全文
  • 一个置换中,循环的元素的所有颜色必须相同,所以我们要计算有多少个循环,这些循环有多少种染色方法 计算染色方法 考虑在该置换内一个循环一个循环的染色,我们可以看做从不同颜色节点走向另一节点 用邻接矩阵 ...
  • 根据循环矩阵和H-矩阵的定义,给出了H-循环矩阵的定义,并根据其特殊结构,借助于置换矩阵等工具,得到了H-循环矩阵的一些性质和判定定理。
  • ACM-矩阵置换

    千次阅读 2014-10-10 00:47:11
    ACM-矩阵置换
  • 矩阵乘法经典应用之置换

    千次阅读 2016-02-12 16:51:07
    学习用矩阵做置换的过程很...经典的置换矩阵: 比如:1 2 3 4 ---> 2 4 1 3 设转换矩阵是A。 给出置换方法: 表示第位置上的字符换到i位置上 所以 通过将置换操作分离出来成快速幂,最后和被操作序列做乘法,缩短时
  • 这玩意儿当时是用基尔霍夫矩阵推出来的。。 但是这个题的话要考虑旋转同构诶,如何和那个题的结论联系起来呢? Burnside引理:设有置换群 G = { a 1 , a 2 . . . a g } G=\{a_1,a_2...a_g\} , c ( a i ) c...
  • C语言--矩阵置换

    2018-06-08 21:54:00
    1 //takePlace里的循环写错了,j循环应该是 2 //for (j=i;j&lt;3;j++) 3 //你那个写的交换了2遍,又变回原来的了。*// 4 5 #include &lt;stdio.h&gt; 6 7 int Array[3][3]; 8 void ...
  • 置换因子循环矩阵的基础上给出了r-置换因子循环矩阵的概念,得到以这类矩阵为系数的线性方程组AX=b有解的判定条件和快速算法。当r-置换因子循环矩阵非奇异时,该快速算法求出线性方程组的唯一解,即存在唯一的r-...
  • 在用循环置换矩阵构造准循环LDPC码时会出现一类无法消除的环,称为平衡环。分析了准循环LDPC码的平衡环的结构,并给出了搜索任意长度的最简平衡环的关联矩阵的方法。
  • 2级构造D'格的QC-LDPC码原型矩阵 该软件包包含三个用于QC-LDPC代码原型矩阵的DAT文件,其块长度分别为n = 2304、5016和10008。每个DAT文件由指示代码长度的行和两...并且正元素指示右移循环置换矩阵的移位量。两个二进
  • rsa 矩阵置换 及Vernam加密算法 C#实现

    千次阅读 2012-04-29 21:23:41
    刚刚搞完密码安全的课程结束论文,des算法搞了好久没搞成,就搞了rsa 矩阵置换 及Vernam加密,上代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
  • 为使低密度奇偶校验(LDPC)码高效地应用于光通信系统中,针对光通信系统的传输特点,提出了一种新颖的基于循环置换矩阵和掩蔽矩阵构造满秩准循环低密度奇偶校验(QC-LDPC)码的方法。该方法定义了一类基矩阵,由基矩阵...
  • 这题是用欧拉函数,置换的Burnside引理和矩阵来解决的 欧拉函数euler_phi(x),求的是不超过x且与x互质的正整数个数 Burnside引理:对于一个置换f,若一个着色方案s经过置换后不变,称s为f的不动点。将f的不动...
  • 置换f下保持不变的着色方案个数C(f)=k^m(f) m(f)为循环的个数。在置换下保持不变,说明轮换中的点都染了相同的颜色。 之前提到过如果是一个n元环,旋转i,那么循环的个数为gcd(n,i),循环的长度为n/gcd(n,i) ...
  • 计算矩阵的迹

    千次阅读 2019-08-19 22:27:42
    式子中假设是单位矩阵,是矩阵,那么根据矩阵迹的循环置换(cyclic permutation)性质: 根据矩阵迹的加法性质,有: 这里可以看到,矩阵迹主要是循环置换(cyclic permutation)的性质在解决一些问题。 ...
  • 该方法在构造过程中,首先在循环置换矩阵(CPM)尺寸为无穷大的假设下,考虑各种长度小于10的环路形状导致的等式约束,以渐进方式确定出QC-LDPC码对应的指数矩阵中的每个元素的取值下界;然后根据指数矩阵确定出CPM...
  • 基于代数构造QC-LDPC码

    2015-05-18 14:17:44
    构造QC-LDPC码,基于循环置换矩阵,研究生课题,光信息科学与技术专业
  • 在达到最优线性变换的同时,针对扩散矩阵还应满足矩阵中元素尽量少的要求,对Cauchy型MDS矩阵分别与Hadmard矩阵循环移位矩阵的相互结合方式构造最优线性层的方法进行了研究。对Cauchy-Hadmard矩阵(同时是Cauchy...
  • 常见矩阵分解方法及其应用

    万次阅读 多人点赞 2018-08-13 21:48:23
    1、LU分解 ...需要注意的是,L矩阵可以是置换过的矩阵,即一个下三角矩阵和一个置换矩阵的乘积(可以参考MATLAB中LU分解的函数lu)。 参考资料: 矩阵分解资料1 矩阵分解资料2 适用范围:A可以是一...
  • 该框架所构造的QC-LDPC 码不仅满足围长至少为8 的条件, 而且还具有循环置换矩阵( CPM) 尺寸可以连续变化的优点. 该框架可以分为两个步骤: 第一步是在无穷大CPM 尺寸条件下利用确定性方法构造一个围长至少为8 的校验...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,844
精华内容 1,937
热门标签
关键字:

循环置换矩阵