コード例 #1
0
ファイル: hgm.py プロジェクト: edgarcosta/amortizedHGM
    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())