c++ 离散数学 群的相关判断及求解

采用C/C++/其它语言编程,构造一个n阶群<G={a,b,c,…},*>,G的阶|G|满足:3<=|G|<=6

1、判断该群是否是循环群,若是,输出该群的某个生成元。

2、给出每一个元素的阶和逆元

  1 #include<iostream>
  2
  3 using namespace std;
  4 //返回元素下标
  5 //n为集合元素个数,set[]为存放元素集合,s为要求下标的元素
  6 int sub(int n, char set[], char s)
  7 {
  8     for (int i = 0; i < n; i++)
  9     {
 10         if (set[i] == s)
 11             return i;
 12     }
 13 }
 14
 15 //判断群是不是循环群
 16 //n为群的阶数,,set[]为存放集合元素的数组,ele[6][6]为存放群运算表的二维数组
 17 int Iscyc(int n, char set[], char ele[][6])
 18 {
 19     int x, count;
 20     int cnt;
 21     for (int i = 0; i < n; i++)
 22     {
 23         count = 0;//计量---集合中的元素是否由set[i]的幂组成
 24
 25         for (int j = 0; j < n; j++)
 26         {
 27             x = i;
 28             cnt = 2;//防止死循环
 29             if (set[j] == set[i])
 30                 count++;
 31             if (set[j] == ele[x][i])
 32                 count++;
 33
 34             while (set[j] != ele[x][i] && cnt < n)
 35             {
 36                 x = sub(n, set, ele[x][i]);
 37                 cnt++;
 38                 if (set[j] == ele[x][i])
 39                     count++;
 40             }
 41
 42
 43         }
 44         if (count == n)
 45             return 1;
 46     }
 47     return 0;
 48
 49 }
 50
 51 //输出循环群的生成元
 52 //n为群的阶数,,set[]为存放集合元素的数组,ele[6][6]为存放群运算表的二维数组
 53 void gen(int n, char set[], char ele[][6])
 54 {
 55     int x, count;
 56     int cnt;
 57     for (int i = 0; i < n; i++)
 58     {
 59         count = 0;
 60         for (int j = 0; j < n; j++)
 61         {
 62             x = i;
 63             cnt = 2;
 64             if (set[j] == set[i])
 65                 count++;
 66             if (set[j] == ele[x][i])
 67                 count++;
 68             while (set[j] != ele[x][i] && cnt < n)
 69             {
 70                 x = sub(n, set, ele[x][i]);
 71                 cnt++;
 72                 if (set[j] == ele[x][i])
 73                     count++;
 74             }
 75         }
 76         if (count == n)
 77             cout << "循环群的生成元是:" << set[i] << endl;
 78     }
 79 }
 80
 81 //给出群中每个元素的阶
 82 //n为群的阶数,,set[]为存放集合元素的数组,ele[6][6]为存放群运算表的二维数组,ie为幺元
 83 void order(int n, char set[], char ele[][6], char ie)
 84 {
 85     int  x, cnt;
 86     for (int i = 0; i < n; i++)
 87     {
 88         if (set[i] != ie)
 89         {
 90             x = i;
 91             cnt = 2;
 92             if (ele[x][i] == ie)
 93                 cout << set[i] << "的阶是" << cnt << endl;
 94             while (ele[x][i] != ie)
 95             {
 96                 x = sub(n, set, ele[x][i]);
 97                 cnt++;
 98                 if (ele[x][i] == ie)
 99                 {
100                     cout << set[i] << "的阶是" << cnt << endl;
101                     break;
102                 }
103             }
104         }
105         else
106             cout << set[i] << "的阶是1" << endl;
107     }
108
109
110 }
111
112 //输出群中每个元素的逆元
113 //n为群的阶数,,set[]为存放集合元素的数组,ele[6][6]为存放群运算表的二维数组
114 //ie为幺元
115 void inver(int n, char set[], char ele[][6], char ie)
116 {
117
118     for (int i = 0; i < n; i++)
119         for (int j = 0; j < n; j++)
120         {
121             if (ele[i][j] == ie)
122             {
123                 cout << set[i] << "的逆元是" << set[j] << endl;
124                 break;
125             }
126         }
127
128
129 }
130
131
132 int main()
133 {
134     cout << "请输入元素的个数(要求3到6之间)" << endl;
135     int inputnum;
136     cin >> inputnum;
137     cout << "请输入元素" << endl;
138     char Y[4];
139     for (int i = 0; i < inputnum; i++)
140     {
141         cin >> Y[i];
142     }
143     cout << "请输入群的幺元" << endl;
144     char e;
145     cin >> e;
146     char outputform[7][7];
147     char out1[6][6];
148     outputform[0][0] = ‘*‘;
149     for (int i = 1; i <= inputnum; i++)
150     {
151         outputform[0][i] = Y[i - 1];
152         outputform[i][0] = Y[i - 1];
153     }
154     int m;
155     for (int i = 0; i < inputnum; i++)
156     {
157         if (Y[i] == e)
158         {
159             m = i;
160             break;
161         }
162     }
163     int n = m;
164     int r = m;
165     for (int i = 0; i < inputnum; i++)
166     {
167         out1[n%inputnum][m] = Y[n%inputnum];
168         n = n + 1;
169     }
170     int q;
171     for (int i = 0; i < inputnum; i++)
172     {
173         q = 0;
174         for (int y = 0; y < inputnum; y++)
175         {
176             if (out1[i][m] == Y[y])
177             {
178                 q = y;
179                 break;
180             }
181         }
182         for (int j = m; j < inputnum + m; j++)
183         {
184             out1[i][j%inputnum] = Y[q%inputnum];
185             q++;
186         }
187     }
188     for (int i = 1; i <= inputnum; i++)
189     {
190         for (int j = 1; j <= inputnum; j++)
191         {
192             outputform[i][j] = out1[i - 1][j - 1];
193         }
194     }
195     for (int i = 0; i <= inputnum; i++)
196     {
197         for (int j = 0; j <= inputnum; j++)
198         {
199             cout << outputform[i][j] << ‘ ‘;
200         }
201         cout << endl;
202     }
203
204
205     cout << "---------------------------" << endl;
206     if (Iscyc(inputnum, Y, out1))
207     {
208         cout << "<G,*>是循环群" << endl;
209         gen(inputnum, Y, out1);
210     }
211     else
212         cout << "<G,*>不是循环群" << endl;
213     cout << "---------------------------" << endl;
214     order(inputnum, Y, out1, e);
215     cout << "---------------------------" << endl;
216     inver(inputnum, Y, out1, e);
217
218
219     return 0;
220 }
时间: 2024-12-28 08:49:16

