}
运行结果如下:
以上便是对自反或反自反,对称或反对称,是否传递等性质的判断过程,代码及运行代码的结果。
4.实验总结
此题为验证性题目,验证性题目主要是通过其原理以及相关的概念来证明。
通过此题对验证性题目的分析有很大的提高。
(二)
1.实验题目
判断一个二元关系是否为等价关系,如果是,求其商集。
2.实验原理
要判断一个二元关系是否是等价关系,则要判断这个关系是否具有自反性,对称性和传递性;假如这三个条件都同时符合,则该二元关系具有等价关系。
这里以为A={1,2,3,4,5,6,7},R={<1,4>,<1,7>,<4,1>,<4,7>,<7,1>,<7,4>,<2,5>,<5,2>,<3,6>,<6,3>}UIa为例。
自反性的判别与上题一样,都是判别flay[i][i]是否都等于1;若flay[i][i]全部等于1,则具有自反性;否则反之。
对于对称性与上题也一样,就是判断所有的flay[i][j]与flay[j][i]是否全部相等;若全部相等,则具有对称性;否则反之。
传递性的判断,则需要利用线性代数的方法求出R的关系矩阵的平方矩阵,只需验证所有的flag[i][j](R的关系矩阵的平方矩阵)等于1的地方,在flay[i][j](R的关系矩阵)等于1,则具有传递性;否则反之。
3.实验步骤及实验记录
(1)先输入一个整数,表示矩阵的阶数;接着输出初始空矩阵。
然后一组一组的输入R在A上的关系,输入00时结束;接着输出关系矩阵,判别与输入的关系是否一致。
代码如下所示:
voidInput()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
flay[i][j]=0;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<cout<}
R();
}
voidR()
{
cout<<"请输入两个位置有关系的数值,输入“00”结束R的输入:
"<cin>>a>>b;
if(a!
=0&&b!
=0)
{
flay[a][b]=1;
R();
}
}
voidOutput()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<cout<}
}
代码运行结果如下所示:
(2)在根据矩阵左上到右下flay[i][i]的值是否为1判断矩阵是否是自反或反自反,判断矩阵是否自反或反自反的代码如下:
intcount=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
{
if(flay[i][j]==1)
count_1++;
elseif(flay[i][j]==0)
count_2++;
}
}
}
if(count_1==n)
{
cout<<"自反性"<syb_3=1;
}
else
cout<<"反自反性"<代码运行结果如下所示:
(3)判断对称的或反对称只需要flay[i][j]是否与flay[j][i]相等;若全部相等,则为可对称;否则反之。
代码如下:
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(flay[i][j]==flay[j][i])
count_1++;
else
{
count_2=1;
break;
}
}
if(count_2==1)
{
break;
}
}
if(count_2==1)
{
cout<<"反称性"<}
else
{
cout<<"对称性"<syb_1=1;
}
代码运行结果如下所示:
(4)而对于判别是否具有传递性,则相对前面两个性质来说比较复杂,关键是求出原矩阵flay的平方矩阵flag,这里通过线性代数的方法求出flay矩阵的平方矩阵flag,求平方矩阵的方法是:
第一个矩阵flay[i][j]等于flay[i][j]乘以第二个矩阵的第j列之总和;j++完后再i++,以后便可求出平方矩阵。
然后在比较在平方矩阵flag[i][j]为1的位置,在原矩阵flay[i][j]中是否都为1;若flag矩阵中所有的为1的地方,在flay中都为1,则具有传递性;否则反之;最后输出该平方矩阵。
代码如下所示:
intk;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
flag[i][j]=0;
for(k=1;k<=n;k++)
flag[i][j]=flag[i][j]+flay[i][k]*flay[k][j];
if(flag[i][j]!
=0)
count_2++;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(flag[i][j]!
=0&&flay[i][j]==1)
{
flag[i][j]=1;
count_3++;
}
elseif(flag[i][j]!
=0&&flay[i][j]==0)
{
flag[i][j]=1;
count_1=1;
break;
}
}
if(count_1==1)
break;
}
if(count_2==count_3&&count_2!
=0&&count_3!
=0)
{
cout<<"传递性"<syb_2=1;
}
else
cout<<"非传递性"<cout<<"该矩阵的平方为:
"<for(i=1;i<=n;i++)
{
for(k=1;k<=n;k++)
cout<cout<<"\b"<}
代码运行结果如下所示:
(5)对于商集,只需判断哪个几个原变元之间同时具有自反,对称和传递关系即可。
代码如下所示:
cout<<"其商集为:
"<inta[100];
if(syb_1==1&&syb_2==1&&syb_3==1)
{
for(i=1;i<=n;i++)
{
a[i]=i;
}
for(i=1;i<=n;i++)
{
if(a[i]!
=0)
{
cout<<"{";
for(j=1;j<=n;j++)
{
if(flay[i][j]!
=0&&a[j]!
=0)
{
cout<a[j]=0;
}
}
cout<<'\b'<<"}"<<"";
}
}
}
else
{
cout<<"不是等价关系"<cout<<"不存在商集"<}
运行结果如下:
4.实验总结
通过此题不仅可以熟悉等价关系的概念和条件,还可以理解商集的含义以及求商集的方法。
提高对问题的分析能力和答题能力。
代数系统
1.实验题目
输入代数系统〈G,*〉的集合G和*运算的运算表,判断〈G,*〉是否是群。
2.实验原理
判断一个代数系统是否为群的三个条件为:
该代数系统是可结合的半群,具有幺元的独异点,G上每个元素都有逆元。
即是代数系统,*为二元运算,如果*运算时可结合的,存在单位元e在G内,并且对G中任何元素X都有X-1在G内,则称为群。
证明*运算可结合的原理是(X*Y)*Z=X*(Y*Z)即可。
要证明死独异点,则要证el*X=x且X*er=X,则e就是幺元即可。
而要证明有逆元,即证明yl*X=e(e为逆元)且X*yr=e(e为逆元)则y就是逆元即可。
这就是证明群的原理。
3.实验步骤及实验记录
*eabc
eeabc
本题以代数系统aaecb为例
bbcea
ccbae
(1)输入一个整数N,表示有N个变量;在逐个输入变元,然后在逐个输入两个变元关于*运算后相应的结果,最后输出该代数系统。
代码如下:
cout<<"请输入变元的个数:
";
cin>>n;
for(k=1;k<=n;k++)
{
cout<<"请输入第"<";
cin>>flay[k];
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cout<<"请输入"<";
cin>>a[i][j];
}
运行结果如下所示:
(2)证明可结合性,其原理是在一个代数系统中(X*Y)*Z=X*(Y*Z),此处是本人认为用代码证明群的难点所在。
需要用一个compute(i,j)函数去查找X,Y关于
*运算后的结果,再用conpute(i,j)函数返回来的值在做一次compute(i,j)函数得出最后结果。
这样既可以比较(X*Y)*Z与X*(Y*Z)的值是否一样。
代码如下:
voidJieHe()
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
if(compute(compute(i,j),k)==compute(i,compute(j,k)))
count_1++;
else
{
count_2=1;
break;
}
}
if(count_2==1)
break;
}
if(count_2==1)
break;
}
if(count_2==1)
{
cout<<"该代数系统不可结合!
"<exit(0);
}
if(count_1==n*n*n)
cout<<"*运算可结合!
"<"<}
intcompute(intx,inty)
{
for(t=1;t<=n;t++)
{
if(flay[t]==a[x][y])
{
returnt;
}
}
return-1;
}
运行结果如下所示:
(3)证明有幺元,即为独异点。
要证明el*X=x且X*er=X,则e就是幺元。
代码如下所示:
for(i=1,s=1;i<=n;i++)
{
count_1=0;
count_2=0;
for(j=1;j<=n;j++)
{
if(a[i][j]==flay[j])
{
count_1++;
}
}
if(count_1==n)
{
for(k=1;k<=n;k++)
{
if(a[k][i]=flay[k])
count_2++;
}
}
if(count_2==n)
{
cout<<"幺元为:
"<s=flay[i];
count_3++;
}
}
if(count_3!
=0)
cout<<"该代数系统是独异点!
"<else
{
cout<<"该代数系统不是独异点!
"<exit(0);
}
运行结果如下:
(4)证明有逆元。
即证明yl*X=e(e为幺元)且X*yr=e(e为幺元)则y就是逆元。
代码如下所示:
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==s&&a[j][i]==s)
{
cout<<""<"<count_4++;
}
cout<if(count_4==n)
{
cout<<"该代数系统存在逆元!
"<"<}
else
cout<<"此代数系统不是群!
"<代码运行结果如下:
4.实验总结
此题为验证性题目,通过做出此题,了解了群的概念,群的定义以及求群的条件,即:
运算可结合,存在单位元,每个原变元都存在逆元。
此题还涉及到了矩阵相乘的方法,可以很好的锻炼思维能力和理解能力。