def galois_group_search(info, query): def includes_composite(s): s = s.replace(' ','').replace('..','-') for interval in s.split(','): if '-' in interval[1:]: ix = interval.index('-',1) a,b = int(interval[:ix]), int(interval[ix+1:]) if b == a: if a != 1 and not a.is_prime(): return True if b > a and b > 3: return True else: a = ZZ(interval) if a != 1 and not a.is_prime(): return True parse_ints(info,query,'n','degree') parse_ints(info,query,'t') parse_ints(info,query,'order') parse_bracketed_posints(info, query, qfield='gapidfull', split=False, exactlength=2, keepbrackets=True, name='GAP id', field='gapid') for param in ('cyc', 'solv', 'prim'): parse_bool(info, query, param, process=int, blank=['0','Any']) parse_restricted(info,query,'parity',allowed=[1,-1],process=int,blank=['0','Any']) if 'order' in query and 'n' not in query: query['__sort__'] = ['order', 'gapid', 'n', 't'] degree_str = prep_ranges(info.get('n')) info['show_subs'] = degree_str is None or (LIST_RE.match(degree_str) and includes_composite(degree_str)) info['group_display'] = group_display_pretty info['yesno'] = yesno info['wgg'] = WebGaloisGroup.from_data
def artin_representation_search(info, query): query['Hide'] = 0 info['sign_code'] = 0 parse_primes(info, query, "unramified", name="Unramified primes", qfield="BadPrimes", mode="complement") parse_primes(info, query, "ramified", name="Ramified primes", qfield="BadPrimes", mode="append") parse_element_of(info, query, "root_number", qfield="GalConjSigns") parse_restricted(info, query, "frobenius_schur_indicator", qfield="Indicator", allowed=[1, 0, -1], process=int) parse_container(info, query, 'container', qfield='Container', name="Smallest permutation representation") parse_galgrp(info, query, "group", name="Group", qfield=("Galn", "Galt")) parse_ints(info, query, 'dimension', qfield='Dim') parse_ints(info, query, 'conductor', qfield='Conductor') parse_bool(info, query, 'Is_Even')
def galois_group_search(info, query): def includes_composite(s): s = s.replace(' ','').replace('..','-') for interval in s.split(','): if '-' in interval[1:]: ix = interval.index('-',1) a,b = int(interval[:ix]), int(interval[ix+1:]) if b == a: if a != 1 and not a.is_prime(): return True if b > a and b > 3: return True else: a = ZZ(interval) if a != 1 and not a.is_prime(): return True parse_ints(info,query,'n','degree') parse_ints(info,query,'t') parse_ints(info,query,'order') parse_ints(info,query,'nilpotency') parse_bracketed_posints(info, query, qfield='gapidfull', split=False, exactlength=2, keepbrackets=True, name='GAP id', field='gapid') for param in ('cyc', 'solv', 'prim'): parse_bool(info, query, param, process=int, blank=['0','Any']) parse_restricted(info,query,'parity',allowed=[1,-1],process=int,blank=['0','Any']) if 'order' in query and 'n' not in query: query['__sort__'] = ['order', 'gapid', 'n', 't'] degree_str = prep_ranges(info.get('n')) info['show_subs'] = degree_str is None or (LIST_RE.match(degree_str) and includes_composite(degree_str)) info['group_display'] = group_display_short info['yesno'] = yesno info['wgg'] = WebGaloisGroup.from_data
def hgm_search(info, query): info["search_type"] = search_type = info.get("search_type", info.get("hst", "Motive")) if search_type in ["Family", "RandomFamily"]: query['__title__'] = r'Hypergeometric Family over $\Q$ Search Result' query['__err_title__'] = r'Hypergeometric Family over $\Q$ Search Input Error' query['__table__'] = db.hgm_families queryab = {} p = info.get('p', '2') for param in ['A', 'B']: parse_bracketed_posints(info, queryab, param, split=True, keepbrackets=True, listprocess=lambda a: sorted(a, reverse=True)) parse_bracketed_posints(info, queryab, 'Ap', qfield='A'+p, split=True, keepbrackets=True, listprocess=lambda a: sorted(a, reverse=True)) parse_bracketed_posints(info, queryab, 'Bp', qfield='B'+p, split=True, keepbrackets=True, listprocess=lambda a: sorted(a, reverse=True)) parse_bracketed_posints(info, queryab, 'Apperp', qfield='Au'+p, split=True, keepbrackets=True, listprocess=lambda a: sorted(a, reverse=True)) parse_bracketed_posints(info, queryab, 'Bpperp', qfield='Bu'+p, split=True, keepbrackets=True, listprocess=lambda a: sorted(a, reverse=True)) # Combine the parts of the query if there are A,B parts if queryab: queryabrev = {} for k in queryab.keys(): queryabrev[k+'rev'] = queryab[k] query['$or'] = [queryab, queryabrev] # generic, irreducible not in DB yet parse_ints(info, query, 'degree') parse_ints(info, query, 'weight') parse_bracketed_posints(info, query, 'famhodge', 'family Hodge vector',split=True) parse_restricted(info, query, 'sign', allowed=['+1',1,-1], process=int) # Make a version to search reversed way if search_type not in ["Family", "RandomFamily"]: parse_ints(info, query, 'conductor', 'Conductor' , 'cond') parse_rational(info, query, 't') parse_bracketed_posints(info, query, 'hodge', 'Hodge vector') query['__sort__'] = ['degree', 'weight', 'A', 'B', 'label'] # Should search on analytic conductor when available # Sorts A and B first by length, then by the elements of the list; could go another way info['make_label'] = make_abt_label info['make_t_label'] = make_t_label info['ab_label'] = ab_label info['display_t'] = display_t info['factorint'] = factorint
def artin_representation_search(info, query): query['Hide'] = 0 info['sign_code'] = 0 parse_primes(info,query,"unramified",name="Unramified primes", qfield="BadPrimes",mode="complement") parse_primes(info,query,"ramified",name="Ramified primes", qfield="BadPrimes",mode="append") parse_element_of(info,query,"root_number",qfield="GalConjSigns") parse_restricted(info,query,"frobenius_schur_indicator",qfield="Indicator", allowed=[1,0,-1],process=int) parse_container(info,query, 'container',qfield='Container', name="Smallest permutation representation") parse_galgrp(info,query,"group",name="Group",qfield=("Galn","Galt")) parse_ints(info,query,'dimension',qfield='Dim') parse_ints(info,query,'conductor',qfield='Conductor')
def artin_representation_search(info, query): query['Hide'] = 0 info['sign_code'] = 0 parse_primes(info, query, "unramified", name="Unramified primes", qfield="BadPrimes", mode="exclude") parse_primes(info, query, "ramified", name="Ramified primes", qfield="BadPrimes", mode=info.get("ram_quantifier")) parse_restricted(info, query, "root_number", qfield="GalConjSigns", allowed=[-1, 1], process=lambda x: {"$contains": [int(x)]}) parse_restricted(info, query, "frobenius_schur_indicator", qfield="Indicator", allowed=[1, 0, -1], process=int) parse_container(info, query, 'container', qfield='Container', name="Smallest permutation representation") parse_galgrp(info, query, "group", name="Group", qfield=("GaloisLabel", None)) parse_ints(info, query, 'dimension', qfield='Dim') parse_ints(info, query, 'conductor', qfield='Conductor') parse_ints(info, query, 'num_ram', qfield='NumBadPrimes') parse_projective_group(info, query, 'projective_image', qfield='Proj_GAP') parse_projective_type(info, query, 'projective_image_type', qfield='Proj_GAP') # Backward support for old URLs if 'Is_Even' in info: info['parity'] = info.pop('Is_Even') parse_bool(info, query, 'parity', qfield='Is_Even')
def hgm_search(info, query): family_search = False if info.get('Submit Family') or info.get('family'): family_search = True query['__title__'] = r'Hypergeometric Family over $\Q$ Search Result' query[ '__err_title__'] = r'Hypergeometric Family over $\Q$ Search Input Error' query['__table__'] = db.hgm_families queryab = {} for param in [ 'A', 'B', 'A2', 'B2', 'A3', 'B3', 'A5', 'B5', 'A7', 'B7', 'Au2', 'Bu2', 'Au3', 'Bu3', 'Au5', 'Bu5', 'Au7', 'Bu7' ]: parse_bracketed_posints(info, queryab, param, split=False, listprocess=lambda a: sorted(a, reverse=True)) # Combine the parts of the query if there are A,B parts if queryab: queryabrev = {} for k in queryab.keys(): queryabrev[k + 'rev'] = queryab[k] query['$or'] = [queryab, queryabrev] # generic, irreducible not in DB yet parse_ints(info, query, 'degree') parse_ints(info, query, 'weight') parse_bracketed_posints(info, query, 'famhodge', 'family Hodge vector', split=False) parse_restricted(info, query, 'sign', allowed=['+1', 1, -1], process=int) # Make a version to search reversed way if not family_search: parse_ints(info, query, 'conductor', 'Conductor', 'cond') parse_rational(info, query, 't') parse_bracketed_posints(info, query, 'hodge', 'Hodge vector') info['make_label'] = make_abt_label info['make_t_label'] = make_t_label info['ab_label'] = ab_label info['display_t'] = display_t info['family'] = family_search info['factorint'] = factorint
def hgm_search(info, query): family_search = False if info.get('Submit Family') or info.get('family'): family_search = True query['__title__'] = r'Hypergeometric Family over $\Q$ Search Result' query['__err_title__'] = r'Hypergeometric Family over $\Q$ Search Input Error' query['__table__'] = db.hgm_families queryab = {} for param in ['A', 'B', 'A2', 'B2', 'A3', 'B3', 'A5', 'B5', 'A7', 'B7', 'Au2', 'Bu2', 'Au3', 'Bu3', 'Au5', 'Bu5', 'Au7', 'Bu7']: parse_bracketed_posints(info, queryab, param, split=False, listprocess=lambda a: sorted(a, reverse=True)) # Combine the parts of the query if there are A,B parts if queryab: queryabrev = {} for k in queryab.keys(): queryabrev[k+'rev'] = queryab[k] query['$or'] = [queryab, queryabrev] # generic, irreducible not in DB yet parse_ints(info, query, 'degree') parse_ints(info, query, 'weight') parse_bracketed_posints(info, query, 'famhodge', 'family Hodge vector',split=False) parse_restricted(info, query, 'sign', allowed=['+1',1,-1], process=int) # Make a version to search reversed way if not family_search: parse_ints(info, query, 'conductor', 'Conductor' , 'cond') parse_rational(info, query, 't') parse_bracketed_posints(info, query, 'hodge', 'Hodge vector') info['make_label'] = make_abt_label info['make_t_label'] = make_t_label info['ab_label'] = ab_label info['display_t'] = display_t info['family'] = family_search info['factorint'] = factorint
def galois_group_search(info, query): def includes_composite(s): s = s.replace(' ', '').replace('..', '-') for interval in s.split(','): if '-' in interval[1:]: ix = interval.index('-', 1) a, b = int(interval[:ix]), int(interval[ix + 1:]) if b == a: if a != 1 and not a.is_prime(): return True if b > a and b > 3: return True else: a = ZZ(interval) if a != 1 and not a.is_prime(): return True if info.get('jump_to', '').strip(): jump_list = [ "1T1", "2T1", "3T1", "4T1", "4T2", "5T1", "6T1", "7T1", "8T1", "8T2", "8T3", "8T5", "9T1", "9T2", "10T1", "11T1", "12T1", "12T2", "12T5", "13T1", "14T1", "15T1", "16T1", "16T2", "16T3", "16T4", "16T5", "16T7", "16T8", "16T14", "17T1", "18T1", "18T2", "19T1", "20T1", "20T2", "20T3", "21T1", "22T1", "23T1", "24T1", "24T2", "24T3", "24T4", "24T5", "24T6", "24T8", "25T1", "25T2", "26T1", "27T1", "27T2", "27T4", "28T1", "28T2", "28T3", "29T1", "30T1", "31T1", "32T32", "32T33", "32T34", "32T35", "32T36", "32T37", "32T38", "32T39", "32T40", "32T41", "32T42", "32T43", "32T44", "32T45", "32T46", "32T47", "32T48", "32T49", "32T50", "32T51", "33T1", "34T1", "35T1", "36T1", "36T2", "36T3", "36T4", "36T7", "36T9", "37T1", "38T1", "39T1", "40T1", "40T2", "40T3", "40T4", "40T5", "40T7", "40T8", "40T13", "41T1", "42T1", "43T1", "44T1", "44T2", "44T3", "45T1", "45T2", "46T1", "47T1" ] strip_label = info.get('jump_to', '').strip().upper() # If the user entered a simple label if re.match(r'^\d+T\d+$', strip_label): return redirect(url_for('.by_label', label=strip_label), 301) parse_galgrp( info, query, qfield=['label', 'n'], name='a Galois group label', field='jump_to', list_ok=False, err_msg= "It needs to be a transitive group in nTj notation, such as 5T1, a GAP id, such as [4,1], or a <a title = 'Galois group labels' knowl='nf.galois_group.name'>group label</a>" ) if query.get('label', '') in jump_list: return redirect(url_for('.by_label', label=query['label']), 301) else: # convert this to a regular search info['gal'] = info['jump_to'] parse_ints(info, query, 'n', 'degree') parse_ints(info, query, 't') parse_ints(info, query, 'order') parse_ints(info, query, 'nilpotency') parse_galgrp(info, query, qfield=['label', 'n'], name='Galois group', field='gal') for param in ('cyc', 'solv', 'prim'): parse_bool(info, query, param, process=int, blank=['0', 'Any']) parse_restricted(info, query, 'parity', allowed=[1, -1], process=int, blank=['0', 'Any']) if 'order' in query and 'n' not in query: query['__sort__'] = ['order', 'gapid', 'n', 't'] degree_str = prep_ranges(info.get('n')) info['show_subs'] = degree_str is None or (LIST_RE.match(degree_str) and includes_composite(degree_str)) info['group_display'] = group_display_short info['yesno'] = yesno info['wgg'] = WebGaloisGroup.from_data