结论:
1.如果χ是群G的一个不可约表示的特征标,则(χ|χ)=|G|=g。【这里的特征标内积对应GAP中的ScalarProduct,与向量内积的定义保持一致,有些文献的定义相差一个系数1/|G|】
特征标内积为∑[R∈G]χ^j(R)*χ^j(R)=|χ^j(R)|^2—a_j=1—>∑[R∈G]|χ(R)|^2=g
注意:
有些文献上定义特征标内积为(χ^i(R)|χ^j(R))=(1/g)∑[R∈G]χ^i(R)*χ^j(R)
则表示不可约的充要条件为(χ(R)|χ(R))=1
gap> [1,ComplexConjugate(E(3)),ComplexConjugate(E(3)^2)];
[ 1, E(3)^2, E(3) ]
gap> ScalarProduct([1,E(3),E(3)^2],[1,ComplexConjugate(E(3)),ComplexConjugate(E(3)^2)]);
3【所以[1,E(3),E(3)^2]、[ 1, E(3)^2, E(3) ]这2个C_3的1阶复表示都是不可约的】
2.如果χ与χ'是两个不同构的不可约表示的特征标,则(χ|χ')=0(正交关系)。
3.如果χ_1, χ_2, χ_h,是G的所有两两不同的不可约特征标,则G的每个表示的特征标φ,φ=∑[i=1->h]m_iχ_i,这里m_i=(φ|χ_i)是非负整数,(φ|φ)= ∑[i=1->h]m_i^2。 
我们有一个一般的定理:
如果φ是G的一个表示的特征标,则(φ|φ)是一个正整数n|G|,且表示不可约当前仅当(φ|φ)=|G|。
C_4、C_2×C_2的2阶表示:
C_4=<(1234)>={{{1,0},{0,1}},{{0,1},{-1,0}},{{-1,0},{0,-1}},{{0,-1},{1,0}}{<}GL_2(R),1阶元和2阶元的表示矩阵是可约的
gap> ScalarProduct([2,0,0,0],[2,0,0,0]);
4【所以C_4的这个2阶表示是不可约的】
C_2×C_2={(1),(12)(34),(13)(24),(14)(23)}={{{1,0},{0,1}},{{1,0},{0,-1}},{{-1,0},{0,1}},{{-1,0},{0,-1}}{<}GL_2(R):1阶元和3个2阶元的表示矩阵都是可约的
gap> ScalarProduct([2,0,0,-2],[2,0,0,-2]);
8【所以C_2×C_2的这个2阶表示是可约的】
C_4={1,-1,i,-i}的1阶忠实表示:1,-1,i,-i
a+bi->{{a,b},{-b,a}}
1->{{1,0},{0,1}},-1->{{-1,0},{0,-1}},i->{{0,1},{-1,0}},-i->{{0,-1},{1,0}}
gap> ScalarProduct([1,-1,E(4),-E(4)],[1,-1,-E(4),E(4)]);
4【所以C_4的这个1阶复表示是不可约的】
S_3={(1,2,3),(2,1,3),(1,3,2),(3,2,1),(3,1,2),(2,3,1)} 的2阶【维】表示:
{{1,0},{0,1}},{{-1,1},{0,1}},{{1,0},{1,-1}},{{0,-1},{-1,0}},{{-1,1},{-1,0}},{{0,-1},{1,-1}}
【1阶元和2个2阶元的表示矩阵是可约的,2个3阶元和另外1个2阶元"0,-1;-1,0"的表示矩阵是不可约的】其相应的特征标是
2,0,0,0,-1,-1
gap> ScalarProduct([2,0,0,0,-1,-1],[2,0,0,0,-1,-1]);
6【所以S_3的这个2阶表示是不可约的】
gap> g:=SymmetricGroup(3);;L:=Irr(g);;n:=Size(L);;for i in [1..n] do Print(DegreeOfCharacter(a),"->X",i,"=",List(L[i]),"\n");od;
1->X1=[ 1, -1, 1 ]
1->X2=[ 2, 0, -1 ]
1->X3=[ 1, 1, 1 ]
gap> g:=SymmetricGroup(3);;L:=Irr(g);;n:=Size(L);;for i in [1..n] do for j in [1..n] do Print("X",i,"X",j,"=",ScalarProduct(L[i],L[j]),"\n");od;od;
X1X1=1
X1X2=0
X1X3=0
X2X1=0
X2X2=1
X2X3=0
X3X1=0
X3X2=0
X3X3=1

1    ->    1
2    ->    2
3    ->    2
4    ->    3
5    ->    3
6    ->    2
N1=    6
D3的中心Z(D_3):    [1]
D3的换位子群(D_3)':    [1,4,5]
D3的群元阶的分布:    [1,3,2,0]
D3每个共轭类:    [[1],[2,3,6],[4,5]]
D3每个共轭类的长度:    [1,2,3]
root@ubuntu:/home/cpptest# ./ReachableMatrix "0,-1;1,0"
A=[[0 ,-1 ],[1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩阵不可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "-1,0;0,-1"
A=[[-1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩阵可约
Tr(A)=-2
root@ubuntu:/home/cpptest# ./ReachableMatrix "0,1;-1,0"
A=[[0 ,1 ],[-1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩阵不可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "1,0;0,1"
A=[[1 ,0 ],[0 ,1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩阵可约
Tr(A)=2
root@ubuntu:/home/cpptest# ./ReachableMatrix "1,0;0,-1"
A=[[1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩阵可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "-1,0;0,1"
A=[[-1 ,0 ],[0 ,1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩阵可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "-1,0;0,-1"
A=[[-1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩阵可约
Tr(A)=-2
root@ubuntu:/home/cpptest# ./ReachableMatrix "-1,0;0,-1"
A=[[-1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩阵可约
Tr(A)=-2
root@ubuntu:/home/cpptest# ./ReachableMatrix "-1,1;0,1"
A=[[-1 ,1 ],[0 ,1 ]]
RA=[[1 ,1 ],[0 ,1 ]]矩阵可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "1,0;1,-1"
A=[[1 ,0 ],[1 ,-1 ]]
RA=[[1 ,0 ],[1 ,1 ]]矩阵可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "0,-1;-1,0"
A=[[0 ,-1 ],[-1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩阵不可约
Tr(A)=0
root@ubuntu:/home/cpptest# ./ReachableMatrix "-1,1;-1,0"
A=[[-1 ,1 ],[-1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩阵不可约
Tr(A)=-1
root@ubuntu:/home/cpptest# ./ReachableMatrix "0,-1;1,-1"
A=[[0 ,-1 ],[1 ,-1 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩阵不可约
Tr(A)=-1

root@ubuntu:/home/cpptest# ./ReachableMatrix "4,1,2,3;0,2,3,2;0,3,5,8;0,5,0,8"
A=[[4 ,1 ,2 ,3 ],[0 ,2 ,3 ,2 ],[0 ,3 ,5 ,8 ],[0 ,5 ,0 ,8 ]]
RA=[[1 ,1 ,1 ,1 ],[0 ,1 ,1 ,1 ],[0 ,1 ,1 ,1 ],[0 ,1 ,1 ,1 ]]矩阵可约
Tr(A)=19root@ubuntu:/home/cpptest# ./ReachableMatrix "1, 0, 0, 0, 0, 0;0, 1, 0, 0, 0, 0;0, 0, 1, 0, 0, 0;0, 0, 0, 1, 0, 0;0, 0, 0, 0, 1, 0;0, 0, 0, 0, 0, 1"
A=[[1 ,0 ,0 ,0 ,0 ,0 ],[0 ,1 ,0 ,0 ,0 ,0 ],[0 ,0 ,1 ,0 ,0 ,0 ],[0 ,0 ,0 ,1 ,0 ,0 ],[0 ,0 ,0 ,0 ,1 ,0 ],[0 ,0 ,0 ,0 ,0 ,1 ]]
RA=[[1 ,0 ,0 ,0 ,0 ,0 ],[0 ,1 ,0 ,0 ,0 ,0 ],[0 ,0 ,1 ,0 ,0 ,0 ],[0 ,0 ,0 ,1 ,0 ,0 ],[0 ,0 ,0 ,0 ,1 ,0 ],[0 ,0 ,0 ,0 ,0 ,1 ]]矩阵可约
Tr(A)=6

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

// 矩阵的迹Trρ(g)称为表示的特征标
int TraceMat(const vector<vector<int> >&Matrix)
{
    int Tr=0;
    int n=Matrix.size();    
    for(int i=0;i<n;i++){
        Tr+=Matrix[i][i];
    }    
    return Tr;
}

// 返回n阶单位矩阵
vector<vector<int> > IdentityMat(int n)
{
    vector<vector<int> > Matrix(n, vector<int>(n,0));
    for(int i=0;i<n;i++){
        Matrix[i][i]=1;
    }    
    return Matrix;
}

// 求矩阵A的可达矩阵RA
// 根据可达矩阵来判断矩阵的可约性;若可达矩阵中至少有一个元素为0时,则矩阵为可约矩阵;若可达矩阵中每个元素都为1,则矩阵是不可约的。
vector<vector<int> > ReachableMatrix(const vector<vector<int> >&Matrix,bool *pIrr=NULL)
{
    int n=Matrix.size();
    vector<vector<int> > In=IdentityMat(n);
    vector<vector<int> > Matrix1(n, vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            Matrix1[i][j]=In[i][j]||Matrix[i][j];
        }
    }    
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        { 
            for (int k=0;k<n;k++)
            {
                Matrix1[j][k]=Matrix1[j][k]||(Matrix1[j][i]&&Matrix1[i][k]);
            }
        }
    }    
    // 输出参数用来存放矩阵是否可约
    if(pIrr)
    {
        (*pIrr)=true;// 矩阵不可约
        for (int i=0;i<n;i++)
        {
            for (int j=0;j<n;j++)
            { 
                if (Matrix1[i][j]!=1)
                {
                    (*pIrr)=false;// 矩阵可约
                    return Matrix1;
                }
            }
        }
    }
    return Matrix1;
}

string itos(int a)
{
    char sz[20]={0};
    sprintf(sz,"%d",a);
    return sz;
}

string MStr(const vector<vector<int> >&Matrix)
{
    string str="[";
    for(int i=0;i<Matrix.size();i++){
        str+="[";
        for(int j=0;j<Matrix[i].size();j++){
            str+=itos(Matrix[i][j])+" ";
            if(j<Matrix[i].size()-1)
                str+=",";
        }    
        str+="]";
        if(i<Matrix.size()-1)
              str+=",";        
    }    
    str+="]";
    return str;
}

std::vector<string> split( const std::string& str, const std::string& delims/* = "\t\n "*/, unsigned int maxSplits = 0)
{
    std::vector<string> ret;
    unsigned int numSplits = 0;

// Use STL methods 
    size_t start, pos;
    start = 0;
    do 
    {
        pos = str.find_first_of(delims, start);
        if (pos == start)
        {
            // Do nothing
            start = pos + 1;
        }
        else if (pos == std::string::npos || (maxSplits && numSplits == maxSplits))
        {
            // Copy the rest of the std::string
            ret.push_back( str.substr(start) );
            break;
        }
        else
        {
            // Copy up to delimiter
            ret.push_back( str.substr(start, pos - start) );
            start = pos + 1;
        }
        // parse up to next real data
        start = str.find_first_not_of(delims, start);
        ++numSplits;

} while (pos != std::string::npos);
    return ret;
}

vector<vector<int> > atoMat(const char *str)
{
    vector<string> vs;
    vector<int> vi(2);
    int rows=0;
    int cols=0;
    if(str!=NULL)
    {
        vs=split(str,";");
        rows=vs.size();
        vi[0]=rows;
        for(int i=0;i<vs.size();i++)
        {
            vector<string> vsi=split(vs[i],",");
            if(cols>0 && vsi.size()!=cols)
            {
                vi.clear();
                vector<vector<int> > vv;    
                return vv;
            }
            cols=vsi.size();
            vi[1]=cols;
            for(int j=0;j<vsi.size();j++)
            {
                vi.push_back(atoi(vsi[j].c_str()));
            }
        }
    }
    else
    {
        vi.clear();
    }
    vector<vector<int> > vv(rows, vector<int>(cols,0));    
    for(int k=0;k<vi.size()-2;k++)
    {
        int i=k/cols;
        int j=k%cols;
        vv[i][j]=vi[k+2];
    }    
    return vv;
}

int main(int argc, char *argv[])
{
    char sz[1024]={0};
    char sz1[1024]={0};
    if(argc<2)
    {
        printf("请输入矩阵A:");
        scanf("%s",&sz);
    }
    else
    {
        strcpy(sz,argv[1]);
    }
// #if 1
    // vector<vector<int> > A=atoMat("4,1,2,3;0,2,3,2;0,3,5,8;0,5,0,8");
// #else
    // int a[4][4]={{4,1,2,3},{0,2,3,2},{0,3,5,8},{0,5,0,8}};
    // vector<vector<int> > A(4, vector<int>(4,0));
    // for(int i=0;i<4;i++)
        // memcpy(&A[i][0],&a[i][0],sizeof(int)*4);
// #endif
    vector<vector<int> > A=atoMat(sz);
    cout<<"A="<<MStr(A)<<endl;    
    
    bool bIrr;
    vector<vector<int> > RA=ReachableMatrix(A,&bIrr);
    cout<<"RA="<<MStr(RA)<<(bIrr?"矩阵不可约":"矩阵可约")<<endl;        
    cout<<"Tr(A)="<<TraceMat(A)<<endl;
    return EXIT_SUCCESS;
}

判断矩阵是否可约、表示是否可约相关推荐

  1. 1886. 判断矩阵经轮转后是否一致

    1886. 判断矩阵经轮转后是否一致 给你两个大小为 n x n 的二进制矩阵 mat 和 target .现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 ,如果能够使 mat 与 tar ...

  2. yaahp使用教程_4 判断矩阵

    4 判断矩阵 层次模型正确后,可以切换到判断矩阵输入页面,如图: 4.1 层次结构树 4.1.1 层次结构树上的要素 窗口左下方的层次结构树列出了模型中的所有要素,需要输入判断矩阵的要素为蓝色文字,备 ...

  3. 判断矩阵一致性检验的Matlab源程序代码

    Matlab源程序代码如下: clc clear disp('请输入判断矩阵A') A=input('A='); [n,n] = size(A) %方法1: 算术平均法 Sum_A = sum(A); ...

  4. 线性代数 --- 如何判断矩阵是否可逆(奇异与非奇异)?

    如何判断矩阵是否可逆? 一般情况而言,判断矩阵是否可逆大多数人都会选择计算矩阵的行列式(determinant)?如果矩阵的行列式为0,则判断该矩阵为奇异矩阵(singular matrix),即不可 ...

  5. 判断矩阵斜对角线的元素

    判断矩阵斜对角线的元素 学习书本4皇后的算法中,发现了一句代码 abs( a[i] - a[k] ) = i - k 这是if语句内的代码,后面查找资料才发现,矩阵中: ∣斜对角线的元素的行数与行数的 ...

  6. 【1.2】 评价类模型之层次分析法中判断矩阵的填写方法、一致性检验的步骤、以及根据判断矩阵计算权重的方法

    目录: 准则层判断矩阵怎么填写 方案层判断矩阵怎么填写 关于判断矩阵和一致矩阵的知识点补充 一致性检验的步骤 怎样通过判断矩阵去计算权重(三种方法),及相应的代码示例 准则层判断矩阵的填写: 填写准则 ...

  7. R语言 判断矩阵是否对称半正定

    对称半正定矩阵可进行choleskey分解,使用chol()函数结合tryCatch错误异常判断,即可判断矩阵是否对称半正定. 1. 仅输出是否半正定 Sigma为一个对称矩阵,但非半正定,进行cho ...

  8. 基于模糊互补判断矩阵的多属性决策方法及matlab应用

    决策者利用一定的标度对属性进行两两比较,并构造判断矩阵,然后按一定的排序方法计算判断矩阵的排序向量,从而获得属性权重,最后在根据各种算子进行多属性群决策. (一)模糊互补判断矩阵排序法 1.加型模糊互 ...

  9. Matlab:如何利用层次分析法(升级版)计算具有多重指标的判断矩阵的一致性检验和权重

    02 论文提供的太阳镜的评价体系 03 建立目标层和准则层的判断矩阵 (论文提供) 04 首先需要对判断矩阵进行一致性检验 4.1 一致性检验的一般步骤 4.2 对应上方步骤的变量和代码 05 一致性 ...

  10. 判断矩阵是否为单位矩阵

    判断矩阵是否为单位矩阵 单位矩阵:除了主对角线上的元素值为1,其余元素全部为0 bool identity_matrix(int *arr,int n)//n表示n阶矩阵 {for(int i=0;i ...

最新文章

  1. QSAR生命的发动机卟啉c20h14n4---用反向传导做卟啉的分子模型
  2. 海量数据处理算法—Bit-Map
  3. 如何在SAP Spartacus自定义Component里消费数据
  4. js遍历对象的key和value
  5. 客制化键盘编程_客制化键盘如何入坑?
  6. 云服务器怎么执行sql文件在哪里,总结帝国CMS下在PHP文件中怎么调用数据库类执行SQL语句实例...
  7. html怎么从左到右设置颜色,css3文字颜色从左到右动画
  8. ubuntu 忘记root密码了不用怕,看这里
  9. 鸿蒙OS最快6月正式推送;微信Windows版将支持刷朋友圈;GCC 11.1正式发布|极客头条...
  10. arduino 部分有用的函数
  11. 创建data文件_剑指信奥 | C++ 之文件操作
  12. 中望3d快捷键命令大全_CAD和3DMAX常用快捷键大全与教程【完整版】
  13. 一个正经的前端学习 开源 仓库(每日更新)-698道知识点
  14. 2022年最新全国各省五级行政区划代码及mysql数据库代码(省市区县乡镇村)
  15. 云计算革命-IT产业第三次变革,将如何影响人类社会
  16. 100 句世界哲学语录【句句珠玑细细品味】
  17. 【无标题】两个路由器不同网段互通
  18. 群晖硬盘扩容 逃课方法
  19. list常用函数和方法续之删除元素
  20. win10 路由表配置

热门文章

  1. v880+ 手机自用软件介绍
  2. Adobe Premiere Pro CC 2015打不开闪退
  3. 基于压缩存储的半三角矩阵乘法运算的实现
  4. 线程的创建与线程间通信(C语言)
  5. 顺网服务器修改盘符,三步快速打造网维大师C盘穿透还原
  6. 软件性能测试重要性,软件性能测试的重要性及策略
  7. 还是花3-5秒存一下吧,以后不该吃的不能吃了
  8. 大一计算机考试挂了怎么办,大一期末考试最容易挂科的课程,看起来简单,实则让考生头疼...
  9. win7开启和关闭休眠的方法
  10. MH370被劫持新证据 飞机高度突降或暗示有搏斗