def iter_indefinite_forms(self) : fm = Integer(4 * self.__m) if self.__reduced : if self.__weak_forms : msq = self.__m**2 for n in xrange(0, min(self.__m // 4 + 1, self.__bound)) : for r in xrange( isqrt(fm * n - 1) + 1 if n != 0 else 0, isqrt(fm * n + msq + 1) ) : yield (n, r) else : for r in xrange(0, min(self.__m + 1, isqrt((self.__bound - 1) * fm) + 1) ) : if fm.divides(r**2) : yield (r**2 // fm, r) else : if self.__weak_forms : msq = self.__m**2 for n in xrange(0, self.__bound) : for r in xrange( isqrt(fm * n - 1) + 1 if n != 0 else 0, isqrt(fm * n + msq + 1) ) : yield (n, r) else : for n in xrange(0, self.__bound) : if (fm * n).is_square() : yield(n, isqrt(fm * n)) raise StopIteration
def iter_indefinite_forms(self) : fm = Integer(4 * self.__m) if self.__reduced : if self.__weak_forms : msq = self.__m**2 for n in range(0, min(self.__m // 4 + 1, self.__bound)) : for r in range( isqrt(fm * n - 1) + 1 if n != 0 else 0, isqrt(fm * n + msq + 1) ) : yield (n, r) else : for r in range(0, min(self.__m + 1, isqrt((self.__bound - 1) * fm) + 1) ) : if fm.divides(r**2) : yield (r**2 // fm, r) else : if self.__weak_forms : msq = self.__m**2 for n in range(0, self.__bound) : for r in range( isqrt(fm * n - 1) + 1 if n != 0 else 0, isqrt(fm * n + msq + 1) ) : yield (n, r) else : for n in range(0, self.__bound) : if (fm * n).is_square() : yield(n, isqrt(fm * n)) raise StopIteration
def iter_indefinite_forms(self) : r""" Iterate over indices with non-positive discriminant. TESTS:: sage: from psage.modform.jacobiforms.jacobiformd1nn_fourierexpansion import * sage: list(JacobiFormD1NNFilter(2, 2, reduced = False, weak_forms = True).iter_indefinite_forms()) [(0, -1), (1, 3), (0, 0), (1, -3), (0, 1), (0, -2), (0, 2)] sage: list(JacobiFormD1NNFilter(3, 2, reduced = False, weak_forms = True).iter_indefinite_forms()) [(0, -1), (1, 3), (2, -4), (0, 0), (2, 4), (1, -3), (0, 1), (0, -2), (0, 2)] sage: list(JacobiFormD1NNFilter(10, 2, reduced = True, weak_forms = True).iter_indefinite_forms()) [(0, 0), (0, 1), (0, 2)] sage: list(JacobiFormD1NNFilter(10, 3, reduced = True, weak_forms = True).iter_indefinite_forms()) [(0, 0), (0, 1), (0, 2), (0, 3)] sage: list(JacobiFormD1NNFilter(10, 10, reduced = True, weak_forms = True).iter_indefinite_forms()) [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (1, 7), (1, 8), (1, 9), (1, 10), (2, 9), (2, 10)] """ B = self.__bound m = self.__m fm = Integer(4 * self.__m) if self.__reduced : if self.__weak_forms : for n in xrange(0, min(self.__m // 4 + 1, self.__bound)) : for r in xrange( isqrt(fm * n - 1) + 1 if n != 0 else 0, self.__m + 1 ) : yield (n, r) else : for r in xrange(0, min(self.__m + 1, isqrt((self.__bound - 1) * fm) + 1) ) : if fm.divides(r**2) : yield (r**2 // fm, r) else : if self.__weak_forms : ## We first determine the reduced indices. for n in xrange(0, min(m // 4 + 1, B)) : if n == 0 : r_iteration = range(-m + 1, m + 1) else : r_iteration = range( -m + 1, -isqrt(fm * n - 1) ) \ + range( isqrt(fm * n - 1) + 1, m + 1 ) for r in r_iteration : for l in range( (- r - isqrt(r**2 - 4 * m * (n - (B - 1))) - 1) // (2 * m) + 1, (- r + isqrt(r**2 - 4 * m * (n - (B - 1)))) // (2 * m) + 1 ) : if n + l * r + m * l**2 >= B : print l, n, r yield (n + l * r + m * l**2, r + 2 * m * l) else : if self.__bound > 0 : yield (0,0) for n in xrange(1, self.__bound) : if (fm * n).is_square() : rt_fmm = isqrt(fm * n) yield(n, rt_fmm) yield(n, -rt_fmm) raise StopIteration
def iter_indefinite_forms(self): r""" Iterate over indices with non-positive discriminant. TESTS:: sage: from psage.modform.jacobiforms.jacobiformd1nn_fourierexpansion import * sage: list(JacobiFormD1NNFilter(2, 2, reduced = False, weak_forms = True).iter_indefinite_forms()) [(0, -1), (1, 3), (0, 0), (1, -3), (0, 1), (0, -2), (0, 2)] sage: list(JacobiFormD1NNFilter(3, 2, reduced = False, weak_forms = True).iter_indefinite_forms()) [(0, -1), (1, 3), (2, -4), (0, 0), (2, 4), (1, -3), (0, 1), (0, -2), (0, 2)] sage: list(JacobiFormD1NNFilter(10, 2, reduced = True, weak_forms = True).iter_indefinite_forms()) [(0, 0), (0, 1), (0, 2)] sage: list(JacobiFormD1NNFilter(10, 3, reduced = True, weak_forms = True).iter_indefinite_forms()) [(0, 0), (0, 1), (0, 2), (0, 3)] sage: list(JacobiFormD1NNFilter(10, 10, reduced = True, weak_forms = True).iter_indefinite_forms()) [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (1, 7), (1, 8), (1, 9), (1, 10), (2, 9), (2, 10)] """ B = self.__bound m = self.__m fm = Integer(4 * self.__m) if self.__reduced: if self.__weak_forms: for n in xrange(0, min(self.__m // 4 + 1, self.__bound)): for r in xrange( isqrt(fm * n - 1) + 1 if n != 0 else 0, self.__m + 1): yield (n, r) else: for r in xrange( 0, min(self.__m + 1, isqrt((self.__bound - 1) * fm) + 1)): if fm.divides(r**2): yield (r**2 // fm, r) else: if self.__weak_forms: ## We first determine the reduced indices. for n in xrange(0, min(m // 4 + 1, B)): if n == 0: r_iteration = range(-m + 1, m + 1) else: r_iteration = range( -m + 1, -isqrt(fm * n - 1) ) \ + range( isqrt(fm * n - 1) + 1, m + 1 ) for r in r_iteration: for l in range( (-r - isqrt(r**2 - 4 * m * (n - (B - 1))) - 1) // (2 * m) + 1, (-r + isqrt(r**2 - 4 * m * (n - (B - 1)))) // (2 * m) + 1): if n + l * r + m * l**2 >= B: print l, n, r yield (n + l * r + m * l**2, r + 2 * m * l) else: if self.__bound > 0: yield (0, 0) for n in xrange(1, self.__bound): if (fm * n).is_square(): rt_fmm = isqrt(fm * n) yield (n, rt_fmm) yield (n, -rt_fmm) raise StopIteration
def prime_norm_representative(I, O, D, ell): """ Given an order O and a left O-ideal I return another left O-ideal J in the same class, but with prime norm. This corresponds to Step 1 in the notes. So given an ideal I it returns an ideal in the same class but with reduced norm N where N != ell is a large prime coprime to both D and p, and ell is a quadratic nonresidue module N. Args: I: A left O-ideal. O: An order in a quaternion algebra. D: An integer. ell: A prime. Returns: A pair (J, gamma) where J = I * gamma is a left O-ideal in the same class with prime norm N. N will be coprime to both D and p, and ell will be a nonquadratic residue module N. """ # TODO: Change so O is not an argument. if not is_minkowski_basis(I.basis()): print("Warning: The ideal I does not have a minkowski basis" " precomputed and Sage can not do it for you.") nrd_I = I.norm() B = I.quaternion_algebra() p = B.discriminant() alpha = B(0) normalized_norm = Integer(alpha.reduced_norm() / nrd_I) # Choose random elements in I until one is found with norm N*nrd(I) where N # is prime. m_power = 3 m = Integer(2)**m_power # TODO: Change this to a proper bound. count = 0 while (not is_prime(normalized_norm) or normalized_norm.divides(D) or normalized_norm == ell or normalized_norm == p or mod(ell, normalized_norm).is_square()): # Make a new random element. alpha = random_combination(I.basis(), bound=m) normalized_norm = Integer(alpha.reduced_norm() / nrd_I) # Increase the box we search in if we've been trying for too long. Note # this was just a random heuristic I came up with, it's not in the # paper. count += 1 if count > 4 * m_power: m_power += 1 m = Integer(2)**m_power count = 0 # We now have an element alpha with norm N*nrd(I) where N is prime. The # ideal J = I*gamma has prime norm where gamma = conjugate(alpha) / nrd(I). gamma = alpha.conjugate() / nrd_I J = I.scale(gamma) assert is_prime(Integer(J.norm())) assert not mod(ell, Integer(J.norm())).is_square() assert gcd(Integer(J.norm()), D) == 1 return J, gamma