def siegel_series_dim2(q, p): det_4 = q.Gram_det() * ZZ(4) c = q.content_order() fd = fundamental_discriminant(-det_4) f = (valuation(det_4, p) - valuation(fd, p)) / ZZ(2) return (_siegel_series_dim2(p, c, f + 1) - kronecker_symbol(fd, p) * p * X * _siegel_series_dim2(p, c, f))
def test_jordan_decomposition_odd_p(self): for _ in range(100): S = random_even_symm_mat(5) for p in [3, 5, 7]: self.assertEqual( kronecker_symbol( mul(_jordan_decomposition_odd_p(S, p)) / S.det(), p), 1)
def _chi_p_odd(a, p): p = ZZ(p) r = valuation(a, p) if r % 2 == 0: c = a // (p ** r) return kronecker_symbol(c, p) else: return 0
def IsSquareInQp(x, p): if x == 0: return true # Check parity of valuation v = valuation(x, p) if v % 2: return false # Renormalise to get a unit x //= p**v # Reduce mod p and conclude if p == 2: return Mod(x, 8) == 1 else: return kronecker_symbol(x, p) == 1
def assert_jordan_blcs(self, p, mat): p = ZZ(p) if p == 2: blcs = jordan_blocks_2(mat) else: blcs = jordan_blocks_odd(mat, p) q = QuadraticForm(ZZ, ZZ(2) * mat) q1 = _blocks_to_quad_form(blcs.blocks, p) if p == 2: self.assertTrue((q.det() / q1.det()) % 8 == 1) else: self.assertTrue(kronecker_symbol(q.det() / q1.det(), p) == 1) self.assertEqual( q.hasse_invariant__OMeara(p), q1.hasse_invariant__OMeara(p))
def IsSquareInQp(x,p): if x==0: return true # Check parity of valuation v=valuation(x,p) if v%2: return false # Renormalise to get a unit x//=p**v # Reduce mod p and conclude if p==2: return Mod(x,8)==1 else: return kronecker_symbol(x,p)==1
def assert_jordan_blocks_method(self, p, mat): p = ZZ(p) if p == 2: blcs = jordan_blocks_2(mat) else: blcs = jordan_blocks_odd(mat, p) q = QuadraticForm(ZZ, 2 * mat) if p == 2: should1 = (q.Gram_det() / blcs.Gram_det()) % 8 else: should1 = kronecker_symbol((q.Gram_det() / blcs.Gram_det()), p) self.assertEqual(should1, 1) self.assertEqual( q.hasse_invariant__OMeara(p), blcs.hasse_invariant__OMeara()) self.assertEqual(q.dim(), blcs.dim()) self.assertEqual(q.content().valuation(p), blcs.content_order())
def check_inert_primes(self, rec, verbose=False): """ for each discriminant D in self_twist_discs, check that for each prime p not dividing the level for which (D/p) = -1, check that traces[p] = 0 (we could also check values in mf_hecke_nf and/or mf_hecke_cc, but this would be far more costly) """ # TIME about 3600s for full table N = rec['level'] traces = [0] + rec['traces'] # shift so indexing correct primes = [p for p in prime_range(len(traces)) if N % p != 0] for D in rec['self_twist_discs']: for p in primes: if kronecker_symbol(D, p) == -1 and traces[p] != 0: if verbose: print("CM failure", D, p, traces[p]) return False return True
def check_inert_primes(self, rec, verbose=False): """ for each discriminant D in self_twist_discs, check that for each prime p not dividing the level for which (D/p) = -1, check that traces[p] = 0 (we could also check values in mf_hecke_nf and/or mf_hecke_cc, but this would be far more costly) """ # TIME about 3600s for full table N = rec['level'] traces = [0] + rec['traces'] # shift so indexing correct primes = [p for p in prime_range(len(traces)) if N % p != 0] for D in rec['self_twist_discs']: for p in primes: if kronecker_symbol(D, p) == -1 and traces[p] != 0: if verbose: print "CM failure", D, p, traces[p] return False return True