├── .coveragerc ├── .environment.yml ├── .github └── workflows │ ├── autopep8.yml │ ├── generate-matrix.py │ ├── generate_autopep8codes.py │ ├── matrix_includes.json │ └── python-package.yml ├── .gitignore ├── CONTRIBUTORS.yaml ├── Development.md ├── GettingStarted.md ├── Inventory.md ├── LICENSE ├── Postgres_FAQ.md ├── README.md ├── StyleGuide.md ├── codestyle.sh ├── lmfdb ├── __init__.py ├── abvar │ ├── __init__.py │ └── fq │ │ ├── __init__.py │ │ ├── download.py │ │ ├── isog_class.py │ │ ├── main.py │ │ ├── search_parsing.py │ │ ├── stats.py │ │ ├── templates │ │ ├── abvarfq-count-results.html │ │ ├── abvarfq-index.html │ │ ├── abvarfq-refine-search.html │ │ └── show-abvarfq.html │ │ ├── test_av.py │ │ ├── test_browse_page.py │ │ └── web_abvar.py ├── api │ ├── __init__.py │ ├── api.py │ ├── templates │ │ ├── api-stats.html │ │ ├── api.html │ │ ├── apidata.html │ │ ├── apischema.html │ │ ├── collection.html │ │ └── database_options.html │ └── test_api.py ├── api2 │ ├── __init__.py │ ├── api2.py │ ├── searchers.py │ ├── static │ │ └── viewer.js │ ├── templates │ │ ├── api.css │ │ ├── api2.html │ │ ├── api_demo.html │ │ ├── base_pretty.html │ │ ├── example.html │ │ └── view.html │ └── utils.py ├── app.py ├── artin_representations │ ├── __init__.py │ ├── cyc_alt_res_engine.py │ ├── main.py │ ├── math_classes.py │ ├── templates │ │ ├── artin-representation-galois-orbit.html │ │ ├── artin-representation-index.html │ │ ├── artin-representation-set-show.html │ │ └── artin-representation-show.html │ └── test_artin_representation.py ├── belyi │ ├── __init__.py │ ├── belyi_TODO.txt │ ├── labels.txt │ ├── main.py │ ├── templates │ │ ├── belyi_base.html │ │ ├── belyi_browse.html │ │ ├── belyi_galmap.html │ │ ├── belyi_passport.html │ │ └── embedded_belyi_map.html │ ├── test_belyi.py │ └── web_belyi.py ├── bianchi_modular_forms │ ├── __init__.py │ ├── bianchi_modular_form.py │ ├── templates │ │ ├── bmf-browse.html │ │ ├── bmf-field_dim_table.html │ │ ├── bmf-newform.html │ │ └── bmf-space.html │ ├── test_bmf.py │ └── web_BMF.py ├── characters │ ├── HeckeCharacters.py │ ├── ListCharacters.py │ ├── TinyConrey.py │ ├── __init__.py │ ├── main.py │ ├── pari_search_test.sage │ ├── templates │ │ ├── CharFamily.html │ │ ├── CharGroup.html │ │ ├── Character.html │ │ ├── CharacterCommon.html │ │ ├── CharacterGaloisOrbit.html │ │ ├── CharacterGroupTable.html │ │ ├── CharacterNavigate.html │ │ ├── CharacterTable.html │ │ ├── ConductorList.html │ │ ├── Hecke.html │ │ ├── ModulusList.html │ │ ├── OrderList.html │ │ └── character_refine_search.html │ ├── test_characters.py │ ├── utils.py │ └── web_character.py ├── classical_modular_forms │ ├── __init__.py │ ├── cmf_TODO.txt │ ├── cmf_test_pages.py │ ├── code-form.yaml │ ├── code-space.yaml │ ├── code.yaml │ ├── download.py │ ├── eta.yaml │ ├── main.py │ ├── templates │ │ ├── cmf_browse.html │ │ ├── cmf_dimension_search_results.html │ │ ├── cmf_dimension_space_search_results.html │ │ ├── cmf_dimension_table_display.html │ │ ├── cmf_embedded_newform.html │ │ ├── cmf_full_gamma1_space.html │ │ ├── cmf_newform.html │ │ ├── cmf_newform_common.html │ │ ├── cmf_refine_search.html │ │ ├── cmf_space.html │ │ ├── cmf_space_trace_search_results.html │ │ ├── cmf_trace_display.html │ │ └── cmf_trace_search_results.html │ ├── test_cmf.py │ ├── test_cmf2.py │ ├── web_newform.py │ └── web_space.py ├── cluster_pictures │ ├── __init__.py │ ├── cluster_picture.py │ ├── test_clusterpicture.py │ └── web_cluster_picture.py ├── crystals │ ├── __init__.py │ ├── main.py │ └── templates │ │ ├── crystals-index.html │ │ ├── crystals.html │ │ └── littelmann-paths.html ├── doc_chars.rst ├── ecnf │ ├── WebEllipticCurve.py │ ├── __init__.py │ ├── code.yaml │ ├── ecnf_stats.py │ ├── ecnf_test_pages.py │ ├── isog_class.py │ ├── main.py │ ├── searchers.py │ ├── templates │ │ ├── ecnf-by-degree.html │ │ ├── ecnf-by-signature.html │ │ ├── ecnf-curve.html │ │ ├── ecnf-index.html │ │ ├── ecnf-isoclass.html │ │ └── ecnf-stats.html │ ├── test_ecnf.py │ └── test_isog_class.py ├── elliptic_curves │ ├── __init__.py │ ├── code.yaml │ ├── congruent_numbers.py │ ├── elliptic_curve.py │ ├── isog_class.py │ ├── searchers.py │ ├── templates │ │ ├── bhkssw.html │ │ ├── congruent_number_data.html │ │ ├── ec-curve.html │ │ ├── ec-index.html │ │ ├── ec-isoclass.html │ │ ├── ec-padic-data.html │ │ ├── ec-stats.html │ │ ├── single_congruent_number.html │ │ └── sw_ecdb.html │ ├── test_browse_page.py │ ├── test_ell_curves.py │ └── web_ec.py ├── galois_groups │ ├── Database-info │ ├── __init__.py │ ├── code.yaml │ ├── main.py │ ├── templates │ │ ├── character-table.html │ │ ├── gg-error.html │ │ ├── gg-index.html │ │ └── gg-show-group.html │ ├── test_galoisgroup.py │ └── transitive_group.py ├── genus2_curves │ ├── __init__.py │ ├── code.yaml │ ├── g2c_test_pages.py │ ├── main.py │ ├── templates │ │ ├── g2c_browse.html │ │ ├── g2c_curve.html │ │ └── g2c_isogeny_class.html │ ├── test_genus2_curves.py │ └── web_g2c.py ├── groups │ ├── __init__.py │ ├── abstract │ │ ├── __init__.py │ │ ├── circles.py │ │ ├── code.yaml │ │ ├── groups_test_pages.py │ │ ├── main.py │ │ ├── stats.py │ │ ├── templates │ │ │ ├── abstract-index.html │ │ │ ├── abstract-show-group.html │ │ │ ├── abstract-show-subgroup.html │ │ │ ├── auto_gens_page.html │ │ │ ├── character_table.html │ │ │ ├── character_table_page.html │ │ │ ├── diagram_page.html │ │ │ ├── rational_character_table.html │ │ │ └── rational_character_table_page.html │ │ ├── test_abstract_groups.py │ │ ├── test_browse_page.py │ │ ├── verify.py │ │ └── web_groups.py │ ├── glnC │ │ ├── __init__.py │ │ ├── main.py │ │ └── templates │ │ │ ├── glnC-index.html │ │ │ └── glnC-show-group.html │ └── glnQ │ │ ├── __init__.py │ │ ├── main.py │ │ └── templates │ │ ├── glnQ-index.html │ │ └── glnQ-show-group.html ├── half_integral_weight_forms │ ├── __init__.py │ ├── half_integral_form.py │ └── templates │ │ ├── half_integral_weight_form.html │ │ ├── half_integral_weight_form_all.html │ │ └── half_integral_weight_form_search.html ├── hecke_algebras │ ├── __init__.py │ ├── hecke_algebras_stats.py │ ├── main.py │ ├── templates │ │ ├── hecke_algebras-error.html │ │ ├── hecke_algebras-index.html │ │ ├── hecke_algebras-search.html │ │ ├── hecke_algebras-single.html │ │ └── hecke_algebras_l_adic-single.html │ └── test_hecke_algebras.py ├── higher_genus_w_automorphisms │ ├── __init__.py │ ├── code.yaml │ ├── hgcwa_stats.py │ ├── main.py │ ├── templates │ │ ├── hgcwa-index.html │ │ ├── hgcwa-show-family.html │ │ ├── hgcwa-show-passport.html │ │ ├── hgcwa-stats-groups-per-genus.html │ │ ├── hgcwa-stats.html │ │ └── hgcwa-topological-action.html │ └── test_hgcwa.py ├── hilbert_modular_forms │ ├── __init__.py │ ├── hilbert_field.py │ ├── hilbert_modular_form.py │ ├── hmf_data_format.txt │ ├── hmf_data_format_new.txt │ ├── hmf_stats.py │ ├── q_expansion.py │ ├── templates │ │ ├── hilbert_modular_form.html │ │ ├── hilbert_modular_form_all.html │ │ ├── hmf_by_degree.html │ │ └── hmf_stats.html │ ├── test_hmf.py │ └── web_HMF.py ├── homepage │ ├── __init__.py │ ├── boxes.py │ ├── index_boxes.yaml │ ├── random.py │ ├── sidebar.py │ └── sidebar.yaml ├── hypergm │ ├── __init__.py │ ├── data_dump_hgm.txt │ ├── hodge.py │ ├── main.py │ ├── plot.py │ ├── templates │ │ ├── hgm-index.html │ │ ├── hgm-show-motive.html │ │ └── hgm_family.html │ ├── test_hgm.py │ └── web_family.py ├── knowledge │ ├── __init__.py │ ├── knowl.py │ ├── main.py │ └── templates │ │ ├── knowl-broken-links.html │ │ ├── knowl-columns.html │ │ ├── knowl-comment-history.html │ │ ├── knowl-diff-core.html │ │ ├── knowl-diff.html │ │ ├── knowl-edit.html │ │ ├── knowl-history.html │ │ ├── knowl-index.html │ │ ├── knowl-knowl-history.html │ │ ├── knowl-orphans.html │ │ ├── knowl-review-recent.html │ │ ├── knowl-show.html │ │ └── knowl-test.html ├── lattice │ ├── __init__.py │ ├── isom.py │ ├── lattice_stats.py │ ├── main.py │ ├── templates │ │ ├── lattice-error.html │ │ ├── lattice-index.html │ │ └── lattice-single.html │ └── test_lattice.py ├── lfunctions │ ├── HodgeTransformations.py │ ├── Lfunction.py │ ├── LfunctionComp.py │ ├── LfunctionDatabase.py │ ├── LfunctionLcalc.py │ ├── LfunctionPlot.py │ ├── Lfunction_base.py │ ├── Lfunctionutilities.py │ ├── __init__.py │ ├── main.py │ ├── templates │ │ ├── Lfunction.html │ │ ├── LfunctionContents.html │ │ ├── LfunctionEulerSearchResults.html │ │ ├── LfunctionNavigate.html │ │ ├── LfunctionSimple.html │ │ ├── LfunctionTraceSearchResults.html │ │ ├── MaassformGL2.html │ │ ├── MaassformGLn.html │ │ ├── cuspformGL2.html │ │ ├── ellipticcurve.html │ │ └── genus2curve.html │ └── test_lfunctions.py ├── lmfdb_database.py ├── local_fields │ ├── __init__.py │ ├── main.py │ ├── templates │ │ ├── lf-index.html │ │ └── lf-show-field.html │ └── test_localfields.py ├── logger │ ├── __init__.py │ ├── start.py │ └── utils.py ├── maass_forms │ ├── __init__.py │ ├── main.py │ ├── plot.py │ ├── templates │ │ ├── maass_browse.html │ │ ├── maass_browse_graph.html │ │ └── maass_form.html │ ├── test_maass.py │ └── web_maassform.py ├── modl_galois_representations │ ├── __init__.py │ ├── main.py │ ├── templates │ │ ├── modlgal_browse.html │ │ └── modlgal_rep.html │ └── web_modlgal.py ├── modlmf │ ├── __init__.py │ ├── main.py │ ├── modlmf_stats.py │ └── templates │ │ ├── modlmf-error.html │ │ ├── modlmf-index.html │ │ ├── modlmf-search.html │ │ └── modlmf-single.html ├── modular_curves │ ├── __init__.py │ ├── family.py │ ├── isog_class.py │ ├── main.py │ ├── templates │ │ ├── family.html │ │ ├── lat_diagram_page.html │ │ ├── modcurve.html │ │ ├── modcurve_browse.html │ │ ├── modcurve_family.html │ │ └── modcurve_isoclass.html │ ├── test_modular_curves.py │ ├── upload.py │ └── web_curve.py ├── motives │ ├── __init__.py │ ├── main.py │ └── templates │ │ ├── hypergeometric-index.html │ │ ├── motive-error.html │ │ └── motive-index.html ├── nfutils │ ├── __init__.py │ └── psort.py ├── number_fields │ ├── Database-info │ ├── __init__.py │ ├── code.yaml │ ├── draw_spectrum.py │ ├── number_field.py │ ├── templates │ │ ├── class_group_data.html │ │ ├── galois_groups.html │ │ ├── nf-index.html │ │ ├── nf-show-field.html │ │ ├── nf-statistics.html │ │ └── number_field_space.html │ ├── test_numberfield.py │ └── web_number_field.py ├── permutations │ ├── __init__.py │ ├── main.py │ └── templates │ │ ├── permutations-index.html │ │ └── permutations.html ├── riemann │ ├── __init__.py │ ├── main.py │ └── stieltjes │ │ ├── __init__.py │ │ ├── stieltjes.py │ │ └── templates │ │ ├── getone.html │ │ └── stieltjes.html ├── sato_tate_groups │ ├── __init__.py │ ├── main.py │ ├── templates │ │ ├── st_browse.html │ │ └── st_display.html │ └── test_st.py ├── siegel_modular_forms │ ├── DESIGN_CONSIDERATIONS.md │ ├── __init__.py │ ├── dimensions.py │ ├── family.py │ ├── family_data.py │ ├── sample.py │ ├── siegel_core.py │ ├── siegel_modular_form.py │ ├── smf_test_pages.py │ ├── templates │ │ ├── ModularForm_GSp4_Q_Sp4Zj.html │ │ ├── ModularForm_GSp4_Q_dimensions.html │ │ ├── ModularForm_GSp4_Q_family.html │ │ ├── ModularForm_GSp4_Q_full_level_space.html │ │ ├── ModularForm_GSp4_Q_index.html │ │ ├── ModularForm_GSp4_Q_sample.html │ │ ├── ModularForm_GSp4_Q_search_results.html │ │ └── includes │ │ │ ├── dimension_table.html │ │ │ └── form_for_dimension_table_search.html │ └── test_siegel_modular_forms.py ├── static │ ├── default_robots.txt │ ├── diff_match_patch.js │ ├── favicon.ico │ ├── graphs │ │ └── graph.js │ ├── groups.js │ ├── images │ │ ├── 1dot.svg │ │ ├── 2dot.svg │ │ ├── 389a.png │ │ ├── 3dot.svg │ │ ├── 4dot.svg │ │ ├── MaassExample.png │ │ ├── Riemann.jpg │ │ ├── Riemann.png │ │ ├── SL4.svg │ │ ├── Sp4.svg │ │ ├── announcements.png │ │ ├── back_disabled.jpg │ │ ├── back_disabled.png │ │ ├── back_enabled.jpg │ │ ├── back_enabled.png │ │ ├── back_enabled_hover.png │ │ ├── bg-container.png │ │ ├── bg-editor-bbcode.png │ │ ├── bg-editor-dotclear.png │ │ ├── bg-editor-html.png │ │ ├── bg-editor-json.png │ │ ├── bg-editor-markdown.png │ │ ├── bg-editor-textile.png │ │ ├── bg-editor-wiki.png │ │ ├── bg-editor-xml.png │ │ ├── bg-editor.png │ │ ├── black-asc.gif │ │ ├── black-desc.gif │ │ ├── black-unsorted.gif │ │ ├── bold.png │ │ ├── browseGraphChar_1_20.svg │ │ ├── browseGraphChar_1_20.svgz │ │ ├── browseGraphChar_1_25.svg │ │ ├── browseGraphChar_1_35.svg │ │ ├── browseGraphHoloNew_0.501.svg │ │ ├── browseGraphHoloNew_1.svg │ │ ├── browseGraphHolo_22_14_2a.svg │ │ ├── browseGraphHolo_22_14_3a.svg │ │ ├── browseGraphHolo_22_14_4a.svg │ │ ├── browseGraphHolo_22_14_5a.svg │ │ ├── citations.png │ │ ├── cite.png │ │ ├── code.png │ │ ├── compute.png │ │ ├── copy.svg │ │ ├── disk-load.png │ │ ├── disk-save.png │ │ ├── fame.png │ │ ├── families.png │ │ ├── forward_disabled.jpg │ │ ├── forward_disabled.png │ │ ├── forward_enabled.jpg │ │ ├── forward_enabled.png │ │ ├── forward_enabled_hover.png │ │ ├── github.png │ │ ├── gl3eigs.png │ │ ├── h1.png │ │ ├── h2.png │ │ ├── h3.png │ │ ├── h4.png │ │ ├── h5.png │ │ ├── h6.png │ │ ├── handle.png │ │ ├── italic.png │ │ ├── key_degree2.png │ │ ├── knowledge.png │ │ ├── link.png │ │ ├── list-bullet.png │ │ ├── list-numeric.png │ │ ├── lmfdb-logo-alpha.png │ │ ├── lmfdb-logo-beta.png │ │ ├── lmfdb-logo.png │ │ ├── lmfdb-logo.svg │ │ ├── lmfdbmap.svg │ │ ├── map.png │ │ ├── menu.png │ │ ├── next.png │ │ ├── pencil.png │ │ ├── picture.png │ │ ├── plot.png │ │ ├── preview.png │ │ ├── previous.png │ │ ├── progress-green.gif │ │ ├── quotes.png │ │ ├── raw_to_tset.svg │ │ ├── related.png │ │ ├── search.png │ │ ├── search2.png │ │ ├── smalluniverse.png │ │ ├── sort_asc.png │ │ ├── sort_asc_disabled.png │ │ ├── sort_both.png │ │ ├── sort_desc.png │ │ ├── sort_desc_disabled.png │ │ ├── sp_image.png │ │ ├── submenu.png │ │ ├── tset_to_raw.svg │ │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png │ │ ├── ui-bg_diagonals-thick_20_666666_40x40.png │ │ ├── ui-bg_glass_100_f6f6f6_1x400.png │ │ ├── ui-bg_glass_100_fdf5ce_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_gloss-wave_35_f6a828_500x100.png │ │ ├── ui-bg_highlight-soft_100_eeeeee_1x100.png │ │ ├── ui-bg_highlight-soft_75_ffe45c_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_228ef1_256x240.png │ │ ├── ui-icons_ef8c08_256x240.png │ │ ├── ui-icons_ffd27a_256x240.png │ │ ├── ui-icons_ffffff_256x240.png │ │ ├── url-ext.gif │ │ └── url.png │ ├── jquery.column.min.js │ ├── jquery.markitup.js │ ├── jquery.markitup.markdown.js │ ├── jquery.tablesorter.js │ ├── js │ │ └── snap.svg-min.js │ ├── knowl_diff.js │ ├── knowl_edit.js │ ├── knowl_history.js │ ├── knowl_review.js │ ├── lmfdb.js │ ├── lmfdbmap │ │ ├── lmfdbmap_code.js │ │ ├── math_descriptions.js │ │ └── snap.svg-min.js │ ├── markdown.css │ ├── markitup.css │ ├── modcurve.js │ ├── notify.min.js │ ├── raw_typeset.js │ ├── robots.txt │ ├── showdown.min.js │ └── validate.js ├── symL │ ├── __init__.py │ ├── symL.py │ └── sympowlmfdb.py ├── templates │ ├── 404.html │ ├── 500.html │ ├── 503.html │ ├── about.html │ ├── acknowledgment.html │ ├── base.html │ ├── bigpicture.html │ ├── checklist-fs.html │ ├── checklist.html │ ├── citation.html │ ├── contact.html │ ├── count_results.html │ ├── datasets.html │ ├── debug_info.html │ ├── display_stats.html │ ├── double.html │ ├── download_search_results.html │ ├── dummy_download_search_results.html │ ├── dynamic_stats.html │ ├── dynamic_stats_input.html │ ├── embedded_results.html │ ├── form.html │ ├── forward_back.html │ ├── hidden_search_inputs.html │ ├── homepage.html │ ├── index-boxes.html │ ├── interesting.html │ ├── knowl-defs.html │ ├── lucant.html │ ├── management.html │ ├── matches.html │ ├── mergely.html │ ├── motives.html │ ├── multi.html │ ├── not_yet_implemented.html │ ├── problem.html │ ├── quadratic_twists │ │ ├── iso_class.html │ │ └── quadratic_twists.html │ ├── raw │ │ ├── index.html │ │ └── query.html │ ├── refine_search_form.html │ ├── search.html │ ├── search_results.html │ ├── search_results_table.html │ ├── sidebar.html │ ├── single.html │ ├── stat_1d.html │ ├── stat_2d.html │ ├── style.css │ ├── universe.html │ ├── universe │ │ └── lmfdbmap │ │ │ ├── lmfdbmap.svg │ │ │ └── lmfdbmap_style.css │ ├── upload_data.html │ └── workshops.html ├── tensor_products │ ├── __init__.py │ ├── galois_reps.py │ ├── main.py │ └── templates │ │ ├── tensor_products_index.html │ │ └── tensor_products_navigate.html ├── tests │ ├── __init__.py │ ├── test_acknowlegments.py │ ├── test_dynamic_knowls.py │ ├── test_external.py │ ├── test_homepage.py │ ├── test_root.py │ ├── test_spelling.py │ ├── test_template_namespace.py │ ├── test_tensor_products.py │ ├── test_utils.py │ └── test_workshoplinks.py ├── typed_data │ ├── Lfunction_types.py │ ├── __init__.py │ ├── standard_types.py │ └── type_generation.py ├── uploads │ ├── process.py │ └── verify.py ├── users │ ├── __init__.py │ ├── main.py │ ├── pwdmanager.py │ ├── recaptcha.py │ ├── templates │ │ ├── register.html │ │ ├── user-detail.html │ │ ├── user-info.html │ │ ├── user-list.html │ │ └── user-uploads.html │ └── test_users.py ├── utils │ ├── __init__.py │ ├── cocalcwrap.py │ ├── color.py │ ├── common_regex.py │ ├── config.py │ ├── display_stats.py │ ├── downloader.py │ ├── interesting.py │ ├── names_and_urls.py │ ├── random_wrap.py │ ├── search_boxes.py │ ├── search_columns.py │ ├── search_parsing.py │ ├── search_wrapper.py │ ├── trace_hash.py │ ├── uploader.py │ ├── utilities.py │ └── web_display.py ├── verify │ ├── __init__.py │ ├── follower.py │ ├── gps │ │ └── gps_gl2zhat_fine.py │ ├── mf │ │ ├── mf.py │ │ ├── mf_gamma1.py │ │ ├── mf_gamma1_portraits.py │ │ ├── mf_hecke_cc.py │ │ ├── mf_hecke_lpolys.py │ │ ├── mf_hecke_nf.py │ │ ├── mf_hecke_traces.py │ │ ├── mf_newform_portraits.py │ │ ├── mf_newforms.py │ │ ├── mf_newspace_portraits.py │ │ └── mf_newspaces.py │ ├── modcurve │ │ └── modcurve_modelmaps.py │ ├── verification.py │ └── verify_tables.py ├── website.py └── zeros │ ├── __init__.py │ ├── main.py │ └── zeta │ ├── __init__.py │ ├── platt_zeros.py │ ├── templates │ └── zeta.html │ └── zetazeros.py ├── perfmon ├── ECQpages.txt ├── HMFpages.txt ├── NFpages.txt ├── README.md ├── random_timings.sh └── tcurl.sh ├── requirements.txt ├── scripts ├── __init__.py ├── abvar │ ├── fix_quotes.py │ └── fq_isog.py ├── artin_representations │ ├── extract_art.py │ ├── import_art_nf.py │ ├── old-import_art_nf.py │ └── pull-reps.py ├── belyi │ ├── README.md │ ├── Schema.md │ ├── __init__.py │ ├── bad_galois_orbits.py │ ├── find_friends.py │ ├── format_plane_model.py │ ├── new_labels.py │ ├── old │ │ ├── db.py │ │ ├── make_test_tables.py │ │ ├── sample_example.py │ │ └── update_db.py │ ├── passport_new_attrs.py │ └── primitive.py ├── bianchi_modular_forms │ ├── import_bianchi_dimensions.py │ └── import_bianchi_forms.py ├── classical_modular_forms │ ├── README.md │ ├── check_ap2_amn_parallel.py │ ├── compare_hecke_cc_data.py │ ├── populate_analytic_ranks_in_mf_newforms.py │ ├── populate_embeddings_mf_hecke_cc.py │ ├── populate_euler_factors.py │ ├── populate_trace_hash_Lfunctions.py │ └── utils.psql ├── ecnf │ ├── __init__.py │ ├── bmf_check.py │ ├── elliptic_curve_to_ecnf_format.py │ └── hmf_check_find.py ├── elliptic_curves │ ├── import_ec_lfunction_data.py │ └── import_padic_ecdata.py ├── galois_groups │ └── import_gg_data.py ├── genus2_curves │ ├── g2LocSolv.py │ └── load_ratpts.py ├── groups │ └── Make-images │ │ ├── Readme │ │ ├── dump-group-names.py │ │ ├── dump-modcurve-names.py │ │ ├── images │ │ └── eq.tex │ │ ├── load-imgs.py │ │ ├── load-modcurve-imgs.py │ │ └── mytar ├── half_integral_weight_modular_forms │ └── half_int_weight_mf.py ├── hecke_algebras │ ├── hecke_algebras.py │ ├── hecke_algebras_db_stats.py │ ├── hecke_algebras_l_adic.py │ ├── hecke_algebras_mod_l_data.py │ ├── hecke_algebras_orbits.py │ └── hecke_algebras_single_orbit_data.py ├── higher_genus_w_automorphisms │ ├── hgcwa_complete_table.py │ ├── import_cap_data.py │ └── unique_groups_table.py ├── hmf │ ├── .gitignore │ ├── WebHMF.py │ ├── __init__.py │ ├── check_conjugates.py │ ├── convert_hecke_eigenvalues │ │ └── hecke_eigenvals.py │ ├── hmf-count-aps.sage │ ├── hmf-dump-fldpoly.sage │ ├── hmf-extra-data-dump.sage │ ├── import_hmf_data.py │ ├── import_hmf_data_fix_permuted_primes.py │ ├── import_hmf_data_gnu_phase_0.py │ ├── import_hmf_data_new_Galois_squarefull_forms.py │ ├── make-lp-file.sage │ ├── recompute_AL.py │ ├── recompute_AL_modp.py │ └── recompute_Galois_squarefull_forms.py ├── hypergm │ ├── import_hgm.py │ └── import_hgmfam.py ├── import_overwrite_generic.py ├── lattices │ ├── add_q_expansion_theta.py │ ├── lattice.py │ ├── lattice_db_stats.py │ └── lattice_nf.py ├── lfunctions │ ├── build_Lfunction_db.py │ ├── build_Lfunction_db_2.py │ ├── insert_zeros.py │ ├── populate_origin_ECQ.py │ └── populate_trace_hash_ECQG2Q.py ├── local_fields │ ├── import_fields.py │ └── lfprep.gp ├── maass │ └── import_maass_and_maass_lfun.py ├── modl_galois_representations │ └── import_modl.py ├── modlmf │ └── modlmf.py ├── number_fields │ ├── Readme │ ├── dump-label-data.py │ ├── import_galois_modules.py │ ├── import_nf_data.py │ └── prep.gp ├── reports │ ├── __init__.py │ ├── fill_inventory.py │ ├── inventory_legacy_uploader.py │ ├── inventory_patchup.py │ ├── jsonify_db_structure.py │ └── upload_helpers.py ├── sato_tate │ └── smallgroups.m └── siegel_modular_forms │ └── Yoshida_Lift.py ├── start-lmfdb.py ├── test.sh ├── tox.ini └── user-manager.py /.coveragerc: -------------------------------------------------------------------------------- 1 | # .coveragerc to control coverage.py 2 | [run] 3 | #branch = True 4 | #parallel = True 5 | 6 | [report] 7 | # Regexes for lines to exclude from consideration 8 | exclude_lines = 9 | # Have to re-enable the standard pragma 10 | pragma: no cover 11 | 12 | # Don't complain about missing debug-only code: 13 | def __repr__ 14 | if self\.debug 15 | 16 | # Don't complain if tests don't hit defensive assertion code: 17 | raise AssertionError 18 | raise NotImplementedError 19 | 20 | # Don't complain if non-runnable code isn't run: 21 | if 0: 22 | if __name__ == .__main__.: 23 | 24 | ignore_errors = True 25 | 26 | -------------------------------------------------------------------------------- /.environment.yml: -------------------------------------------------------------------------------- 1 | ## This is a conda environment file. 2 | ## Use it as follows: 3 | ## 4 | ## conda env create -f environment.yml 5 | ## 6 | ## See https://towardsdatascience.com/a-guide-to-conda-environments-bc6180fc533 7 | ## or https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html 8 | name: lmfdb 9 | channels: 10 | - conda-forge 11 | - defaults 12 | dependencies: 13 | - python 14 | - sage=10.4 15 | - tox 16 | - flask 17 | - werkzeug 18 | - parallel 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | password* 2 | secret_key 3 | secrets.ini 4 | config.ini 5 | 6 | *.pyc 7 | *.pyo 8 | *.so 9 | *.o 10 | *.c 11 | *.swp 12 | *~ 13 | 14 | 15 | flasklog 16 | slow_queries.log 17 | 18 | # Testing files 19 | htmlcov 20 | .coverage* 21 | .pytest_cache/ 22 | 23 | # vim swap files 24 | .*.sw? 25 | # backup files 26 | *~ 27 | paul_scripts 28 | 29 | local.sh 30 | 31 | .DS_Store 32 | .idea/ 33 | LMFDBinventory.log 34 | LMFDBtransactions_inv.log 35 | 36 | scripts/groups/Make-images/images/*.png 37 | -------------------------------------------------------------------------------- /codestyle.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # This script uses pep8 / autopep8 to find Python style errors 3 | # or even fixes them. 4 | # Usage: ./codestyle.sh or ./codestyle.sh [path/to/python/file ...] 5 | 6 | # Note: When using this codestyle fixing utility, don't forget that it 7 | # might introduce a lot of changes. That could be hard to merge! 8 | 9 | # increased line length. might get shorter in time ... for now even ignored 10 | #ARGS='--max-line-length=120 --ignore=E501' 11 | # E271 multiple spaces after keyword 12 | # E272 multiple spaces before keyword 13 | # E703 statement ends with a semicolon 14 | # E713 test for membership should be ‘not in’ 15 | # E714 test for object identity should be ‘is not’ 16 | # E722 do not use bare except, specify exception instead 17 | ARGS='--select=E271,E272,E703,E713,E714,E722' 18 | 19 | SAGE_COMMAND=$SAGE 20 | if [[ "$SAGE_COMMAND" == "" ]]; then 21 | SAGE_COMMAND=sage 22 | fi 23 | echo "Using Sage command $SAGE_COMMAND" 24 | 25 | # WARN: we set the aggressive flag 26 | AUTOPEP="$SAGE_COMMAND -python -m autopep8 -i --aggressive $ARGS" 27 | CODESTYLE="$SAGE_COMMAND -python -m pycodestyle $ARGS" 28 | 29 | if [ -n "$1" ]; then 30 | $AUTOPEP "$@" 31 | else 32 | cd `dirname "$0"` 33 | find lmfdb -iname '*.py' | xargs $CODESTYLE 34 | fi 35 | -------------------------------------------------------------------------------- /lmfdb/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | # psycodict was added as a dependency on May 10, 2024; we provide a useful error message for people upgrading 3 | try: 4 | import psycodict 5 | assert psycodict 6 | except ImportError: 7 | print('Missing dependency; try running "sage -pip install -r requirements.txt" in the LMFDB home folder.') 8 | raise 9 | 10 | from .lmfdb_database import db 11 | assert db 12 | -------------------------------------------------------------------------------- /lmfdb/abvar/__init__.py: -------------------------------------------------------------------------------- 1 | from lmfdb.app import app 2 | from lmfdb.logger import make_logger 3 | from flask import Blueprint 4 | 5 | abvar_page = Blueprint( 6 | "abvar", __name__, template_folder="templates", static_folder="static" 7 | ) 8 | abvar_logger = make_logger(abvar_page) 9 | 10 | 11 | @abvar_page.context_processor 12 | def body_class(): 13 | return {"body_class": "abvar"} 14 | 15 | 16 | app.register_blueprint(abvar_page, url_prefix="/Variety/Abelian") 17 | 18 | # API2 has been disabled for now 19 | #from lmfdb.api2.searchers import register_search_function 20 | #register_search_function( 21 | # "abvar", 22 | # "Abelian varieties", 23 | # "Search over abelian varieties", 24 | # auto_search="av_fqisog", 25 | # inv=["av", "av_fqisog"], 26 | #) 27 | -------------------------------------------------------------------------------- /lmfdb/abvar/fq/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | abvarfq_page = Blueprint("abvarfq", __name__, template_folder="templates", static_folder="static") 7 | abvarfq_logger = make_logger(abvarfq_page) 8 | 9 | 10 | @abvarfq_page.context_processor 11 | def body_class(): 12 | return {"body_class": "abvarfq"} 13 | 14 | from . import main 15 | assert main 16 | 17 | app.register_blueprint(abvarfq_page, url_prefix="/Variety/Abelian/Fq") 18 | -------------------------------------------------------------------------------- /lmfdb/abvar/fq/search_parsing.py: -------------------------------------------------------------------------------- 1 | from lmfdb.utils.search_parsing import ( 2 | search_parser, 3 | nf_string_to_label, 4 | _parse_subset, 5 | ) 6 | 7 | 8 | @search_parser # see SearchParser.__call__ for actual arguments when calling 9 | def parse_nf_string(inp, query, qfield): 10 | fields = [nf_string_to_label(field) for field in inp.split(",")] 11 | _parse_subset(fields, query, qfield, mode=None, radical=None, product=None, cardinality=None) 12 | 13 | 14 | @search_parser # (clean_info=True, default_field='galois_group', default_name='Galois group', default_qfield='galois') # see SearchParser.__call__ for actual arguments when calling 15 | def parse_galgrp(inp, query, qfield): 16 | from lmfdb.galois_groups.transitive_group import complete_group_codes 17 | try: 18 | gcs = complete_group_codes(inp) 19 | groups = [str(n) + "T" + str(t) for n, t in gcs] 20 | _parse_subset(groups, query, qfield, mode=None, radical=None, product=None, cardinality=None) 21 | except NameError: 22 | raise ValueError("It needs to be a group label, such as C5 or 5T1, or a comma separated list of such labels.") 23 | -------------------------------------------------------------------------------- /lmfdb/abvar/fq/templates/abvarfq-count-results.html: -------------------------------------------------------------------------------- 1 | {% extends 'abvarfq-refine-search.html' %} 2 | 3 | {% block show_results %} 4 | 5 | {% include 'count_results.html' %} 6 | 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /lmfdb/abvar/fq/templates/abvarfq-refine-search.html: -------------------------------------------------------------------------------- 1 | {% extends 'homepage.html' %} 2 | 3 | {% block content %} 4 | 5 | {% if info.stats %} 6 |
7 | {{info.stats|safe}} 8 |
9 | {% endif %} 10 | 11 | {% include 'refine_search_form.html' %} 12 | 13 | {% if info.search_type == 'DynStats' %} 14 |Note that the abelian varieties in the database may not be {{ KNOWL('rcs.rigor.av.fq', title='representative') }}.
15 | {% endif %} 16 | 17 | {% block show_results %}{% endblock %} 18 | {% include 'debug_info.html' %} 19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /lmfdb/api/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | api_page = Blueprint("API", __name__, template_folder='templates', static_folder="static") 7 | api_logger = make_logger(api_page) 8 | 9 | @api_page.context_processor 10 | def body_class(): 11 | return {'body_class': 'api'} 12 | 13 | from . import api 14 | assert api # silence pyflakes 15 | 16 | from .api import datapage 17 | assert datapage 18 | 19 | app.register_blueprint(api_page, url_prefix="/api") 20 | -------------------------------------------------------------------------------- /lmfdb/api/templates/apischema.html: -------------------------------------------------------------------------------- 1 | Show schema 2 | Hide schema 3 | 25 | -------------------------------------------------------------------------------- /lmfdb/api/templates/collection.html: -------------------------------------------------------------------------------- 1 | {% extends "homepage.html" %} 2 | 3 | {% block content %} 4 | 5 | 16 | 17 |{{ query_unquote }}
29 | {{ pretty(data[0]) }}
37 | {% else %}
38 | {{ pretty(entry,id=False) }}
43 | 7 | The LMFDB contains two types of underlying data: the main PostgreSQL database and a collection of auxiliary datasets. There are three options available for accessing large parts of the main database. 8 |
9 |host | 34 |devmirror.lmfdb.xyz | 35 |
---|---|
port | 38 |5432 | 39 |
dbname | 42 |lmfdb | 43 |
user | 46 |lmfdb | 47 |
password | 50 |lmfdb | 51 |
Showing records ??? of 0 returned by API for {{data_url}} 31 |
32 |5 |
Defining polynomial of the {{ KNOWL('artin.number_field', title='Artin number field') }} | Size | 11 | {#Abstract isomorphism type | #} 12 |Character values on conjugacy classes | 13 | 14 | 15 | 16 ||
${{ artin.index() }}$ | ${{artin.number_field_galois_group().polynomial().latex()}}$ | ${{artin.number_field_galois_group().size()}}$ | 18 | {#${{artin.number_field_galois_group().G_name()}}$ | #} 19 |${{artin.character().display()}}$ |
By {{ KNOWL('belyi.degree', title='degree')}}: | 13 |{% for rnge in info.degree_list %} {{rnge}} {% endfor %} | 14 |
Some interesting Belyi maps or a random Belyi map | 17 ||
Search for passports | 20 |
{{ KNOWL('belyi.pass_size', title="Passport size") }}: | ${{data.pass_size}}$ | |
{{ KNOWL('belyi.num_orbits', title="Number of Galois orbits") }}: | ${{data.num_orbits}}$ |
Label | Orbit size | Base field | Representative triple |
{{g[0]}} | 15 |${{g[2]}}$ | 16 |17 | {% if g[3]['in_LMFDB'] %} 18 | {{ g[3].base_field.knowl()|safe }} 19 | {% if not g[3]['isQQ'] %} 20 | ; {{ KNOWL('nf.generator', 'Generator') }} \(\nu\), with {{ KNOWL('nf.minimal_polynomial', 'minimal polynomial') }} 21 | {{ g[3].base_field.latex_poly }}. 22 | {% endif %} 23 | {% else %} 24 | \(\mathbb{Q}(\nu)\); {{ KNOWL('nf.generator', 'Generator') }} \(\nu\), with {{ KNOWL('nf.minimal_polynomial', 'minimal polynomial') }} ${{ g[3].base_field }}$. 25 | {% endif %} 26 | | 27 |${{g[4]}},{{g[5]}},{{g[6]}}$ | 28 |
10 | \(\displaystyle {{data.curve}}\) 11 | {% if data.g == 0 %} 12 | , with affine coordinate $x$ 13 | {% endif %} 14 |
15 | 16 |\(\displaystyle \phi(x) = {{data.map}}\)
19 | {% else %} 20 |\(\displaystyle \phi(x,y) = {{data.map}}\)
21 | {% endif %} 22 | 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /lmfdb/bianchi_modular_forms/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | bmf_page = Blueprint("bmf", __name__, template_folder='templates', static_folder="static") 7 | bmf_logger = make_logger(bmf_page) 8 | 9 | 10 | @bmf_page.context_processor 11 | def body_class(): 12 | return {'body_class': 'bmf'} 13 | 14 | from . import bianchi_modular_form 15 | assert bianchi_modular_form 16 | 17 | app.register_blueprint(bmf_page, url_prefix="/ModularForm/GL2/ImaginaryQuadratic") 18 | -------------------------------------------------------------------------------- /lmfdb/characters/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | characters_page = Blueprint("characters", __name__, template_folder='templates', 7 | static_folder="static") 8 | logger = make_logger(characters_page) 9 | 10 | 11 | @characters_page.context_processor 12 | def body_class(): 13 | return {'body_class': 'characters'} 14 | 15 | from . import main 16 | assert main # silence pyflakes 17 | 18 | app.register_blueprint(characters_page, url_prefix="/Character") 19 | -------------------------------------------------------------------------------- /lmfdb/characters/templates/CharFamily.html: -------------------------------------------------------------------------------- 1 | {% extends 'homepage.html' %} 2 | 3 | {% block description %} 4 | 5 | {# First character groups #} 6 | 7 |{{h}} | 13 | {% endfor %} 14 ||||
---|---|---|---|
20 | 22 | {{ mod }} 23 | 24 | | 25 |{{ord}} | 26 |{{struct}} | 27 | {% for mod,num,tex,prim in chars %} 28 |29 | 31 | {{ tex }} 32 | 33 | | 34 | {% endfor %} 35 |
{{h}} | {% endfor %} 12 | {% for v in groupelts %}\({{v}}\) | {% endfor %} 13 |
---|---|
19 | {% with mod,num,tex,prim = char %} 20 | 22 | {{ tex }} 23 | 24 | {% endwith %} 25 | | 26 | {% for value in values %}{{value}} | {% endfor %} 27 |
7 | A Hecke character is a (finite order) character on the ideals 8 | of a number field $K$. Such a character factors over the 9 | ray class group $Cl(m)$ of some modulus $m$. 10 |
11 | 12 |13 | Select a global number field. 14 |
15 | 16 |{{h}} | 22 | {% endfor %} 23 |||
---|---|---|
29 | {% with label,link = nf %} 30 | {{ label }} 31 | {% endwith %} 32 | | 33 |{{ signature }} | 34 |{{ polynomial | safe }} | 35 |
7 | {{info.stats|safe}} 8 |
9 | {% endif %} 10 | 11 | {% include 'refine_search_form.html' %} 12 | 13 | {% if info.search_type == 'DynStats' %} 14 | 15 | {% endif %} 16 | 17 | {% block show_results %}{% endblock %} 18 | {% include 'debug_info.html' %} 19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /lmfdb/classical_modular_forms/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | cmf_page = Blueprint("cmf", __name__, template_folder='templates', static_folder="static") 7 | cmf = cmf_page 8 | cmf_logger = make_logger(cmf_page) 9 | 10 | from . import main 11 | assert main # silence pyflakes 12 | 13 | app.register_blueprint(cmf_page, url_prefix="/ModularForm/GL2/Q/holomorphic") 14 | -------------------------------------------------------------------------------- /lmfdb/classical_modular_forms/code-space.yaml: -------------------------------------------------------------------------------- 1 | prompt: 2 | sage: 'sage' 3 | pari: 'gp' 4 | magma: 'magma' 5 | 6 | logo: 7 | sage:The dimensions shown below are for the space of cuspidal newforms in each weight and level satisfying the specified conditions.
6 | 7 | {% include 'cmf_dimension_table_display.html' %} 8 | 9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /lmfdb/classical_modular_forms/templates/cmf_refine_search.html: -------------------------------------------------------------------------------- 1 | {% extends 'homepage.html' %} 2 | 3 | {% block content %} 4 | 5 | {% include 'refine_search_form.html' %} 6 | 7 | {% if info.search_type == 'DynStats' %} 8 |See the {{ KNOWL('rcs.cande.cmf', title='completeness knowl') }} for a description of the set of newforms that are included in these statistics.
9 | {% endif %} 10 | 11 | {% block show_results %}{% endblock %} 12 | {% include 'debug_info.html' %} 13 | 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /lmfdb/classical_modular_forms/templates/cmf_space_trace_search_results.html: -------------------------------------------------------------------------------- 1 | {% extends 'homepage.html' %} 2 | 3 | {% block content %} 4 | 5 | {% include 'refine_search_form.html' %} 6 | 7 | {% include 'matches.html' %} 8 | {% if info.number %} 9 | 10 |The following table gives {{ KNOWL('cmf.space_trace_form', title='traces') }} of \(a_n\) for the search results.
11 | 12 | {% include 'cmf_trace_display.html' %} 13 | 14 | {% include 'forward_back.html' %} 15 | {% if info.download_spaces(info.results) %} 16 | {% include 'download_search_results.html' %} 17 | {% endif %} 18 | {% endif %} 19 | 20 | {% include 'debug_info.html' %} 21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /lmfdb/classical_modular_forms/templates/cmf_trace_display.html: -------------------------------------------------------------------------------- 1 | {%- from "knowl-defs.html" import KNOWL with context -%} 2 |{{ KNOWL('cmf.label', title='Label') }} | 6 |{{ KNOWL('cmf.dimension', title='Dim') }} | 7 | {% for n in info.Tr_n %} 8 | {% if n >= 1 and n <= 1000 %} 9 |\(a_{ {{n}} }\) | 10 | {% endif %} 11 | {% endfor %} 12 |
---|---|---|
{{ res.label }} | 18 |{{ res.dim }} | 19 | {% for n in info.Tr_n %} 20 | {% if n >= 1 and n <= 1000 %} 21 |{{ info.bigint_knowl(res.tr_an[n]) | safe}} | 22 | {% endif %} 23 | {% endfor %} 24 |
The following table gives {{ KNOWL('cmf.trace_form', title='traces') }} of \(a_n\) for the search results.
9 | 10 | {% include 'cmf_trace_display.html' %} 11 | 12 | {% include 'forward_back.html' %} 13 | {% if info.number <= 1000 %} 14 | {% include 'download_search_results.html' %} 15 | {% endif %} 16 | {% endif %} 17 | 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /lmfdb/cluster_pictures/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | # cp_logger = make_logger(cp_page) 4 | 5 | from . import cluster_picture 6 | assert cluster_picture 7 | -------------------------------------------------------------------------------- /lmfdb/cluster_pictures/cluster_picture.py: -------------------------------------------------------------------------------- 1 | 2 | from markupsafe import Markup 3 | 4 | from lmfdb.app import app 5 | from lmfdb.cluster_pictures.web_cluster_picture import ( 6 | cp_knowl_guts) 7 | 8 | # assert cp_logger 9 | 10 | CP_credit = 'Alex Best, Raymond van Bommel' 11 | Completename = 'Completeness of the data' 12 | dnc = 'data not computed' 13 | 14 | 15 | def cluster_picture_data(label): 16 | return Markup(cp_knowl_guts(label)) 17 | 18 | 19 | @app.context_processor 20 | def ctx_cluster_pictures(): 21 | return {'cluster_picture_data': cluster_picture_data} 22 | -------------------------------------------------------------------------------- /lmfdb/cluster_pictures/test_clusterpicture.py: -------------------------------------------------------------------------------- 1 | from lmfdb.tests import LmfdbTest 2 | 3 | 4 | class ClusterPictureTest(LmfdbTest): 5 | # All tests should pass 6 | def test_clusters(self): 7 | self.check_args('/Genus2Curve/Q/762001/a/762001/1', r'c4c2_1~2_0') 8 | self.check_args('/knowledge/show/clusterpicture.data?label=c4c2_1~2_0', r'Potential toric rank') 9 | self.check_args('/knowledge/show/clusterpicture.data?label=c4c2_1~2_0', r'6') 10 | -------------------------------------------------------------------------------- /lmfdb/crystals/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | crystals_page = Blueprint("crystals", __name__, template_folder='templates', static_folder="static") 7 | logger = make_logger(crystals_page) 8 | 9 | 10 | @crystals_page.context_processor 11 | def body_class(): 12 | return {'body_class': 'Crystals'} 13 | 14 | from . import main 15 | assert main # silence pyflakes 16 | 17 | app.register_blueprint(crystals_page, url_prefix="/Crystals") 18 | -------------------------------------------------------------------------------- /lmfdb/ecnf/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.app import app 3 | from lmfdb.logger import make_logger 4 | from flask import Blueprint 5 | 6 | ecnf_page = Blueprint("ecnf", __name__, template_folder='templates', static_folder="static") 7 | logger = make_logger(ecnf_page) 8 | 9 | 10 | @ecnf_page.context_processor 11 | def body_class(): 12 | return {'body_class': 'ecnf'} 13 | 14 | from . import main 15 | assert main # to keep pyflakes quiet 16 | 17 | app.register_blueprint(ecnf_page, url_prefix="/EllipticCurve") 18 | 19 | # API2 has been disabled for now 20 | #from lmfdb.api2.searchers import register_singleton, register_search_function 21 | #from . import searchers 22 | #register_search_function( 23 | # "elliptic_curves_nf", 24 | # "Elliptic curves over number fields", 25 | # "Search over elliptic curves defined over number fields", 26 | # auto_search='ec_nfcurves' 27 | #) 28 | #register_singleton('EllipticCurve', 'ec_nfcurves', 29 | # simple_search = searchers.ecnf_simple_label_search) 30 | -------------------------------------------------------------------------------- /lmfdb/ecnf/ecnf_test_pages.py: -------------------------------------------------------------------------------- 1 | 2 | from lmfdb.tests import LmfdbTest 3 | from lmfdb import db 4 | 5 | 6 | class ECNFTest(LmfdbTest): 7 | 8 | def runTest(self): 9 | pass 10 | 11 | def test_d6_pages(self): 12 | # check the page of every elliptic curve over a degree 6 field 13 | errors = [] 14 | n = db.ec_nfcurves.count({'degree':6}) 15 | print("Checking %d elliptic curves over number fields of degree 6" % (n)) 16 | for e in db.ec_nfcurves.search({'degree':6}): 17 | url = "EllipticCurve/%s/%d" % ("/".join(e['class_label'].split("-")),e['number']) 18 | print("Checking " + url) 19 | page = self.tc.get(url, follow_redirects=True) 20 | if e['label'] not in page.get_data(as_text=True) or 'Weierstrass equation' not in page.get_data(as_text=True): 21 | print('Failed on', url) 22 | errors.append(url) 23 | if errors: 24 | print("Errors occurred for the following URLs: ", errors) 25 | assert not errors 26 | -------------------------------------------------------------------------------- /lmfdb/ecnf/searchers.py: -------------------------------------------------------------------------------- 1 | from urllib.parse import unquote 2 | 3 | from lmfdb.utils import nf_string_to_label 4 | 5 | 6 | def ecnf_simple_label_search(search, baseurl, label): 7 | 8 | label_bits = label.split('/') 9 | try: 10 | nf = label_bits[0] 11 | conductor_label = label_bits[1] 12 | class_label = label_bits[2] 13 | number = label_bits[3] 14 | except IndexError: 15 | search['query'] = {'label': 'dummy'} 16 | return 17 | 18 | conductor_label = unquote(conductor_label) 19 | try: 20 | nf_label = nf_string_to_label(nf) 21 | except ValueError: 22 | search['query'] = {'label': 'dummy'} 23 | return 24 | 25 | label = "".join(["-".join(nf_label, conductor_label, class_label), number]) 26 | 27 | search['query'] = {'label': label} 28 | -------------------------------------------------------------------------------- /lmfdb/ecnf/templates/ecnf-by-degree.html: -------------------------------------------------------------------------------- 1 | {% extends 'homepage.html' %} 2 | {% block content %} 3 | 4 | {% if info.error %} 5 | 6 |7 | {{ info.error }} 8 |
9 | 10 | {% else %} 11 | 12 |Field | Number of curves | Number of isogeny classes | Maximum conductor norm |
---|---|---|---|
{{f}} | {{f_counts.ncurves}} | {{f_counts.nclasses}} | {{f_counts.max_norm}} |