1010from lmfdb .utils import (
1111 web_latex , to_dict , coeff_to_poly , comma , format_percentage ,
1212 flash_error , display_knowl , CountBox , Downloader , prop_int_pretty ,
13- SearchArray , TextBox , YesNoBox , YesNoMaybeBox , SubsetNoExcludeBox ,
13+ SearchArray , TextBox , YesNoBox , YesNoMaybeBox , SubsetNoExcludeBox , SelectBox ,
1414 SubsetBox , TextBoxWithSelect , parse_bool_unknown , parse_posints ,
1515 clean_input , nf_string_to_label , parse_galgrp , parse_ints , parse_bool ,
1616 parse_signed_ints , parse_primes , parse_bracketed_posints , parse_nf_string ,
17- parse_floats , parse_subfield , search_wrap , parse_padicfields ,
17+ parse_floats , parse_subfield , search_wrap , parse_padicfields , integer_options ,
1818 raw_typeset , raw_typeset_poly , flash_info , input_string_to_poly ,
1919 raw_typeset_int , compress_poly_Q , compress_polynomial )
2020from lmfdb .utils .web_display import compress_int
2525 cclasses_display_knowl ,character_table_display_knowl ,
2626 group_phrase , galois_group_data , transitive_group_display_knowl ,
2727 group_cclasses_knowl_guts , group_pretty_and_nTj , knowl_cache ,
28- group_character_table_knowl_guts , group_alias_table )
28+ group_character_table_knowl_guts , group_alias_table ,
29+ dihedral_gal , dihedral_ngal , multiquad )
2930from lmfdb .number_fields import nf_page , nf_logger
3031from lmfdb .number_fields .web_number_field import (
3132 field_pretty , WebNumberField , nf_knowl_guts , factor_base_factor ,
@@ -898,7 +899,44 @@ def number_field_search(info, query):
898899 parse_posints (info ,query ,'relative_class_number' )
899900 parse_ints (info ,query ,'num_ram' )
900901 parse_bool (info ,query ,'cm_field' ,qfield = 'cm' )
901- parse_bool (info ,query ,'is_galois' )
902+ fi = info .get ("field_is" )
903+ if fi == "cyc" :
904+ query ["gal_is_cyclic" ] = True
905+ elif fi == "ab" :
906+ query ["gal_is_abelian" ] = True
907+ elif fi in ["dih_ngal" , "dih_gal" , "multi_quad" ]:
908+ if fi == "dih_ngal" :
909+ opts = dihedral_ngal
910+ elif fi == "dih_gal" :
911+ opts = dihedral_gal
912+ else :
913+ opts = multiquad
914+ if "degree" in info :
915+ opts = {n : opts [n ] for n in integer_options (info ["degree" ], contained_in = list (opts ), lower_bound = 1 , upper_bound = 47 ) if n in opts }
916+ if "galois_label" in query :
917+ # Added by parse_galgrp, so we intersect with opts
918+ if isinstance (query ["galois_label" ], dict ):
919+ ggopt = set (query ["galois_label" ]["$in" ])
920+ else :
921+ ggopt = {query ["galois_label" ]}
922+ opts = {n : gg for (n , gg ) in opts .items () if gg in ggopt }
923+ if len (opts ) == 0 :
924+ # Incompatible with specified degree or galois labels, so we add an impossible condition
925+ query ["degree" ] = - 1
926+ elif len (opts ) == 1 :
927+ n , gg = list (opts .items ())[0 ]
928+ query ["degree" ] = n
929+ query ["galois_label" ] = gg
930+ else :
931+ query ["degree" ] = {"$in" : list (opts )}
932+ query ["galois_label" ] = {"$in" : list (opts .values ())}
933+ elif fi == "gal" :
934+ query ["is_galois" ] = True
935+ elif fi == "solv" :
936+ query ["gal_is_solvable" ] = True
937+ elif fi == "nsolv" :
938+ query ["gal_is_solvable" ] = False
939+
902940 parse_bracketed_posints (info ,query ,'class_group' ,check_divisibility = 'increasing' ,process = int )
903941 parse_primes (info ,query ,'ur_primes' ,name = 'Unramified primes' ,
904942 qfield = 'ramps' ,mode = 'exclude' )
@@ -1176,10 +1214,21 @@ def __init__(self):
11761214 knowl = "nf.galois_search" ,
11771215 example = "C5" ,
11781216 example_span = "[8,3], 8.3, C5 or 7T2" )
1179- is_galois = YesNoBox (
1180- name = "is_galois" ,
1181- label = "Galois" ,
1182- knowl = "nf.galois_group" )
1217+ field_is_opts = [
1218+ ("" , "" ),
1219+ ("cyc" , "cyclic" ),
1220+ ("ab" , "abelian" ),
1221+ ("multi_quad" , "multi-quadratic" ),
1222+ ("dih_ngal" , "dihedral non-Galois" ),
1223+ ("dih_gal" , "dihedral Galois" ),
1224+ ("gal" , "Galois" ),
1225+ ("solv" , "solvable" ),
1226+ ("nsolv" , "nonsolvable" ),]
1227+ field_is = SelectBox (
1228+ name = "field_is" ,
1229+ label = "Field is" ,
1230+ knowl = "nf.field_is" ,
1231+ options = field_is_opts )
11831232 regulator = TextBox (
11841233 name = "regulator" ,
11851234 label = "Regulator" ,
@@ -1259,7 +1308,7 @@ def __init__(self):
12591308 self .browse_array = [
12601309 [degree , signature ],
12611310 [discriminant , rd ],
1262- [gal , is_galois ],
1311+ [gal , field_is ],
12631312 [num_ram , grd ],
12641313 [class_number , class_group ],
12651314 [ram_primes , ur_primes ],
@@ -1271,13 +1320,13 @@ def __init__(self):
12711320
12721321 self .refine_array = [
12731322 [degree , signature , num_ram , ram_primes , ur_primes ],
1274- [gal , is_galois , subfield , class_group , class_number ],
1323+ [gal , field_is , subfield , class_group , class_number ],
12751324 [discriminant , rd , grd , cm_field , relative_class_number ],
12761325 [regulator , completion , monogenic , index , inessentialprimes ],
12771326 [is_minimal_sibling ]]
12781327
12791328 #[degree, signature, class_number, class_group, cm_field],
1280- #[num_ram, ram_primes, ur_primes, gal, is_galois ],
1329+ #[num_ram, ram_primes, ur_primes, gal, field_is ],
12811330 #[discriminant, rd, grd, regulator, subfield],
12821331 #[completion, is_minimal_sibling, monogenic, index, inessentialprimes],
12831332 #[relative_class_number]]
0 commit comments