Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###
- # General packages and algorithms
- ###
- import sympy as sp
- import math as ma
- import time
- from functools import reduce
- from operator import mul
- # Quickly calculcate the product of elements in a list
- def prod(L):
- return reduce(mul, L, 1)
- # Check if 4|G|+1 is a perfect square
- def hasRequiredOrder(x,name='Unidentified group'):
- if isSquare(4*x+1):
- print(name+' of order '+str(x))
- return
- # Check if integer is a perfect square
- def isSquare(n):
- return n == int(ma.sqrt(n)) ** 2
- # Generate all prime powers <= m
- def primePowerRange(N):
- L = []
- for p in sp.primerange(2,N+1):
- Lp = [p]
- m = ma.floor(ma.log(N,p))
- for _ in range(2,m+1):
- Lp += [Lp[-1]*p]
- L += Lp
- return sorted(L)
- ###
- # Generate orders of non-abelian simple groups
- ###
- # Alternating groups
- def alternatingOrders(m):
- # A_n
- n = 5
- O = 120
- while O <= m:
- hasRequiredOrder(O,'Alternating group A('+str(n)+')')
- n += 1
- O *= n
- return
- # Classical Chevalley groups
- def classicalChevalleyOrders(m):
- # A_n(q)
- n = 1
- i = 2
- # Starting at i=2 avoids A_1(2) and A_1(3)
- q = primePowers[i]
- O = (sp.Pow(q,(n*(n+1))//2)*prod([sp.Pow(q,i+1)-1 for i in range(1,n+1)]))//ma.gcd(n+1,q-1)
- while O <= m:
- while O <= m:
- hasRequiredOrder(O,'Classical Chevalley group A_'+str(n)+'('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = (sp.Pow(q,(n*(n+1))//2)*prod([sp.Pow(q,i+1)-1 for i in range(1,n+1)]))//ma.gcd(n+1,q-1)
- i = 0
- q = primePowers[i]
- n += 1
- O = (sp.Pow(q,(n*(n+1))//2)*prod([sp.Pow(q,i+1)-1 for i in range(1,n+1)]))//ma.gcd(n+1,q-1)
- # B_n(q)
- n = 2
- i = 1
- # starting at i=1 avoids B_2(2)
- q = primePowers[i]
- O = (sp.Pow(q,n*n)*prod([sp.Pow(q,2*i)-1 for i in range(1,n+1)]))//ma.gcd(2,q-1)
- while O <= m:
- while O <= m:
- hasRequiredOrder(O,'Classical Chevalley group B_'+str(n)+'('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = (sp.Pow(q,n*n)*prod([sp.Pow(q,2*i)-1 for i in range(1,n+1)]))//ma.gcd(2,q-1)
- i = 0
- q = primePowers[i]
- n += 1
- O = (sp.Pow(q,n*n)*prod([sp.Pow(q,2*i)-1 for i in range(1,n+1)]))//ma.gcd(2,q-1)
- # C_n(q) is obsolete, same order as B_n(q)
- # D_n(q)
- n = 4
- i = 0
- q = primePowers[i]
- O = (sp.Pow(q,n*(n-1))*(sp.Pow(q,n)-1)*prod([sp.Pow(q,2*i)-1 for i in range(1,n)]))//ma.gcd(4,q**n-1)
- while O <= m:
- while O <= m:
- hasRequiredOrder(O,'Classical Chevalley group B_'+str(n)+'('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = (sp.Pow(q,n*(n-1))*(sp.Pow(q,n)-1)*prod([sp.Pow(q,2*i)-1 for i in range(1,n)]))//ma.gcd(4,q**n-1)
- i = 0
- q = primePowers[i]
- n += 1
- O = (sp.Pow(q,n*(n-1))*(sp.Pow(q,n)-1)*prod([sp.Pow(q,2*i)-1 for i in range(1,n)]))//ma.gcd(4,q**n-1)
- return
- # Exceptional Chevalley groups
- def exceptionalChevalleyOrders(m):
- # E_6(q)
- i = 0
- q = primePowers[i]
- O = (sp.Pow(q,36)*prod([sp.Pow(q,i)-1 for i in [2,5,6,8,9,12]]))//ma.gcd(3,q-1)
- while O<=m:
- hasRequiredOrder(O,'Exceptional Chevalley group E_6('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = (sp.Pow(q,36)*prod([sp.Pow(q,i)-1 for i in [2,5,6,8,9,12]]))//ma.gcd(3,q-1)
- # E_7(q)
- i = 0
- q = primePowers[i]
- O = (sp.Pow(q,63)*prod([sp.Pow(q,i)-1 for i in [2,6,8,10,12,14,18]]))//ma.gcd(2,q-1)
- while O<=m:
- hasRequiredOrder(O,'Exceptional Chevalley group E_7('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = (sp.Pow(q,63)*prod([sp.Pow(q,i)-1 for i in [2,6,8,10,12,14,18]]))//ma.gcd(2,q-1)
- # E_8(q)
- i = 0
- q = primePowers[i]
- O = sp.Pow(q,120)*prod([sp.Pow(q,i)-1 for i in [2,8,12,14,18,20,24,30]])
- while O<=m:
- hasRequiredOrder(O,'Exceptional Chevalley group E_8('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = sp.Pow(q,120)*prod([sp.Pow(q,i)-1 for i in [2,8,12,14,18,20,24,30]])
- # F_4(q)
- i = 0
- q = primePowers[i]
- O = sp.Pow(q,24)*prod([sp.Pow(q,i)-1 for i in [2,6,8,12]])
- while O<=m:
- hasRequiredOrder(O,'Exceptional Chevalley group F_4('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = sp.Pow(q,24)*prod([sp.Pow(q,i)-1 for i in [2,6,8,12]])
- # G_2(q)
- i = 1
- # starting at i=1 avoids G_2(2)
- q = primePowers[i]
- O = sp.Pow(q,6)*prod([sp.Pow(q,i)-1 for i in [2,6]])
- while O<=m:
- hasRequiredOrder(O,'Exceptional Chevalley group G_2('+str(q)+')')
- i += 1
- q = primePowers[i]
- O = sp.Pow(q,6)*prod([sp.Pow(q,i)-1 for i in [2,6]])
- return
- # Classical Steinberg groups
- def classicalSteinbergOrders(m):
- # 2A_n(q^2)
- n = 2
- i = 1
- # Starting at i=1 avoids 2A_2(2^2)
- q = primePowers[i]
- O = (sp.Pow(q,(n*(n+1))//2)*prod([sp.Pow(q,i+1)-sp.Pow(-1,i+1) for i in range(1,n+1)]))//ma.gcd(n+1,q+1)
- while O <= m:
- while O <= m:
- hasRequiredOrder(O,'Classical Steinberg group 2A_'+str(n)+'('+str(q)+'^2)')
- i += 1
- q = primePowers[i]
- O = (sp.Pow(q,(n*(n+1))//2)*prod([sp.Pow(q,i+1)-sp.Pow(-1,i+1) for i in range(1,n+1)]))//ma.gcd(n+1,q+1)
- i = 0
- q = primePowers[i]
- n += 1
- O = (sp.Pow(q,(n*(n+1))//2)*prod([sp.Pow(q,i+1)-sp.Pow(-1,i+1) for i in range(1,n+1)]))//ma.gcd(n+1,q+1)
- # 2D_n(q^2)
- n = 4
- i = 0
- q = primePowers[i]
- O = sp.Pow(q,n*(n-1))*(sp.Pow(q,n)+1)*prod([sp.Pow(q,2*i)-1 for i in range(1,n)])//ma.gcd(4,q**n+1)
- while O <= m:
- while O <= m:
- hasRequiredOrder(O,'Classical Steinberg group 2D_'+str(n)+'('+str(q)+'^2)')
- i += 1
- q = primePowers[i]
- O = sp.Pow(q,n*(n-1))*(sp.Pow(q,n)+1)*prod([sp.Pow(q,2*i)-1 for i in range(1,n)])//ma.gcd(4,q**n+1)
- i = 0
- q = primePowers[i]
- n += 1
- O = sp.Pow(q,n*(n-1))*(sp.Pow(q,n)+1)*prod([sp.Pow(q,2*i)-1 for i in range(1,n)])//ma.gcd(4,q**n+1)
- return
- def exceptionalSteinbergOrders(m):
- # 2E_6(q^2)
- i = 0
- q = primePowers[i]
- O = sp.Pow(q,36)*prod([sp.Pow(q,i)-sp.Pow(-1,i) for i in [2,5,6,8,9,12]])//ma.gcd(3,q+1)
- while O<=m:
- hasRequiredOrder(O,'Exceptional Steinberg group 2E_6('+str(q)+'^2)')
- i += 1
- q = primePowers[i]
- O = sp.Pow(q,36)*prod([sp.Pow(q,i)-sp.Pow(-1,i) for i in [2,5,6,8,9,12]])//ma.gcd(3,q+1)
- # 3D_4(q^3)
- i = 0
- q = primePowers[i]
- O = sp.Pow(q,12)*(sp.Pow(q,8)+sp.Pow(q,4)+1)*(sp.Pow(q,6)-1)*(sp.Pow(q,2)-1)
- while O<=m:
- hasRequiredOrder(O,'Exceptional Steinberg group 3D_4('+str(q)+'^3)')
- i += 1
- q = primePowers[i]
- O = sp.Pow(q,12)*(sp.Pow(q,8)+sp.Pow(q,4)+1)*(sp.Pow(q,6)-1)*(sp.Pow(q,2)-1)
- return
- def suzukiOrders(m):
- # 2B_2(q)
- n = 1
- q = sp.Pow(2,2*n+1)
- O = sp.Pow(q,2)*(sp.Pow(q,2)+1)*(q-1)
- while O<=m:
- hasRequiredOrder(O,'Suzuki group 2B_2('+str(q)+')')
- n +=1
- q = sp.Pow(2,2*n+1)
- O = sp.Pow(q,2)*(sp.Pow(q,2)+1)*(q-1)
- return
- def reeTitsOrders(m):
- #2F_4(q)
- n = 1
- q = sp.Pow(2,2*n+1)
- O = sp.Pow(q,12)*(sp.Pow(q,6)+1)*(sp.Pow(q,4)-1)*(sp.Pow(q,3)+1)*(q-1)
- while O<=m:
- hasRequiredOrder(O,'Lee group 2F_4('+str(q)+')')
- n +=1
- q = sp.Pow(2,2*n+1)
- O = sp.Pow(q,12)*(sp.Pow(q,6)+1)*(sp.Pow(q,4)-1)*(sp.Pow(q,3)+1)*(q-1)
- return
- #2F_4(2)' Tits
- O = 17971200
- if O <= m:
- hasRequiredOrder(O,'Tits group 2F_4('+str(q)+')\'')
- #2G_2(q)
- n = 1
- q = sp.Pow(3,2*n+1)
- O = sp.Pow(q,3)*(sp.Pow(q,3)+1)*(q-1)
- while O<=m:
- hasRequiredOrder(O,'Lee group 2G_2('+str(q)+')')
- n +=1
- q = sp.Pow(3,2*n+1)
- O = sp.Pow(q,3)*(sp.Pow(q,3)+1)*(q-1)
- return
- def sporadicOrders(m):
- L = [7920,
- 95040,
- 443520,
- 10200960,
- 244823040,
- 175560,
- 604800,
- 50232960,
- 86775571046077562880,
- 495766656000,
- 42305421312000,
- 4157776806543360000,
- 64561751654400,
- 4089470473293004800,
- 1255205709190661721292800,
- 44352000,
- 898128000,
- 4030387200,
- 145926144000,
- 448345497600,
- 460815505920,
- 273030912000000,
- 51765179004000000,
- 90745943887872000,
- 4154781481226426191177580544000000,
- 808017424794512875886459904961710757005754368000000000
- ]
- for O in L:
- if O <= m:
- hasRequiredOrder(O,'Sporadic group')
- return
- def allOrders(m):
- alternatingOrders(m)
- classicalChevalleyOrders(m)
- exceptionalChevalleyOrders(m)
- classicalSteinbergOrders(m)
- exceptionalSteinbergOrders(m)
- suzukiOrders(m)
- reeTitsOrders(m)
- sporadicOrders(m)
- return
- begin = time.clock()
- n = 8
- primePowers = primePowerRange(10**n)
- print('Time to generate prime powers up to 10^'+str(n)+': '+str(sp.ceiling(time.clock()-begin))+' seconds.')
- begin = time.clock()
- n = 23
- allOrders(10**n)
- print('Time to check all finite non-abelian simple groups up to order 10^'+str(n)+': '+str(sp.ceiling(time.clock()-begin))+' seconds.')
- # for m >= 10**12: need 10^5 prime powers
- # for m >= 10**15: need 10^6 prime powers
- # for m >= 10**18: need 10^7 prime powers
- # for m >= 10**21: need 10^8 prime powers
- # Powers up to 10^6: 6 seconds
- # Powers up to 10^7: 65 seconds
- # Powers up to 10^8: 676 seconds
- # Groups up to 10^18: 7 seconds
- # Groups up to 10^19: 17 seconds
- # Groups up to 10^20: 34 seconds
- # Groups up to 10^21: 68 seconds
- # Groups up to 10^22: 139 seconds
- # Groups up to 10^23: 289 seconds
Add Comment
Please, Sign In to add comment