Atlas of Lie Groups and
Representations Galois Cohomology: code |
||
To use this code in realex, save it to a file mygalois.rx, and load it
in realex with the command <mygalois. This code is found in the atlas distribution, and is a combination of the files galois.rx and generate_groups.rx. If you start realex you can load both files with the command <galois. {G is a RealForm pi0(G)=order of component group of G(R) H1(G)=order of Galois cohomology H^1(Gamma,G)} set split_rank(RealForm G)=int: let ((c,C,s),,,)=Cartan_info(most_split_Cartan(G)) in C+s {square_classes(ic)=list of all square classes of inner class, labelled 0,1,...,n square_classes(G)=list of all square classes of inner class of G} set square_classes(InnerClass ic)=[[int]]:square_classes(Cartan_class(ic,0)) set square_classes(RealForm G)=[[int]]:square_classes(inner_class(G)) {assume you want all strong real forms, i.e. Cartan 0, this is just print output} set print_strong_real(RealForm G)=void:print_strong_real(Cartan_class(G,0)) {real_forms(G): assume Cartan 0, list of real forms [RealForm]} set real_forms(RealForm G)=[RealForm]:real_forms(Cartan_class(G,0)) set real_forms(InnerClass ic)=[RealForm]:real_forms(Cartan_class(ic,0)) {identify SO*(2m) via the information of square_classes(SO(2m,0))} set SOstar(int n)=let Gc=SO(n,0) in let sc=square_classes(Gc) in real_forms(Gc)[sc[1][0]] set Spinstar(int n)=let Gc=Spin(n,0) in let sc=square_classes(Gc) in real_forms(Gc)[sc[1][0]] set PSOstar(int n)=let Gc=PSO(n,0) in let sc=square_classes(SO(n,0)) in real_forms(Gc)[sc[1][0]] {match(v,k) returns true if k occurs in v, false otherwise} set match([int] v,int k)=bool: let rv=false in let i=0 in while i<#v do if (v[i]=k) then rv:=true; i:=#v fi; i+:=1 od;rv {find(vecs,k) returns the (smallest) int j such that k in occurs in vecs[j] returns -1 otherwise} set find([[int]] vecs, int k)=int: let rv=-1 in let i=0 in while i<#vecs do if match(vecs[i],k) then rv:=i;i:=#vecs fi; i+:=1 od;rv {associated to a real form \theta is an element of Z^\theta/(1+\theta)Z if theta=\theta_x then x^2\in Z^\Gamma represents this class form_number(G) is the number of the real form the central invariant is the entry in square_classes(G) containing this number for example inner class of Sp(4,R) square_classes=([2],[1,0,0]) form_number(Sp(4,R))=2 central_invariant(Sp(4,R))=0 form_number(Sp(2,0))=0 form_number(Sp(1,1))=1 central_invariant(Sp(2,0))=central_invariant(Sp(1,1))=1} set central_invariant(RealForm G)=int:find(square_classes(G),form_number(G)) set central_invariant(InnerClass ic, int k)=int:central_invariant(real_forms(ic)[k]) { strong_real_forms_same_type(ic,k) strong_real_forms_same_type(G) returns a list [int] (with multiplicity) of the real form numbers in given inner class with same x^2 as given real form real form is given by (inner class, number) or (RealForm G) if j occurs with multiplicity this means several strong real forms mapping to the given real form for example if ic=inner_class(Spin(4,4)) then strong_real_forms_type(ic,0)=[4,0,0,0,0] meaning one split strong real form and 4 compact ones } set strong_real_forms_same_type(InnerClass ic, int k)=[int]:square_classes(ic)[central_invariant(ic,k)] set strong_real_forms_same_type(RealForm G)=strong_real_forms_same_type(G,form_number(G)) set pi0(RealForm G)=2^(components_rank(G)) {list of all simple root systems of given rank} set all_simple_root_systems_given_rank(int rank)=[string]: if ((rank>8) or (rank=5)) then ["A"+rank,"B"+rank,"C"+rank,"D"+rank] elif (rank>5) then ["A"+rank,"B"+rank,"C"+rank,"D"+rank,"E"+rank] else let types_of_given_rank=[["A"],["A","B","G"],["A","B","C"],["A","B","C","D","F"] ] in for type in types_of_given_rank[rank-1] do type+rank od fi {list of allowed inner classes for given simple type} {e.g. all_inner_classes ("A2") Value: ["e","u"]} set all_inner_classes(string type_and_rank)=[string]: let (type,rank)=(type_and_rank[0],type_and_rank[1]) in if ((type="A" and rank !="1") or (type="D") or (type="E" and rank="6")) then ["e","u"] else ["e"] fi {generate list of all simple groups either simply connected "sc" or adjoint "ad" of given rank e.g. all_simple("sc",2), automatically runs over all inner classes} set all_simple_given_isogeny_and_rank(string isogeny,int rank)= let rootsystems=all_simple_root_systems_given_rank(rank) in let rv=[RealForm]:[] in for rs in rootsystems do let inner_classes=all_inner_classes(rs) in for ic in inner_classes do if (isogeny ="sc") then rv:=rv#real_forms(Cartan_class(inner_class(simply_connected (Lie_type (rs)),ic),0)) elif (isogeny="ad") then rv:=rv#real_forms(Cartan_class(inner_class(adjoint (Lie_type (rs)),ic),0)) fi od od;rv {all_simple("sc",k) or all_simple("ad",k)} set all_simple(string isogeny, int rank)=all_simple_given_isogeny_and_rank(isogeny,rank) set all_simple_simply_connected_rank(int rank)=all_simple("sc",rank) set all_simple_adjoint_rank(int rank)=all_simple("ad",rank) set all_simple_rank(int rank)=all_simple_simply_connected_rank(rank)#all_simple_adjoint_rank(rank) {H^1(\Gamma,G)=H^1(\theta,G) is the number of strong real forms with given x^2\in Z} set H1(RealForm G)=int:#strong_real_forms_same_type(G) {calculate H1 for all simple groups of given rank bounds, both simply connected and adjoint} set iterate_H1(int min_rank, int max_rank)=void: for rank:max_rank-min_rank+1 from min_rank do for isogeny in ["sc","ad"] do prints("-------------------------------------------------------------------------"); if (isogeny ="sc") then prints("Calculating H^1(Gamma,G) for simply connected simple groups of rank ", rank) elif( isogeny ="ad") then prints("Calculating H^1(Gamma,G) for adjoint simple groups of rank ", rank) fi; prints(""); for g in all_simple(isogeny,rank) do prints(g," ",H1(g)) od od od set iterate_H1(int rank)=void:iterate_H1(rank,rank) set iterate_H1()=void:iterate_H1(1,8)Here is the output of the iterate_H1 command |