c++ 离散数学 群的相关判断及求解的相关文章

shell中if和相关判断符

1. 关于某个档名的『类型』侦测(存在与否),如 test -e filename -e 该『档名』是否存在?(常用) -f 该『档名』是否为档案(file)?(常用) -d 该『文件名』是否为目录(directory)?(常用) -b 该『文件名』是否为一个 block device 装置? -c 该『文件名』是否为一个 character device 装置? -S 该『档名』是否为一个 Socket 档案? -p 该『档名』是否为一个 FIFO (pipe) 档案? -L 该『档名』是否为

Kafka安装和集群的相关配置

(一).简介1.Kafka简介:Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker.无论是kafka集群,还是producer和consumer

小柒来科普微信通讯录拉群打群的相关知识

所谓通讯录粉,就是客户提供精准用户数据,机房批量添加,规模大的机房一天通过十几万的精准好友不是问题.所以对于销售变现团队成熟都是个巨大的需求.通讯录导粉引流方式介绍:1,客户预付款财务,提供上粉主号2,安排技术客服对接,教客户安装加粉软件3,根据客户加粉需求,安排小号加为好友4,小号批量加粉,推送客户名片方式给客户加粉5,加满客户指定数量粉丝后,通知客户下线客户端微信通讯录导粉相比其他泛粉,优势在哪里? 通讯录粉丝,其实是精准粉丝的一种,可以根据可以行业,去指定加对应的手机号码数据,也可以客户提

