def factorial_divide(self, p, q, digits): if p == q or not self.integer_check(p) or not self.integer_check(q): return x = int(p) y = int(q) if x < y: x, y = y, x p, q = q, p if x <= self.MAX_FACTORIAL or y <= 2 or x - y == 1 or ( (x - y) * (math.log2(x) + math.log2(y)) > self.MAX_DIGITS << 1): return result = reduce(operator.mul, range(x, y, -1)) p_factorial = Expression.factorial(p) q_factorial = Expression.factorial(q) self.check(self.constructor(result), digits, Expression.divide(p_factorial, q_factorial)) if digits != self.max_depth and self.solutions[q][0] == 1: self.check( self.constructor(result - 1), digits + 1, Expression.divide( Expression.subtract(p_factorial, q_factorial), q_factorial)) self.check( self.constructor(result + 1), digits + 1, Expression.divide(Expression.add(p_factorial, q_factorial), q_factorial))
def divide(self, p, q, digits): quotient = p / q if quotient < 1: self.check(quotient**-1, digits, Expression.divide(q, p)) self.check(quotient, digits, Expression.divide(p, q)) else: self.check(quotient, digits, Expression.divide(p, q)) self.check(quotient**-1, digits, Expression.divide(q, p))
def divide(self, p, q, digits): if p < q: p, q = q, p if p % q == 0: self.check(p // q, digits, Expression.divide(p, q))