作业帮 > 综合 > 作业

谁能告诉下求子群的计算方法啊?

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/05/06 21:29:35
谁能告诉下求子群的计算方法啊?
比如 设是10阶循环群 写出G所有的凡子群.要的是方法,.
谁能告诉下求子群的计算方法啊?
讨论某个特定的子群, 对于群中的每一个元素, 只有两种状态: 在/不在子群中
所以, 通过变化每个元素的这个在与不在的bool标记, 就可以生成所有子群了
比如, 对于3个元素的群的子群, 全集就是全部元素都位于子群中即111, 只有前两个的时候就是110, 只有最后一个的子群是001
类似的, 对于任何多个元素的子群, 就通过改变每个元素的状态就可以生成所有子群了
下面的算法, 把整形变量的每一位看做元素的存在标记, 即第3位为1表示第三个元素在这个子群中:
#include <stdio.h>
int main()
{
unsigned iLen = 0;
puts("集合元素的个数?(1~31)");
scanf("%u", &iLen);
if (iLen > 31 || iLen <= 0)
{
puts("超出范围");
return -1;
}
FILE *pFile = fopen("out.txt", "w");
if (pFile == NULL)
{
puts("打开文件失败");
return -2;
}
unsigned iMax = 1 << iLen;
for (unsigned i = 1; i < iMax; ++i)
{
for (int j = 0; j < iLen; ++j)
{
if ((i >> j) & 1)
{
fprintf(pFile, "%u ", j + 1);
}
}
fputc('\n', pFile);
}
fclose(pFile);
}
上面的算法, 当有3个元素的时候, 就处理头三位, 由3位构成的整数范围是1~7(空集就没处理了), 所以对于1~7的每个数, 依次取出他们的每一位判断是否为1, 就可以知道在这个数对应的集合中, 这一位对应的元素是否在集合中了

i等于5时, 5等于二进制的101, 第1、3个元素在集合中, 第2个不在, 这就是一个子集
上面的代码只能够处理1~31位的元素, 主要是考虑到元素太多时, 不可能全部罗列了(n!增长太快); 如果非要罗列, 类似的, 实现大数的加法什么的就可以了, 大数从1到n, 每个数作为一个集合每一位为1表示这个元素在集合中