AutoCAD.Net/C#.Net QQ群:193522571 C#判断文件夹是否已经打开

有时候需要在执行了一个命令后把一个文件夹给打开,但是如果该文件夹已经打开了就没有必要再开一个文件夹了,但是C#中并没有专门的函数来解决此问题. 下面是用moveto的方法来曲线救国. DirectoryInfo dir = new DirectoryInfo(string.Format("{0}\\ScreenShot", ConSQL.DirUserSetting)); try { string sNewPath = dir.FullName + FileHelper.GetDate

Linux高可用集群方案之heartbeat基础原理及逻辑架构

 这篇文章我们主要学习heartbeat高可用集群的基础原理及逻辑架构,以及heartbeat的简单配置  ll  本文导航    · heartbeat之基本原理   · heartbeat之集群组件   · heartbeat之心跳连接   · heartbeat之脑裂(资源争用.资源隔离) · heartbeat之配置文件   · heartbeat至高可用集群配置  ll  要求  掌握heartbeat高可用集群的相关组件及简单配置   heartbeat之基本原理  heartbea

04-LVS集群调度算法

根据其调度是否考虑后端主机的负载情况,LVS调度算法可大致分为静态方法和动态方法 静态方法: 1> RR:round robin 轮询,将每个请求轮流调度到后端RealServer 2> WRR:weighted round robin 加权轮询,定义后端RealServer权重,将请求按照权重分配到后端RealServer. 3> SH:sourch hash ,源地址哈希,主要用于会话保持,在一定时间内,将某一个源地址的请求全部发往同一个后端RealServer,目的是为了会话绑定

第六章 Realm及相关对象——《跟我学Shiro》

6.1 Realm [2.5 Realm]及[3.5 Authorizer]部分都已经详细介绍过Realm了,接下来再来看一下一般真实环境下的Realm如何实现. 1.定义实体及关系   即用户-角色之间是多对多关系,角色-权限之间是多对多关系:且用户和权限之间通过角色建立关系:在系统中验证时通过权限验证,角色只是权限集合,即所谓的显示角色:其实权限应该对应到资源(如菜单.URL.页面按钮.Java方法等)中,即应该将权限字符串存储到资源实体中,但是目前为了简单化,直接提取一个权限表,[综合示例

做站群SEO网站对站群服务器的要求高吗?做站群网站都需要注意哪些?

下面是本人做站群SEO的几年来大致总结的一些经验.如有肤浅谬误的地方,还请各位高手大虾海涵.以 下内容仅供交流学习,本着互惠互利的原则,希望对各自黑猫优化的技术手段有所提升.觉得本人编辑 的内容属于小儿科的请直接无视. 一. 域名的选择 做站群网站对域名的选择是很关键的,不过究竟是新域名好还是老域名好,这就要看老域名本身的旧网 站SEO优化基础是什么样了.如果旧网站曾经被K过,或者优化的程度不高.这个时候就不如采用新的域 名了,同时新的域名要做好关键词布局.做好站内文章优化,而不是一味追求所谓的

针对群组资源的操作方法、群组服务器

本发明提供了一种针对群组资源的操作方法.群组服务器和执行针对群组资源的操作的装置,通过在发送给成员设备的成员资源操作请求中携带操作请求标识,以便成员资源所属的成员设备根据所述操作请求标识判断成员设备存储的操作请求标识中是否包含所述操作请求标识,并根据判断结果处理成员资源操作请求.从而能够避对成员资源的操作请求进行重复处理或循环处理. 技术领域 [0001]本发明涉及机器通信(Machine-to-Machine Communications, M2M)技术领域,尤其涉及针对群组资源方法.群组服务