谁能告诉下求子群的计算方法啊?比如 设是10阶循环群 写出G所有的凡子群.要的是方法,.
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/30 07:59:46
![谁能告诉下求子群的计算方法啊?比如 设是10阶循环群 写出G所有的凡子群.要的是方法,.](/uploads/image/z/11463575-23-5.jpg?t=%E8%B0%81%E8%83%BD%E5%91%8A%E8%AF%89%E4%B8%8B%E6%B1%82%E5%AD%90%E7%BE%A4%E7%9A%84%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95%E5%95%8A%3F%E6%AF%94%E5%A6%82+%E8%AE%BE%E6%98%AF10%E9%98%B6%E5%BE%AA%E7%8E%AF%E7%BE%A4+%E5%86%99%E5%87%BAG%E6%89%80%E6%9C%89%E7%9A%84%E5%87%A1%E5%AD%90%E7%BE%A4.%E8%A6%81%E7%9A%84%E6%98%AF%E6%96%B9%E6%B3%95%2C.)
谁能告诉下求子群的计算方法啊?比如 设是10阶循环群 写出G所有的凡子群.要的是方法,.
谁能告诉下求子群的计算方法啊?
比如 设是10阶循环群 写出G所有的凡子群.要的是方法,.
谁能告诉下求子群的计算方法啊?比如 设是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表示这个元素在集合中