置换群
想起了之前在BRICS+2023里发现一道很简短的题目,没想到里面大有学问。
信安数学基础简单了解了一下置换群,不过应试学的比较粗糙,继续深入了解一下。
前置知识
置换和置换群
对于某个组$(1,2,3)$,可以进行置换,使用itertools
库的permutations()
函数可以进行置换排列:
1 | import itertools |
可以发现使用这个函数返回的是一个带有所有排列组合的集合,对于组成元素集合$X=(1,2,3)$,将$X$排列后得到的六种置换构成一个对称群$S_X$,这个对称群的某个子群就叫做一个置换群。
这里我们组成元素有$3$个,所以是$3$阶对称群。
置换群中的元素是一些置换,例如上面例子中存在某个置换:
满足:
置换群的复合
下面是对置换群的操作:
对于复合操作,先进行$\tau$再进行$\sigma$,可以直接写作$\sigma\tau$。
置换群的元素也可以自己和自己进行复合,例如:
sage里可以进行排列操作:
1 | G = Permutations(3) |
这里得到的元素其实是省略写法:
对于
[3, 1, 2]
得到的其实是一个置换:对于
[3, 2, 1]
得到的其实是一个置换:两个置换进行复合,得到新的置换:
对于对称群$S_n$($n$元对称群),阶为$n!$,置换群的阶应该是对称群阶的一个因子。
回圈
回圈是置换群元素的另一种表示方法:对于某个置换,存在:
那么存在一个长度为$k$的回圈,记作$(a_0,a_1,…,a_{k-1})$,将所有的回圈写在一起就可以表示一个置换了。
对于某个置换:
得到回圈表示:
单个元素可以认为自己构成一个圈。
在sage中使用PermutationGroupElement
可以得到一个回圈表述的置换元。
置换群开方
群平方
之前提到了置换群元素可以进行自己和自己复合,也就是做平方运算。
对于某个置换:
进行平方计算得到:
注意到在回圈中,对置换进行平方也就是对其中所有的回圈分别进行了平方置换,可以将大的置换拆分为每个回圈构成的小置换,得到:
还注意到平方运算的一个性质:
对于长度为偶数的回圈,进行平方后会被拆分为两个长度相等的圈:
对于长度为奇数的圈,进行平方后还是一个长度不变的回圈,只改变了其中的顺序:
群开方
群开方操作需要进行几种讨论,可以先设定$\tau=\sigma^2$,圈的奇偶是一个很好的切入点。
奇数圈开方
对于一个奇数圈,在$\tau$中发现存在奇数圈$\tau_i$,如果这个奇数圈的长度在整个平方置换是唯一的,那么就可以断定这个圈是$\sigma$中某个相同长度的奇数圈$\sigma_i$平方得到。
根据我们知道的奇数圈平方后的元素顺序,就可以轻易还原出原来的开方置换:
得到转换关系:
也就是按照这关系重新排列一下就能得到开方后的元素。
偶数圈开方
如果在$\tau$的回圈中找到两个回圈拥有相同的长度$\frac k2$,如果这个长度是偶数,那么就可以确定是为$\sigma$中一个长度为$k$的回圈平方分裂产生。
但是如果$\frac k2$为奇数,那么会出现两种情况,不确定是为一个偶数$k$圈分裂产生还是两个长度$\frac k2$的奇数圈平方产生。
奇数圈的情况按照上面直接转化即可,这里注意一下$\frac k2$为偶数的情况,奇数圈平方只产生奇数圈,记:
根据转换关系就能得到:
但是这里会有一个问题,对于某个回圈$(a,b,c)$,有:
它们都认为是同一个回圈,所以当这多种组合和另一个回圈进行开方整合为一个回圈之后,由于顺序出现问题就会产生多解,解的个数可以发现和整合前圈内元素数量是相同的,即为有$\frac k2$个解。
BRICS+ sqrt
非常简短的题目:
1 | from sage.all import * |
1 | [41, 124, 256, 27, 201, 93, 40, 133, 47, 10, 69, 253, 13, 245, 165, 166, 118, 230, 197, 249, 115, 18, 71, 24, 100, 14, 160, 28, 251, 96, 106, 5, 244, 58, 67, 44, 150, 42, 255, 74, 168, 182, 153, 209, 227, 232, 159, 128, 125, 11, 135, 90, 76, 30, 84, 31, 1, 149, 48, 95, 216, 94, 157, 131, 196, 172, 105, 169, 202, 203, 121, 210, 53, 9, 147, 89, 39, 68, 59, 141, 87, 207, 51, 180, 19, 81, 57, 103, 228, 77, 12, 129, 185, 85, 45, 123, 50, 116, 65, 213, 104, 64, 54, 155, 222, 112, 3, 252, 21, 33, 138, 151, 211, 233, 204, 97, 239, 113, 82, 200, 23, 231, 177, 26, 72, 4, 78, 183, 199, 6, 49, 29, 250, 119, 32, 56, 110, 187, 35, 143, 83, 25, 70, 2, 66, 101, 217, 120, 224, 142, 191, 136, 189, 127, 132, 36, 174, 146, 152, 140, 193, 62, 178, 17, 148, 248, 167, 88, 73, 229, 134, 156, 158, 60, 63, 242, 221, 34, 214, 20, 171, 139, 226, 186, 164, 181, 236, 107, 111, 61, 99, 108, 179, 223, 137, 212, 237, 102, 161, 145, 184, 173, 247, 162, 205, 154, 55, 117, 254, 38, 75, 234, 7, 46, 109, 22, 175, 144, 219, 220, 195, 190, 98, 79, 15, 170, 80, 235, 52, 8, 37, 243, 198, 86, 43, 192, 241, 240, 208, 130, 188, 114, 218, 215, 206, 176, 238, 16, 246, 126, 122, 163, 225, 92, 91, 194] |
题目给了一个$S_{256}$的一个置换的平方,需求开方。
根据之前对回圈的知识了解,首先先通过PermutationGroupElement
来获得这个平方群元的回圈结果:
1 | P2 = [41, 124, 256, 27, 201, 93, 40, 133, 47, 10, 69, 253, 13, 245, 165, 166, 118, 230, 197, 249, 115, 18, 71, 24, 100, 14, 160, 28, 251, 96, 106, 5, 244, 58, 67, 44, 150, 42, 255, 74, 168, 182, 153, 209, 227, 232, 159, 128, 125, 11, 135, 90, 76, 30, 84, 31, 1, 149, 48, 95, 216, 94, 157, 131, 196, 172, 105, 169, 202, 203, 121, 210, 53, 9, 147, 89, 39, 68, 59, 141, 87, 207, 51, 180, 19, 81, 57, 103, 228, 77, 12, 129, 185, 85, 45, 123, 50, 116, 65, 213, 104, 64, 54, 155, 222, 112, 3, 252, 21, 33, 138, 151, 211, 233, 204, 97, 239, 113, 82, 200, 23, 231, 177, 26, 72, 4, 78, 183, 199, 6, 49, 29, 250, 119, 32, 56, 110, 187, 35, 143, 83, 25, 70, 2, 66, 101, 217, 120, 224, 142, 191, 136, 189, 127, 132, 36, 174, 146, 152, 140, 193, 62, 178, 17, 148, 248, 167, 88, 73, 229, 134, 156, 158, 60, 63, 242, 221, 34, 214, 20, 171, 139, 226, 186, 164, 181, 236, 107, 111, 61, 99, 108, 179, 223, 137, 212, 237, 102, 161, 145, 184, 173, 247, 162, 205, 154, 55, 117, 254, 38, 75, 234, 7, 46, 109, 22, 175, 144, 219, 220, 195, 190, 98, 79, 15, 170, 80, 235, 52, 8, 37, 243, 198, 86, 43, 192, 241, 240, 208, 130, 188, 114, 218, 215, 206, 176, 238, 16, 246, 126, 122, 163, 225, 92, 91, 194] |
得到了一个$75$长度的回圈、两个长度$82$的回圈,三个长度$3$的回圈,$8$个长度$1$的回圈。
注意到这里的长度$1$的内圈这个函数是不给的,需要我们自己去补。
可以确定长度为$75$的圈就是长度为$75$的回圈进行了平方得到的;两个长度为$82$的回圈一定是一个长度为$164$的回圈平方得到的;三个长度$3$的回圈需要分情况,可能是三个奇数圈平方,也可能是一个奇数圈平方,另外两个是一个长度$6$的偶数圈平方分裂得到;$8$个长度为$1$的内圈讨论起来就更复杂了。
可以通过爆破将$8$个$1$的求出所有可能,还有$3$个$3$的排列组合,剩下两个圈是确定的,不需要这么复杂。
这里的回圈表示用的都是string型,将数组转为string然后拼接一下得到即可:
1 | # sage |