From 4fff837f4bc38dfe73fac703149b9d7f4e23c753 Mon Sep 17 00:00:00 2001 From: hgu2699 <160513517+hgu2699@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:58:17 -0500 Subject: [PATCH 1/5] Update code.yaml GP: nfsubfields slice fixed (L[2..length(L)], not length(b)). Oscar: Avoid non-portable API: Replaced uppercase PolynomialRing/NumberField with lowercase polynomial_ring/number_field. automorphisms(K) now uses a fallback: isdefined(Main,:automorphisms) ? automorphisms(K) : Hecke.hom(K,K). Guarded transitive_group_identification(G) with degree(K) > 1. Fixed root discriminant to compute from discriminant(ring_of_integers(K)) (no stray dK). Class number formula block uses the lowercase API consistently. --- lmfdb/number_fields/code.yaml | 50 ++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/lmfdb/number_fields/code.yaml b/lmfdb/number_fields/code.yaml index 739461e07c..0a6ecd0dcf 100644 --- a/lmfdb/number_fields/code.yaml +++ b/lmfdb/number_fields/code.yaml @@ -5,8 +5,8 @@ prompt: oscar: 'oscar' logo: - sage: - pari: + sage: + pari: magma: oscar: @@ -25,17 +25,17 @@ frontmatter: all: | {lang} code for working with number field {label}. oscar: | - If you have not already loaded the Oscar package, you should type "using Oscar;" before running the code below. + If you have not already loaded the Oscar package, you should type "using Oscar" before running the code below. rest: | Some of these functions may take a long time to execute (this depends on the field). field: comment: Define the number field - sage: x = polygen(QQ); K. = NumberField(%s) - pari: K = bnfinit(%s, 1) + sage: x = polygen(QQ); K. = NumberField(%s) + pari: K = bnfinit(%s, 1) magma: R := PolynomialRing(Rationals()); K := NumberField(%s); oscar: Qx, x = polynomial_ring(QQ); K, a = number_field(%s) - + poly: comment: Defining polynomial sage: K.defining_polynomial() @@ -65,23 +65,29 @@ discriminant: oscar: OK = ring_of_integers(K); discriminant(OK) rd: + comment: Root discriminant sage: (K.disc().abs())^(1./K.degree()) pari: abs(K.disc)^(1/poldegree(K.pol)) magma: Abs(Discriminant(OK))^(1/Degree(K)); - oscar: (1.0 * dK)^(1/degree(K)) + oscar: | + OK = ring_of_integers(K); + (1.0 * abs(discriminant(OK)))^(1/degree(K)) automorphisms: - comment: Autmorphisms + comment: Automorphisms sage: K.automorphisms() magma: Automorphisms(K); - oscar: automorphisms(K) + oscar: | + # Older Oscar builds don't export `automorphisms`. + # Fall back to the hom-set K → K so the snippet stays evaluable. + isdefined(Main, :automorphisms) ? automorphisms(K) : Hecke.hom(K, K) ramified_primes: comment: Ramified primes sage: K.disc().support() pari: factor(abs(K.disc))[,1]~ magma: PrimeDivisors(Discriminant(OK)); - oscar: prime_divisors(discriminant((OK))) + oscar: prime_divisors(discriminant(OK)) integral_basis: comment: Integral basis @@ -94,7 +100,7 @@ class_group: comment: Class group sage: K.class_group().invariants() pari: K.clgp - magma: ClassGroup(K); + magma: ClassGroup(K); oscar: class_group(K) narrow_class_group: @@ -146,7 +152,7 @@ class_number_formula: x = polygen(QQ); K. = NumberField(%s) DK = K.disc(); r1,r2 = K.signature(); RK = K.regulator(); RR = RK.parent() hK = K.class_number(); wK = K.unit_group().torsion_generator().order(); - 2^r1 * (2*RR(pi))^r2 * RK * hK / (wK * RR(sqrt(abs(DK)))) + 2^r1 * (2*RR(pi))^r2 * RK * hK / (wK * RR(sqrt(abs(DK)))) pari: | \\ self-contained Pari/GP code snippet to compute the analytic class number formula K = bnfinit(%s, 1); @@ -161,7 +167,7 @@ class_number_formula: 2^r1 * (2*Pi(RR))^r2 * RK * hK / (wK * Sqrt(RR!Abs(DK))); oscar: | # self-contained Oscar code snippet to compute the analytic class number formula - Qx, x = PolynomialRing(QQ); K, a = NumberField(%s); + Qx, x = polynomial_ring(QQ); K, a = number_field(%s); OK = ring_of_integers(K); DK = discriminant(OK); UK, fUK = unit_group(OK); clK, fclK = class_group(OK); r1,r2 = signature(K); RK = regulator(K); RR = parent(RK); @@ -173,12 +179,14 @@ galois_group: sage: K.galois_group(type='pari') pari: polgalois(K.pol) magma: G = GaloisGroup(K); - oscar: G, Gtx = galois_group(K); G, transitive_group_identification(G) + oscar: | + G, Gtx = galois_group(K); + degree(K) > 1 ? (G, transitive_group_identification(G)) : (G, nothing) intermediate_fields: comment: Intermediate fields - sage: K.subfields()[1:-1] - pari: L = nfsubfields(K); L[2..length(b)] + sage: K.subfields()[1:-1] + pari: L = nfsubfields(K); L[2..length(L)] magma: L := Subfields(K); L[2..#L]; oscar: subfields(K)[2:end-1] @@ -195,12 +203,11 @@ prime_cycle_types: p := 7; [ : pr in Factorization(p*Integers(K))]; oscar: | # to obtain a list of [e_i,f_i] for the factorization of the ideal pO_K for p=7 in Oscar: - p = 7; pfac = factor(ideal(ring_of_integers(K), p)); [(e, valuation(norm(pr),p)) for (pr,e) in pfac] - + p = 7; pfac = factor(ideal(ring_of_integers(K), p)); [(e, valuation(norm(pr), p)) for (pr, e) in pfac] # specify which code snippets to test -snippet_test: - testQ: +snippet_test: + testQ: label: 1.1.1.1 langs: - sage @@ -208,7 +215,7 @@ snippet_test: - oscar - gp url: NumberField/1.1.1.1/download/{lang} - testQi: + testQi: label: 2.0.4.1 langs: - sage @@ -216,3 +223,4 @@ snippet_test: - oscar - gp url: NumberField/2.0.4.1/download/{lang} + From 377be4a2f5fff57367b6ecdc7701436d1920b637 Mon Sep 17 00:00:00 2001 From: hgu2699 <160513517+hgu2699@users.noreply.github.com> Date: Fri, 7 Nov 2025 19:56:32 -0500 Subject: [PATCH 2/5] Solve imfdb number_fields/code.yaml solve whitespace issue --- lmfdb/number_fields/code.yaml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lmfdb/number_fields/code.yaml b/lmfdb/number_fields/code.yaml index 0a6ecd0dcf..4d4c540625 100644 --- a/lmfdb/number_fields/code.yaml +++ b/lmfdb/number_fields/code.yaml @@ -5,8 +5,8 @@ prompt: oscar: 'oscar' logo: - sage: - pari: + sage: + pari: magma: oscar: @@ -14,7 +14,7 @@ not-implemented: sage: | # (not yet implemented) pari: | - \\ (not yet implemented) + \ (not yet implemented) magma: | // (not yet implemented) oscar: | @@ -25,14 +25,14 @@ frontmatter: all: | {lang} code for working with number field {label}. oscar: | - If you have not already loaded the Oscar package, you should type "using Oscar" before running the code below. + If you have not already loaded the Oscar package, you should type "using Oscar;" before running the code below. rest: | Some of these functions may take a long time to execute (this depends on the field). field: comment: Define the number field - sage: x = polygen(QQ); K. = NumberField(%s) - pari: K = bnfinit(%s, 1) + sage: x = polygen(QQ); K. = NumberField(%s) + pari: K = bnfinit(%s, 1) magma: R := PolynomialRing(Rationals()); K := NumberField(%s); oscar: Qx, x = polynomial_ring(QQ); K, a = number_field(%s) @@ -78,7 +78,7 @@ automorphisms: sage: K.automorphisms() magma: Automorphisms(K); oscar: | - # Older Oscar builds don't export `automorphisms`. + # Older Oscar builds may not export `automorphisms`. # Fall back to the hom-set K → K so the snippet stays evaluable. isdefined(Main, :automorphisms) ? automorphisms(K) : Hecke.hom(K, K) @@ -185,8 +185,8 @@ galois_group: intermediate_fields: comment: Intermediate fields - sage: K.subfields()[1:-1] - pari: L = nfsubfields(K); L[2..length(L)] + sage: K.subfields()[1:-1] + pari: L = nfsubfields(K); L[2..length(L)] magma: L := Subfields(K); L[2..#L]; oscar: subfields(K)[2:end-1] @@ -224,3 +224,4 @@ snippet_test: - gp url: NumberField/2.0.4.1/download/{lang} + From 5d4390e5b9d0688e497d5b91d2c19795fb8c4662 Mon Sep 17 00:00:00 2001 From: hgu2699 <160513517+hgu2699@users.noreply.github.com> Date: Fri, 7 Nov 2025 20:11:15 -0500 Subject: [PATCH 3/5] Solve imfdb number_fields/code.yaml whitespace issue --- lmfdb/number_fields/code.yaml | 73 +++++++++++++++++------------------ 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/lmfdb/number_fields/code.yaml b/lmfdb/number_fields/code.yaml index 4d4c540625..0c86360425 100644 --- a/lmfdb/number_fields/code.yaml +++ b/lmfdb/number_fields/code.yaml @@ -1,20 +1,20 @@ prompt: - sage: 'sage' - pari: 'gp' - magma: 'magma' - oscar: 'oscar' + sage: 'sage' + pari: 'gp' + magma: 'magma' + oscar: 'oscar' logo: - sage: - pari: - magma: - oscar: + sage: + pari: + magma: + oscar: not-implemented: sage: | # (not yet implemented) pari: | - \ (not yet implemented) + \\ (not yet implemented) magma: | // (not yet implemented) oscar: | @@ -38,29 +38,29 @@ field: poly: comment: Defining polynomial - sage: K.defining_polynomial() - pari: K.pol + sage: K.defining_polynomial() + pari: K.pol magma: DefiningPolynomial(K); oscar: defining_polynomial(K) degree: comment: Degree over Q - sage: K.degree() - pari: poldegree(K.pol) + sage: K.degree() + pari: poldegree(K.pol) magma: Degree(K); oscar: degree(K) signature: comment: Signature - sage: K.signature() - pari: K.sign + sage: K.signature() + pari: K.sign magma: Signature(K); oscar: signature(K) discriminant: comment: Discriminant - sage: K.disc() - pari: K.disc + sage: K.disc() + pari: K.disc magma: OK := Integers(K); Discriminant(OK); oscar: OK = ring_of_integers(K); discriminant(OK) @@ -84,55 +84,55 @@ automorphisms: ramified_primes: comment: Ramified primes - sage: K.disc().support() - pari: factor(abs(K.disc))[,1]~ + sage: K.disc().support() + pari: factor(abs(K.disc))[,1]~ magma: PrimeDivisors(Discriminant(OK)); oscar: prime_divisors(discriminant(OK)) integral_basis: comment: Integral basis - sage: K.integral_basis() - pari: K.zk + sage: K.integral_basis() + pari: K.zk magma: IntegralBasis(K); oscar: basis(OK) class_group: comment: Class group - sage: K.class_group().invariants() - pari: K.clgp + sage: K.class_group().invariants() + pari: K.clgp magma: ClassGroup(K); oscar: class_group(K) narrow_class_group: comment: Narrow class group - sage: K.narrow_class_group().invariants() - pari: bnfnarrow(K) + sage: K.narrow_class_group().invariants() + pari: bnfnarrow(K) magma: NarrowClassGroup(K); unit_group: comment: Unit group - sage: UK = K.unit_group() + sage: UK = K.unit_group() magma: UK, fUK := UnitGroup(K); oscar: UK, fUK = unit_group(OK) unit_rank: comment: Unit rank - sage: UK.rank() - pari: K.fu + sage: UK.rank() + pari: K.fu magma: UnitRank(K); oscar: rank(UK) unit_torsion_gen: comment: Generator for roots of unity - sage: UK.torsion_generator() - pari: K.tu[2] + sage: UK.torsion_generator() + pari: K.tu[2] magma: K!f(TU.1) where TU,f is TorsionUnitGroup(K); oscar: torsion_units_generator(OK) fundamental_units: comment: Fundamental units - sage: UK.fundamental_units() - pari: K.fu + sage: UK.fundamental_units() + pari: K.fu magma: | [K|fUK(g): g in Generators(UK)]; oscar: | @@ -140,8 +140,8 @@ fundamental_units: regulator: comment: Regulator - sage: K.regulator() - pari: K.reg + sage: K.regulator() + pari: K.reg magma: Regulator(K); oscar: regulator(K) @@ -176,8 +176,8 @@ class_number_formula: galois_group: comment: Galois group - sage: K.galois_group(type='pari') - pari: polgalois(K.pol) + sage: K.galois_group(type='pari') + pari: polgalois(K.pol) magma: G = GaloisGroup(K); oscar: | G, Gtx = galois_group(K); @@ -224,4 +224,3 @@ snippet_test: - gp url: NumberField/2.0.4.1/download/{lang} - From bd890072b15c13ca15a163e168c3c2583aff49dc Mon Sep 17 00:00:00 2001 From: hgu2699 <160513517+hgu2699@users.noreply.github.com> Date: Fri, 7 Nov 2025 20:16:02 -0500 Subject: [PATCH 4/5] Solve imfdb number_fields/code.yaml whitespace issue --- lmfdb/number_fields/code.yaml | 108 ++++++++++++++++------------------ 1 file changed, 51 insertions(+), 57 deletions(-) diff --git a/lmfdb/number_fields/code.yaml b/lmfdb/number_fields/code.yaml index 0c86360425..3341fff521 100644 --- a/lmfdb/number_fields/code.yaml +++ b/lmfdb/number_fields/code.yaml @@ -1,14 +1,14 @@ prompt: - sage: 'sage' - pari: 'gp' - magma: 'magma' - oscar: 'oscar' + sage: 'sage' + pari: 'gp' + magma: 'magma' + oscar: 'oscar' logo: - sage: - pari: - magma: - oscar: + sage: + pari: + magma: + oscar: not-implemented: sage: | @@ -35,104 +35,98 @@ field: pari: K = bnfinit(%s, 1) magma: R := PolynomialRing(Rationals()); K := NumberField(%s); oscar: Qx, x = polynomial_ring(QQ); K, a = number_field(%s) - + poly: comment: Defining polynomial - sage: K.defining_polynomial() - pari: K.pol + sage: K.defining_polynomial() + pari: K.pol magma: DefiningPolynomial(K); oscar: defining_polynomial(K) degree: comment: Degree over Q - sage: K.degree() - pari: poldegree(K.pol) + sage: K.degree() + pari: poldegree(K.pol) magma: Degree(K); oscar: degree(K) signature: comment: Signature - sage: K.signature() - pari: K.sign + sage: K.signature() + pari: K.sign magma: Signature(K); oscar: signature(K) discriminant: comment: Discriminant - sage: K.disc() - pari: K.disc + sage: K.disc() + pari: K.disc magma: OK := Integers(K); Discriminant(OK); oscar: OK = ring_of_integers(K); discriminant(OK) rd: - comment: Root discriminant sage: (K.disc().abs())^(1./K.degree()) pari: abs(K.disc)^(1/poldegree(K.pol)) magma: Abs(Discriminant(OK))^(1/Degree(K)); - oscar: | - OK = ring_of_integers(K); - (1.0 * abs(discriminant(OK)))^(1/degree(K)) + oscar: (1.0 * dK)^(1/degree(K)) automorphisms: - comment: Automorphisms + comment: Autmorphisms sage: K.automorphisms() magma: Automorphisms(K); - oscar: | - # Older Oscar builds may not export `automorphisms`. - # Fall back to the hom-set K → K so the snippet stays evaluable. - isdefined(Main, :automorphisms) ? automorphisms(K) : Hecke.hom(K, K) + oscar: automorphisms(K) ramified_primes: comment: Ramified primes - sage: K.disc().support() - pari: factor(abs(K.disc))[,1]~ + sage: K.disc().support() + pari: factor(abs(K.disc))[,1]~ magma: PrimeDivisors(Discriminant(OK)); - oscar: prime_divisors(discriminant(OK)) + oscar: prime_divisors(discriminant((OK))) integral_basis: comment: Integral basis - sage: K.integral_basis() - pari: K.zk + sage: K.integral_basis() + pari: K.zk magma: IntegralBasis(K); oscar: basis(OK) class_group: comment: Class group - sage: K.class_group().invariants() - pari: K.clgp - magma: ClassGroup(K); + sage: K.class_group().invariants() + pari: K.clgp + magma: ClassGroup(K); oscar: class_group(K) narrow_class_group: comment: Narrow class group - sage: K.narrow_class_group().invariants() - pari: bnfnarrow(K) + sage: K.narrow_class_group().invariants() + pari: bnfnarrow(K) magma: NarrowClassGroup(K); unit_group: comment: Unit group - sage: UK = K.unit_group() + sage: UK = K.unit_group() magma: UK, fUK := UnitGroup(K); oscar: UK, fUK = unit_group(OK) unit_rank: comment: Unit rank - sage: UK.rank() - pari: K.fu + sage: UK.rank() + pari: K.fu magma: UnitRank(K); oscar: rank(UK) unit_torsion_gen: comment: Generator for roots of unity - sage: UK.torsion_generator() - pari: K.tu[2] + sage: UK.torsion_generator() + pari: K.tu[2] magma: K!f(TU.1) where TU,f is TorsionUnitGroup(K); oscar: torsion_units_generator(OK) fundamental_units: comment: Fundamental units - sage: UK.fundamental_units() - pari: K.fu + sage: UK.fundamental_units() + pari: K.fu magma: | [K|fUK(g): g in Generators(UK)]; oscar: | @@ -140,8 +134,8 @@ fundamental_units: regulator: comment: Regulator - sage: K.regulator() - pari: K.reg + sage: K.regulator() + pari: K.reg magma: Regulator(K); oscar: regulator(K) @@ -152,7 +146,7 @@ class_number_formula: x = polygen(QQ); K. = NumberField(%s) DK = K.disc(); r1,r2 = K.signature(); RK = K.regulator(); RR = RK.parent() hK = K.class_number(); wK = K.unit_group().torsion_generator().order(); - 2^r1 * (2*RR(pi))^r2 * RK * hK / (wK * RR(sqrt(abs(DK)))) + 2^r1 * (2*RR(pi))^r2 * RK * hK / (wK * RR(sqrt(abs(DK)))) pari: | \\ self-contained Pari/GP code snippet to compute the analytic class number formula K = bnfinit(%s, 1); @@ -167,7 +161,7 @@ class_number_formula: 2^r1 * (2*Pi(RR))^r2 * RK * hK / (wK * Sqrt(RR!Abs(DK))); oscar: | # self-contained Oscar code snippet to compute the analytic class number formula - Qx, x = polynomial_ring(QQ); K, a = number_field(%s); + Qx, x = PolynomialRing(QQ); K, a = NumberField(%s); OK = ring_of_integers(K); DK = discriminant(OK); UK, fUK = unit_group(OK); clK, fclK = class_group(OK); r1,r2 = signature(K); RK = regulator(K); RR = parent(RK); @@ -176,17 +170,15 @@ class_number_formula: galois_group: comment: Galois group - sage: K.galois_group(type='pari') - pari: polgalois(K.pol) + sage: K.galois_group(type='pari') + pari: polgalois(K.pol) magma: G = GaloisGroup(K); - oscar: | - G, Gtx = galois_group(K); - degree(K) > 1 ? (G, transitive_group_identification(G)) : (G, nothing) + oscar: G, Gtx = galois_group(K); G, transitive_group_identification(G) intermediate_fields: comment: Intermediate fields sage: K.subfields()[1:-1] - pari: L = nfsubfields(K); L[2..length(L)] + pari: L = nfsubfields(K); L[2..length(b)] magma: L := Subfields(K); L[2..#L]; oscar: subfields(K)[2:end-1] @@ -203,11 +195,12 @@ prime_cycle_types: p := 7; [ : pr in Factorization(p*Integers(K))]; oscar: | # to obtain a list of [e_i,f_i] for the factorization of the ideal pO_K for p=7 in Oscar: - p = 7; pfac = factor(ideal(ring_of_integers(K), p)); [(e, valuation(norm(pr), p)) for (pr, e) in pfac] + p = 7; pfac = factor(ideal(ring_of_integers(K), p)); [(e, valuation(norm(pr),p)) for (pr,e) in pfac] + # specify which code snippets to test -snippet_test: - testQ: +snippet_test: + testQ: label: 1.1.1.1 langs: - sage @@ -215,7 +208,7 @@ snippet_test: - oscar - gp url: NumberField/1.1.1.1/download/{lang} - testQi: + testQi: label: 2.0.4.1 langs: - sage @@ -224,3 +217,4 @@ snippet_test: - gp url: NumberField/2.0.4.1/download/{lang} + From 974311312ec0b3206a32e2f356f618187da7f7b6 Mon Sep 17 00:00:00 2001 From: hgu2699 <160513517+hgu2699@users.noreply.github.com> Date: Fri, 7 Nov 2025 20:32:29 -0500 Subject: [PATCH 5/5] Solve imfdb number_fields/code.yaml whitespace issue finally --- lmfdb/number_fields/code.yaml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lmfdb/number_fields/code.yaml b/lmfdb/number_fields/code.yaml index 3341fff521..b1c6dd243c 100644 --- a/lmfdb/number_fields/code.yaml +++ b/lmfdb/number_fields/code.yaml @@ -65,10 +65,13 @@ discriminant: oscar: OK = ring_of_integers(K); discriminant(OK) rd: + comment: Root discriminant sage: (K.disc().abs())^(1./K.degree()) pari: abs(K.disc)^(1/poldegree(K.pol)) magma: Abs(Discriminant(OK))^(1/Degree(K)); - oscar: (1.0 * dK)^(1/degree(K)) + oscar: | + OK = ring_of_integers(K); + (1.0 * abs(discriminant(OK)))^(1/degree(K)) automorphisms: comment: Autmorphisms @@ -81,7 +84,7 @@ ramified_primes: sage: K.disc().support() pari: factor(abs(K.disc))[,1]~ magma: PrimeDivisors(Discriminant(OK)); - oscar: prime_divisors(discriminant((OK))) + oscar: prime_divisors(discriminant(OK)) integral_basis: comment: Integral basis @@ -161,7 +164,7 @@ class_number_formula: 2^r1 * (2*Pi(RR))^r2 * RK * hK / (wK * Sqrt(RR!Abs(DK))); oscar: | # self-contained Oscar code snippet to compute the analytic class number formula - Qx, x = PolynomialRing(QQ); K, a = NumberField(%s); + Qx, x = polynomial_ring(QQ); K, a = number_field(%s); OK = ring_of_integers(K); DK = discriminant(OK); UK, fUK = unit_group(OK); clK, fclK = class_group(OK); r1,r2 = signature(K); RK = regulator(K); RR = parent(RK); @@ -173,12 +176,15 @@ galois_group: sage: K.galois_group(type='pari') pari: polgalois(K.pol) magma: G = GaloisGroup(K); - oscar: G, Gtx = galois_group(K); G, transitive_group_identification(G) + oscar: | + G, Gtx = galois_group(K); + degree(K) > 1 ? (G, transitive_group_identification(G)) : (G, nothing) + intermediate_fields: comment: Intermediate fields sage: K.subfields()[1:-1] - pari: L = nfsubfields(K); L[2..length(b)] + pari: L = nfsubfields(K); L[2..length(L)] magma: L := Subfields(K); L[2..#L]; oscar: subfields(K)[2:end-1]