1from sympy.concrete.guess import ( 2 find_simple_recurrence_vector, 3 find_simple_recurrence, 4 rationalize, 5 guess_generating_function_rational, 6 guess_generating_function, 7 guess 8 ) 9from sympy import (Function, Symbol, sympify, Rational, symbols, S, 10 fibonacci, factorial, exp, Product, RisingFactorial) 11 12 13def test_find_simple_recurrence_vector(): 14 assert find_simple_recurrence_vector( 15 [fibonacci(k) for k in range(12)]) == [1, -1, -1] 16 17 18def test_find_simple_recurrence(): 19 a = Function('a') 20 n = Symbol('n') 21 assert find_simple_recurrence([fibonacci(k) for k in range(12)]) == ( 22 -a(n) - a(n + 1) + a(n + 2)) 23 24 f = Function('a') 25 i = Symbol('n') 26 a = [1, 1, 1] 27 for k in range(15): a.append(5*a[-1]-3*a[-2]+8*a[-3]) 28 assert find_simple_recurrence(a, A=f, N=i) == ( 29 -8*f(i) + 3*f(i + 1) - 5*f(i + 2) + f(i + 3)) 30 assert find_simple_recurrence([0, 2, 15, 74, 12, 3, 0, 31 1, 2, 85, 4, 5, 63]) == 0 32 33 34def test_rationalize(): 35 from mpmath import cos, pi, mpf 36 assert rationalize(cos(pi/3)) == S.Half 37 assert rationalize(mpf("0.333333333333333")) == Rational(1, 3) 38 assert rationalize(mpf("-0.333333333333333")) == Rational(-1, 3) 39 assert rationalize(pi, maxcoeff = 250) == Rational(355, 113) 40 41 42def test_guess_generating_function_rational(): 43 x = Symbol('x') 44 assert guess_generating_function_rational([fibonacci(k) 45 for k in range(5, 15)]) == ((3*x + 5)/(-x**2 - x + 1)) 46 47 48def test_guess_generating_function(): 49 x = Symbol('x') 50 assert guess_generating_function([fibonacci(k) 51 for k in range(5, 15)])['ogf'] == ((3*x + 5)/(-x**2 - x + 1)) 52 assert guess_generating_function( 53 [1, 2, 5, 14, 41, 124, 383, 1200, 3799, 12122, 38919])['ogf'] == ( 54 (1/(x**4 + 2*x**2 - 4*x + 1))**S.Half) 55 assert guess_generating_function(sympify( 56 "[3/2, 11/2, 0, -121/2, -363/2, 121, 4719/2, 11495/2, -8712, -178717/2]") 57 )['ogf'] == (x + Rational(3, 2))/(11*x**2 - 3*x + 1) 58 assert guess_generating_function([factorial(k) for k in range(12)], 59 types=['egf'])['egf'] == 1/(-x + 1) 60 assert guess_generating_function([k+1 for k in range(12)], 61 types=['egf']) == {'egf': (x + 1)*exp(x), 'lgdegf': (x + 2)/(x + 1)} 62 63 64def test_guess(): 65 i0, i1 = symbols('i0 i1') 66 assert guess([1, 2, 6, 24, 120], evaluate=False) == [Product(i1 + 1, (i1, 1, i0 - 1))] 67 assert guess([1, 2, 6, 24, 120]) == [RisingFactorial(2, i0 - 1)] 68 assert guess([1, 2, 7, 42, 429, 7436, 218348, 10850216], niter=4) == [ 69 2**(i0 - 1)*(Rational(27, 16))**(i0**2/2 - 3*i0/2 + 70 1)*Product(RisingFactorial(Rational(5, 3), i1 - 1)*RisingFactorial(Rational(7, 3), i1 71 - 1)/(RisingFactorial(Rational(3, 2), i1 - 1)*RisingFactorial(Rational(5, 2), i1 - 72 1)), (i1, 1, i0 - 1))] 73 assert guess([1, 0, 2]) == [] 74 x, y = symbols('x y') 75 guess([1, 2, 6, 24, 120], variables=[x, y]) == [RisingFactorial(2, x - 1)] 76