def fill_degree_table(self, update_func, deg_neg_one, maxdeg=None, mindeg=None): ''' Generic function that iterates by increasing degree from 0 to curve.MAXDEG (usually set to 2g). At each iteration update_func is called with -P and -Q values from previous iteration. Input: update_func, a curve.m list representing the values at -1 degree divisors. ''' maxdeg = maxdeg if maxdeg else self.MAXDEG mindeg = mindeg if mindeg else 0 L = [deg_neg_one] for degA in range(mindeg, maxdeg + 1): N = [] for Aq in range(self.m): div = TwoPDivisor(Q=Aq, deg=degA, curve=self) minus_p_val = L[-1][Aq] minus_q_val = L[-1][ Aq - 1] # python does the right thing with negative indices N.append(update_func(div, minus_p_val, minus_q_val)) L.append(N) return L[1:]
def map_div(self, func, mindeg=None, maxdeg=None): maxdeg = maxdeg if maxdeg else self.MAXDEG mindeg = mindeg if mindeg else 0 L = [] for degA in range(mindeg, maxdeg + 1): N = [] for Aq in range(self.m): div = TwoPDivisor(Q=Aq, deg=degA, curve=self) N.append(func(div, self)) L.append(N) return L
def wrap_table(self, name): offset_tup = self._data['offset'][name] offset = TwoPDivisor(P=offset_tup[0], Q=offset_tup[1]) if name.lower()[0] == 'd': self.__dict__[name.lower()] = DivTable(self._data[name], self, start=offset, min=1) else: self.__dict__[name.lower()] = DivTable(self._data[name], self, start=offset)
def reduce_table(self, update_func, start, maxdeg=None, mindeg=None): ''' same as fill_degree_table but don't keep the table''' maxdeg = maxdeg if maxdeg else self.MAXDEG mindeg = mindeg if mindeg else 0 L = start for degA in range(mindeg, maxdeg + 1): N = [] for Aq in range(self.m): div = TwoPDivisor(Q=Aq, deg=degA, curve=self) minus_p_val = L[Aq] minus_q_val = L[ Aq - 1] # python does the right thing with negative indices N.append(update_func(div, minus_p_val, minus_q_val)) L = N return L
def fill_degree_table_reverse(self, update_func, deg_max, maxdeg=None, mindeg=None): ''' Same as fill_degree_table but in reverse degree order (i.e. going from DEGMAX down to 0, and updating on +P and +Q values''' maxdeg = maxdeg if maxdeg else self.MAXDEG mindeg = mindeg if mindeg else 0 L = [deg_max] for degA in range(maxdeg, mindeg - 1, -1): N = [] for Aq in range(self.m): div = TwoPDivisor(Q=Aq, deg=degA, curve=self) plus_p_val = L[-1][Aq] plus_q_val = L[-1][ (Aq + 1) % self. m] # python does the right thing with negative indices N.append(update_func(div, plus_p_val, plus_q_val)) L.append(N) L = L[1:] L.reverse() return L
def D(self): '''Two point-divisor equivalent to sum of all rational point minus P,Q''' return TwoPDivisor(deg=self.ddeg, Q=self.dq, curve=self)
def Q(self): return TwoPDivisor(deg=1, Q=1, curve=self)
def P(self): return TwoPDivisor(deg=1, P=1, curve=self)
def K(self): return TwoPDivisor(deg=2 * self.g - 2, Q=self.kq, curve=self)
def div(self, **kwds): return TwoPDivisor(curve=self, **kwds)