# Untitled

a guest
May 5th, 2023
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. RecToList:=function(A); //Given the record that Subgroups or MaximalSubgroups returns, this returns a list of the subgroups, rather than all the stuff the record has.
2. L:=[];
3. for i:=1 to #A do
4. L:=Append(L,A[i]`subgroup);
5. end for;
6. return L;
7. end function;
8.
9. ReadInFile:=function(s); //This lets me read in files easily.
11. return eval k;
12. end function;
13.
14. conj:=function(h,g); //This just conjugates h by g and is shorthand for me.
15. return g*h*g^-1;
16. end function;
17.
18. ListOfIdentities:=function(n) //Create a list with n 2x2 identity matrices in it. This will be useful in later functions.
19. I:=IdentityMatrix(Integers(),2);
20. N:=[];
21. for i:=1 to n do
22. N:=Append(N,I);
23. end for;
24. return N;
25. end function;
26.
27. TensorProductList:=function(N); //This does the tensor product of the matrices in the list N.
28. T:=N[1];
29. for k:=2 to #N do
30. T:=TensorProduct(T,N[k]);
31. end for;
32. return T;
33. end function;
34.
35. sigma:=function(i,j,m); //This gives an m-fold tensor product with little sigma_i in its jth slot and a 2x2 identity in every other slot.
36. if i eq 1 then
37. s:=Matrix([[0,1],[1,0]]);
38. else
39. s:=Matrix([[1,0],[0,-1]]);
40. end if;
41. N:=ListOfIdentities(m);
42. N[j]:=s;
43. return ChangeRing(TensorProductList(N),Rationals());
44. end function;
45.
46. E:=function(m); //This gives the fundamental representation of the extraspecial 2-group of degree m by using the sigma function to compute each of the 2m generators.
47. Gens:=[];
48. for a:=1 to m do
49. for b:=1 to m do
50. Gens:=Append(Gens,sigma(1,a,m));
51. Gens:=Append(Gens,sigma(2,b,m));
52. end for;
53. end for;
54. return sub<GeneralLinearGroup(2^m,Rationals())|Gens>;
55. end function;
56.
57. g1:=function(m); //This computes the first new generator of BRW(m). It's a block diagonal matrix with an identity matrix, a zero, a zero, and (I x I x ... x sigma_1).
58. if m eq 1 then
59. return IdentityMatrix(Integers(),2);
60. end if;
61. I:=IdentityMatrix(Integers(),2^m div 2);
62. Z:=ZeroMatrix(Integers(),2^m div 2);
63. N:=ListOfIdentities(m-1);
64. N[m-1]:=sigma(1,1,1);
65. T:=TensorProductList(N);
66. return BlockMatrix(2,2,[I,Z,Z,T]);
67. end function;
68.
69. g2:=function(m); // This computes the generator corresponding to the second new generator
70. p:=[1..2^m]; //Initialize permutation to use to compute the generator
71. for i:=1 to 2^(m-1) do //Creates the permutation on 2^m elements corresponding to the second generator of GL(m,2)'s action on R^(2^m), it is [1,3,5,...,2^(m-1),2,4,...,2^m]
72. p[i]:=2*i-1;
73. p[i+2^(m-1)]:=2*i;
74. end for;
75. return Transpose(PermutationMatrix(Rationals(),p)); //Returns the corresponding matrix representation of this permutation
76. end function;
77.
78. D:=function(m); //This gives a 2^m identity matrix, except each 4th entry is a -1.
79. d:=IdentityMatrix(Integers(),2^m);
80. for i:=1 to Floor(2^m/4) do
81. d[4*i][4*i]:=-1;
82. end for;
83. return d;
84. end function;
85.
86. H:=function(m) //This creates the Hadamard matrix.
88. h:=1/w*Matrix([[1,1],[1,-1]]);
89. for i:=1 to m-1 do //Creates the Kronecker product of h with I m-1 times
90. h:=KroneckerProduct(IdentityMatrix(Q,2),h);
91. end for;
92. return h;
93. end function;
94.
95. BRW:=function(m); //This creates the BRW group. It is generated by the gens of E(m); and g1, g2, and D, plus each of those conjugated by the Hadamard matrix.
96. return sub<GeneralLinearGroup(2^m,Rationals())|Generators(E(m)),g1(m),g2(m),D(m),conj(g1(m),H(m)),conj(g2(m),H(m)),conj(D(m),H(m))>;
97. end function;
98.
99. CG:=function(m); //This creates the Clifford group. It is generated by the gens of BRW and the Hadamard matrix.
101. end function;
102.
103. vacuumsum:=function(M); //This computes the sum part of the formula for the vacuum anomaly of M.
104. M:=Matrix(M);
105. n:=Order(M);
106. D:=0;
107. if n ne 1 then
108. D:=1;
109. end if;
110. S:=0;
111. if D ne 0 then
112. if n ne 2 then
113. C:=CyclotomicPolynomial(n);
114. F<p>:=SplittingField([C]);
115. M:=ChangeRing(M,F);
116. else
117. p:=-1;
118. end if;
119. S:=0;
120. for k:=1 to n-1 do
121. S:=S+k*(n-k)*Dimension(Eigenspace(M,p^k));
122. end for;
123. end if;
124. return S;
125. end function;
126.
127. vacuum:=function(M); //This computes the vacuum anomaly of M.
128. M:=Matrix(M);
129. S:=vacuumsum(M);
130. n:=Order(M);
131. return 1/(4*n^2) * vacuumsum(M);
132. end function;
133.
134. type:=function(M); //This computes the type of M.
135. M:=Matrix(M);
136. V:=vacuum(M);
137. n:=Order(M);
138. k:=n^2*V;
139. if IsCoercible(Integers(),k) then
140. l:=(Integers() ! k) mod n;
141. else
142. l:=-1;
143. end if;
144. return l;
145. end function;
146.
147. chi1:=function(g); //This is shorthand for the character of the fundamental representation.
148. return Trace(Matrix(g));
149. end function;
150.
151. chi2:=function(g); //This computes the sum part of the inner product of the trivial character with the symmetric character.
152. M:=Matrix(g);
153. L:=M^2;
154. a:=Trace(M);
155. b:=Trace(M^2);
156. c:=Trace(M)^2;
157. return a+(b+c)/2;
158. end function;
159.
160. dimchi1:=function(H); //This computes the inner product of the fundamental character with the trivial character.
161. C:=ConjugacyClasses(H);
162. z:=0;
163. for i:=1 to # C do
164. a:=chi1(C[i][3]);
165. z:=z+a*C[i][2];
166. end for;
167. return z/Order(H);
168. end function;
169.
170. dimchi2:=function(H); //This computes the inner product of the trivial character with the symmetric character.
171. C:=ConjugacyClasses(H);
172. z:=0;
173. for k:=1 to # C do
174. a:=chi2(C[k][3]);
175. z:=z+a*C[k][2];
176. end for;
177. return z/Order(H);
178. end function;
179.
180. CheckConjugacyClasses:=function(H); //This checks to see if H, a group, has any elements with vacuum anomaly <= number. (I manually adjusted number as I needed it.)
181. number:=1;
182. for h in Generators(H) do //Check the relatively small number of generators first before generating all the conjugacy classes!
183. if vacuum(h) le number then
184. return false;
185. end if;
186. end for;
187. C:=ConjugacyClasses(H);
188. for i:=2 to # C do
189. if vacuum(C[i][3]) le number then
190. return false;
191. end if;
192. end for;
193. return true;
194. end function;
195.
196. CheckDimensions:=function(H); //This checks to see if the inner products of the fundamental with the trivial and the symmetric with the trivial are 0 and 1, respectively.
197. if dimchi1(H) ne 0 then
198. return false;
199. end if;
200. if dimchi2(H) ne 1 then
201. return false;
202. end if;
203. return true;
204. end function;
205.
206. MatrixToCycle:=function(M); //Elements of E(m) are signed permutation matrices and can hence be represented as permutations of 1 up to 2^(m+1). The first half represents the columns, and the second represents the minu of the columns.
207. n:=NumberOfRows(M);
208. Z:=ZeroMatrix(Integers(),n,1);
209. N:=[];
210. for i:=1 to NumberOfRows(Z) do
211. k:=Z;
212. k[i,1]:=1;
213. N:=Append(N,k);
214. end for;
215. for i:=1 to NumberOfRows(Z) do
216. k:=Z;
217. k[i,1]:=-1;
218. N:=Append(N,k);
219. end for;
220. A:=[];
221. M:=ChangeRing(M,Integers());
222. K:=[];
223. for i:=1 to #N do
224. k:=M*N[i];
225. for j:=1 to #N do
226. if k eq N[j] then
227. K:=Append(K,j);
228. end if;
229. end for;
230. end for;
231. return SymmetricGroup(n*2) ! K;
232. end function;
233.
234. CycleToMatrix:=function(A); //This goes the other way if we ever need to.
235. n:=Degree(Parent(A)) div 2;
236. Z:=ZeroMatrix(Integers(),n,1);
237. N:=[];
238. for i:=1 to NumberOfRows(Z) do
239. k:=Z;
240. k[i,1]:=1;
241. N:=Append(N,k);
242. end for;
243. for i:=1 to NumberOfRows(Z) do
244. k:=Z;
245. k[i,1]:=-1;
246. N:=Append(N,k);
247. end for;
248. M:=[];
249. for i:=1 to n do
250. M:=Append(M,N[i ^ A]);
251. end for;
252. return Transpose(Matrix(M));
253. end function;
254.
255. PermE:=function(m); //Returns the permutation version of E(m). Calculations with this run about 2.5 times faster than with matrices.
256. Gens:=[];
257. for x in Generators(E(m)) do
258. Gens:=Append(Gens,MatrixToCycle(x));
259. end for;
260. return sub<SymmetricGroup(2^m*2)|Gens>;
261. end function;
262.
263. MyE:=function(m); //This is for my convenience since I relabeled the function.
264. return PermE(m);
265. end function;
266.
267. FindTrace:=function(A); //This finds the trace of a permutation.
268. z:=0;
269. n:=Degree(Parent(A)) div 2;
270. for i:=1 to n do
271. if i ^ A eq i then
272. z:=z+1;
273. end if;
274. if i ^ A eq (i + n) then
275. z:=z-1;
276. end if;
277. end for;
278. return z;
279. end function;
280.
281. chi2perm:=function(g); //Computes the inner product of the symmetric with the trivial for the permutation realization.
282. a:=FindTrace(g);
283. b:=FindTrace(g^2);
284. c:=FindTrace(g)^2;
285. return a+(b+c)/2;
286. end function;
287.
288. dimchi1perm:=function(H); //Computes the inner product of the fundamental with the trivial for the permutation realization.
289. C:=ConjugacyClasses(H);
290. z:=0;
291. for i:=1 to # C do
292. a:=FindTrace(C[i][3]);
293. z:=z+a*C[i][2];
294. end for;
295. return z/Order(H);
296. end function;
297.
298. dimchi2perm:=function(H); //Computes the inner product of the symmetric with the trivial for the permutation realization.
299. C:=ConjugacyClasses(H);
300. z:=0;
301. for k:=1 to # C do
302. a:=chi2perm(C[k][3]);
303. z:=z+a*C[k][2];
304. end for;
305. return z/Order(H);
306. end function;
307.
308. TranslateSubgroupOfCycles:=function(H); //This takes a subgroup in the permutation realization to the corresponding subgroup in the matrix realization.
309. m:=Integers() ! Log(2,Degree(Parent(Random(H))) div 2);
310. L:=[];
311. for c in Generators(H) do
312. L:=Append(L,CycleToMatrix(c));
313. end for;
314. return sub<E(m)|L>;
315. end function;
316.
317. balanced:=function(m); //This returns the generator matrix for the Balanced Barnes-Wall lattice (as rows).
319. M:=Matrix([[w,0],[1,1]]);
320. T:=M;
321. for i:=1 to m-1 do//
322. T:=TensorProduct(T,M);
323. end for;
324. return T;
325. end function;
326.
327. Nebegen:=function(m); //This returns the generator matrix for Nebe et al's construction of the Barnes-Wall lattice.
329. T:=balanced(m);
330. B:=T;
331. for i:=1 to 2^m do
332. for j:=1 to 2^m do
333. if Eltseq(T[i,j])[2] ne 0 then //Eltseq[2] tells me the sqrt(2) part.
334. B[i,j]:=w * Eltseq(T[i,j])[2] * w; //Eltseq*w is the number. Then multiplying it by w again makes it rational.
335. end if; //b/c apparently just multiplying it by w is enough to give the rational part.
336. end for;
337. end for;
338. B:=ChangeRing(B, Integers());
339. return B;
340. end function;
341.
342. Nebegram:=function(m); //The gram matrix
343. G:=Nebegen(m);
344. G:=G*Transpose(G);
345. return G;
346. end function;
347.
348. Griessgen:=function(m); //Computes the generator matrix for Griess's constrction by rescaling Nebe et al's matrix.
350. g:=Nebegen(m);
352. if IsEven(m) then
353. c:=w ^ (-m div 2);
354. end if;
355. if IsOdd(m) then
356. c:=w ^ ((-m-1) div 2);
357. end if;
358. for i:=1 to 2^m do
359. for j:=1 to 2^m do
360. g[i,j]:=c * g[i,j];
361. end for;
362. end for;
363. return g;
364. end function;
365.
366. Griessgram:=function(m); //This one calculates the Gram matrix using the results of the previous function
367. curlym:=Griessgen(m);
368. curlym:=curlym*Transpose(curlym);
369. curlym:=ChangeRing(curlym,Integers());
370. return curlym;
371. end function;
372.
373. UnimodularBRW:=function(m); //This gives a unimodular representation of BRW by conjugating each generator of BRW by the generator matrix of the Barnes-Wall lattice.
374. N:=ChangeRing(Nebegen(m),RationalField());
375. L:=[];
376. for A in Generators(BRW(m)) do
377. B:=ChangeRing(A,RationalField());
378. L:=Append(L,ChangeRing(N*B*N^(-1),Integers()));
379. end for;
380. return sub<GeneralLinearGroup(2^m,Integers())|L>;
381. end function;
382.
383. PrimeBRW:=function(m,p);
384. M:=[];
385. for x in Generators(UnimodularBRW(m)) do
386. M:=Append(M,ChangeRing(x,FiniteField(p)));
387. end for;
388. return sub<GeneralLinearGroup(2^m,FiniteField(p)) | M>;
389. end function;
390.
391. Grassmannian:=function(d,n); //This computes the number of d-dimensional subspaces of an n-dimensional vector space over Z2.
392. a:=2^n-1;
393. b:=2^d-1;
394. for i:=1 to d-1 do
395. a:=a*(2^n-2^i);
396. b:=b*(2^d-2^i);
397. end for;
398. return a/b;
399. end function;
400.
401. Centralizer2:=function(m); //This computes the centralizer of a non-identity element of order 2 element in E(m). They're all isomorphic so I just get one.
402. G:=E(m);
403. Two:=0;
404. for x in G do
405. if Order(x) eq 2 and not x in Center(G) then
406. Two:=x;
407. break;
408. end if;
409. end for;
410. return Centralizer(G,Two);
411. end function;
412.
413. Centralizer4:=function(m); //Same as above, for order 4.
414. G:=E(m);
415. Four:=0;
416. for x in G do
417. if Order(x) eq 4 then
418. Four:=x;
419. break;
420. end if;
421. end for;
422. return Centralizer(G,Four);
423. end function;