from sympy import * from sympy.abc import a, b, x from output_util import to_latex, sign2cmp, to_latexes from sgntools import lin_func_sgn from solution import * _data = { (1, 2): {"constant_term": a - 2 * b / 3, "pin_term": -a / 4 + b / 4}, (1, 4): {"constant_term": -2 * a / 3 + 13 * b / 15, "pin_term": a / 4 - b / 4}, (1, 6): {"constant_term": 13 * a / 15 - 76 * b / 105, "pin_term": -a / 4 + b / 4}, (1, 8): {"constant_term": -76 * a / 105 + 263 * b / 315, "pin_term": a / 4 - b / 4}, (1, 10): { "constant_term": 263 * a / 315 - 2578 * b / 3465, "pin_term": -a / 4 + b / 4, }, (1, 12): { "constant_term": -2578 * a / 3465 + 36979 * b / 45045, "pin_term": a / 4 - b / 4, }, (2, 3): {"constant_term": a / 4 - 3 * b / 16, "pin_term": -a / 48 + b / 48}, (2, 5): {"constant_term": -3 * a / 16 + 31 * b / 144, "pin_term": a / 48 - b / 48}, (2, 7): { "constant_term": 31 * a / 144 - 115 * b / 576, "pin_term": -a / 48 + b / 48, }, (2, 9): { "constant_term": -115 * a / 576 + 3019 * b / 14400, "pin_term": a / 48 - b / 48, }, (2, 11): { "constant_term": 3019 * a / 14400 - 973 * b / 4800, "pin_term": -a / 48 + b / 48, }, (2, 13): { "constant_term": -973 * a / 4800 + 48877 * b / 235200, "pin_term": a / 48 - b / 48, }, (3, 2): {"constant_term": 2 * a - 52 * b / 27, "pin_term": -a / 16 + b / 16}, (3, 4): { "constant_term": -52 * a / 27 + 6554 * b / 3375, "pin_term": a / 16 - b / 16, }, (3, 6): { "constant_term": 6554 * a / 3375 - 2241272 * b / 1157625, "pin_term": -a / 16 + b / 16, }, (3, 8): { "constant_term": -2241272 * a / 1157625 + 60600094 * b / 31255875, "pin_term": a / 16 - b / 16, }, (3, 10): { "constant_term": 60600094 * a / 31255875 - 80596213364 * b / 41601569625, "pin_term": -a / 16 + b / 16, }, (3, 12): { "constant_term": -80596213364 * a / 41601569625 + 177153083899958 * b / 91398648466125, "pin_term": a / 16 - b / 16, }, (4, 3): { "constant_term": 3 * a / 8 - 45 * b / 128, "pin_term": -7 * a / 1920 + 7 * b / 1920, }, (4, 5): { "constant_term": -45 * a / 128 + 1231 * b / 3456, "pin_term": 7 * a / 1920 - 7 * b / 1920, }, (4, 7): { "constant_term": 1231 * a / 3456 - 19615 * b / 55296, "pin_term": -7 * a / 1920 + 7 * b / 1920, }, (4, 9): { "constant_term": -19615 * a / 55296 + 12280111 * b / 34560000, "pin_term": 7 * a / 1920 - 7 * b / 1920, }, (4, 11): { "constant_term": 12280111 * a / 34560000 - 4090037 * b / 11520000, "pin_term": -7 * a / 1920 + 7 * b / 1920, }, (4, 13): { "constant_term": -4090037 * a / 11520000 + 9824498837 * b / 27659520000, "pin_term": 7 * a / 1920 - 7 * b / 1920, }, (5, 2): { "constant_term": 24 * a - 1936 * b / 81, "pin_term": -5 * a / 64 + 5 * b / 64, }, (5, 4): { "constant_term": -1936 * a / 81 + 6051944 * b / 253125, "pin_term": 5 * a / 64 - 5 * b / 64, }, (5, 6): { "constant_term": 6051944 * a / 253125 - 101708947808 * b / 4254271875, "pin_term": -5 * a / 64 + 5 * b / 64, }, (5, 8): { "constant_term": -101708947808 * a / 4254271875 + 24715694492344 * b / 1033788065625, "pin_term": 5 * a / 64 - 5 * b / 64, }, (5, 10): { "constant_term": 24715694492344 * a / 1033788065625 - 3980462502772918544 * b / 166492601756971875, "pin_term": -5 * a / 64 + 5 * b / 64, }, (5, 12): { "constant_term": -3980462502772918544 * a / 166492601756971875 + 1477921859864507412282392 * b / 61817537584151358384375, "pin_term": 5 * a / 64 - 5 * b / 64, }, (6, 3): { "constant_term": 15 * a / 8 - 945 * b / 512, "pin_term": -31 * a / 16128 + 31 * b / 16128, }, (6, 5): { "constant_term": -945 * a / 512 + 229955 * b / 124416, "pin_term": 31 * a / 16128 - 31 * b / 16128, }, (6, 7): { "constant_term": 229955 * a / 124416 - 14713475 * b / 7962624, "pin_term": -31 * a / 16128 + 31 * b / 16128, }, (6, 9): { "constant_term": -14713475 * a / 7962624 + 45982595359 * b / 24883200000, "pin_term": 31 * a / 16128 - 31 * b / 16128, }, (6, 11): { "constant_term": 45982595359 * a / 24883200000 - 5109066151 * b / 2764800000, "pin_term": -31 * a / 16128 + 31 * b / 16128, }, (6, 13): { "constant_term": -5109066151 * a / 2764800000 + 601081707598999 * b / 325275955200000, "pin_term": 31 * a / 16128 - 31 * b / 16128, }, } class PiNIntegrate(GetIntegrateFromData): data = _data def get_integrate_args(self, args): n, m = args return x**m * (a + b * x**2) * (log(1 / x)) ** (n - 1) / (1 + x**2), (x, 0, 1) class PiNSolution(Solution): def __init__(self, n, p, q): if n < 0: n = -n p, q = q, p self.n = n self.p = p self.q = q if self.q == 0: raise BadInput() self.get_integrate = PiNIntegrate() self.symbols = (a, b) self.integrate_result_classes_eq = { "pin_term": q, CONSTANT_TERM_KEY: -p, } # check self.check_sgn = lin_func_sgn def get_tries_args(self): for n, m in PiNIntegrate.data.keys(): if n == self.n: yield n, m def get_latex_ans(self): try_arg, symbol_val, sgn = self.try_times() print(f"{(try_arg, symbol_val, sgn)=}") if try_arg is None: return None p, n = to_latexes(self.p, self.n) q = to_latex(self.q, is_coeff=True) I = self.get_integrate.get_latex(try_arg, symbol_val) return rf"{q}\pi^{n}-{p} = {I} {sign2cmp[sgn]} 0" register("π^n", PiNSolution) if __name__ == "__main__": print(PiNSolution(3, 31, 1).get_latex_ans())