def _fib_res(self, n, p): """ fibonacci sequence nth item modulo p """ if n == 0: return (0, 1) a, b = self._fib_res(n >> 1, p) c = mod((mod(a, p) * mod(((b << 1) - a), p)), p) d = mod((powmod(a, 2, p) + powmod(b, 2, p)), p) if n & 1 == 0: return (c, d) return (d, mod((c + d), p))
def get_n_mod_d(self, n, d, use="mersenne"): if n < 0: ValueError("Negative arguments not implemented") if use == "gmpy": return mod(fib(n), d) elif use == "mersenne": return powmod(2, n, d) - 1 else: return self._fib_res(n, d)[0]