def naive_padic_H_value(self, p, t, verbose=False): R = GF(p) t = R(t) interval_sums = {} denominator = self.pochhammer_numerator_alphas_betas(p, 0) interval_sums[0] = 0 if self.D else 1 for i, v in enumerate(self.pshift): start = self.starts[i] end = self.ends[i] # deals with the start point m = start * (p - 1) if start > 0 and m.is_integer(): m = ZZ(m) # FIXME do the math to assert that is true assert self.pshift[i - 1] - self.beta().count( start ) >= 0, "i = %s start = %s self.pshift[i-i] = %s, self.beta().count(start) = %s" % ( i, start, self.pshift[i - 1], self.beta().count(start)) # eta at the end of the previous interval eta_m = self.zigzag(start) + self.beta().count( start) - self.alpha().count(start) xi_m = self.beta().count(0) - self.beta().count(start) #print("etaxi", start, end, m, eta_m, xi_m) if eta_m + xi_m + self.D == 0: sign = -1 if eta_m % 2 else 1 #print(start, sign) interval_sums[ start] = sign * self.pochhammer_numerator_alphas_betas( p, m, verbose) * t**m / denominator # deal with middle of the interval and the end point if v == 0: sign = -1 if self.zigzag(start) % 2 else 1 #print((start, end), sign) interval_sums[( start, end)] = self.naive_padic_H_value_interval_numerator( p, t, start, end, sign * denominator, verbose) # deals with the end point m = end * (p - 1) # if m.is_integer() then it is handled as a start if end != 1 and not m.is_integer(): m = floor(m) interval_sums[ end] = sign * self.pochhammer_numerator_alphas_betas( p, m, verbose) * t**m / denominator if verbose: print(interval_sums) return sum(interval_sums.values())