K i<dZddlmZmZddlmZddlmZdZdZ y)z Recurrences )Ssympify)iterable)as_intcP|stjSt|s tdt|s tdt |}|dkr t d|Dcgc] }t |}}|Dcgc] }t |}}t|}t||kDr td|tjg|t|z zz }||kr||Stt|||Dcgc] \}}||z } }}t| dd| dScc}wcc}wcc}}w)a Evaluation of univariate linear recurrences of homogeneous type having coefficients independent of the recurrence variable. Parameters ========== coeffs : iterable Coefficients of the recurrence init : iterable Initial values of the recurrence n : Integer Point of evaluation for the recurrence Notes ===== Let `y(n)` be the recurrence of given type, ``c`` be the sequence of coefficients, ``b`` be the sequence of initial/base values of the recurrence and ``k`` (equal to ``len(c)``) be the order of recurrence. Then, .. math :: y(n) = \begin{cases} b_n & 0 \le n < k \\ c_0 y(n-1) + c_1 y(n-2) + \cdots + c_{k-1} y(n-k) & n \ge k \end{cases} Let `x_0, x_1, \ldots, x_n` be a sequence and consider the transformation that maps each polynomial `f(x)` to `T(f(x))` where each power `x^i` is replaced by the corresponding value `x_i`. The sequence is then a solution of the recurrence if and only if `T(x^i p(x)) = 0` for each `i \ge 0` where `p(x) = x^k - c_0 x^(k-1) - \cdots - c_{k-1}` is the characteristic polynomial. Then `T(f(x)p(x)) = 0` for each polynomial `f(x)` (as it is a linear combination of powers `x^i`). Now, if `x^n` is congruent to `g(x) = a_0 x^0 + a_1 x^1 + \cdots + a_{k-1} x^{k-1}` modulo `p(x)`, then `T(x^n) = x_n` is equal to `T(g(x)) = a_0 x_0 + a_1 x_1 + \cdots + a_{k-1} x_{k-1}`. Computation of `x^n`, given `x^k = c_0 x^{k-1} + c_1 x^{k-2} + \cdots + c_{k-1}` is performed using exponentiation by squaring (refer to [1_]) with an additional reduction step performed to retain only first `k` powers of `x` in the representation of `x^n`. Examples ======== >>> from sympy.discrete.recurrences import linrec >>> from sympy.abc import x, y, z >>> linrec(coeffs=[1, 1], init=[0, 1], n=10) 55 >>> linrec(coeffs=[1, 1], init=[x, y], n=10) 34*x + 55*y >>> linrec(coeffs=[x, y], init=[0, 1], n=5) x**2*y + x*(x**3 + 2*x*y) + y**2 >>> linrec(coeffs=[1, 2, 3, 0, 0, 4], init=[x, y, z], n=16) 13576*x + 5676*y + 2356*z References ========== .. [1] https://en.wikipedia.org/wiki/Exponentiation_by_squaring .. [2] https://en.wikipedia.org/w/index.php?title=Modular_exponentiation§ion=6#Matrices See Also ======== sympy.polys.agca.extensions.ExtensionElement.__pow__ z6Expected a sequence of coefficients for the recurrencezFExpected a sequence of values for the initialization of the recurrencerz@Point of evaluation of recurrence must be a non-negative integerzECount of initial values should not exceed the order of the recurrenceN) rZeror TypeErrorr ValueErrorrlenzip linrec_coeffssum) coeffsinitnargcbkuvtermss `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/discrete/recurrences.pylinrecr s<Z vv F *+ + D>-. . q A1u/0 0"((#(A(!%&#&A& AA 1vz23 3 affXq3q6z ""1ut  q!!4a8 9TQQqS 9E 9 uSbz59 %% )& :sD6D4D"cJtfdfd|S)a Compute the coefficients of n'th term in linear recursion sequence defined by c. `x^k = c_0 x^{k-1} + c_1 x^{k-2} + \cdots + c_{k-1}`. It computes the coefficients by using binary exponentiation. This function is used by `linrec` and `_eval_pow_by_cayley`. Parameters ========== c = coefficients of the divisor polynomial n = exponent of x, so dividend is x^n cltjgdt|zdz |zz}t|D].\}}t|D]\}}|||z|zxx||zz cc<0t t|dz dz dD].}t D]}|||z dz xx|||zz cc< 0|dS)Nr)rr r enumeraterange) roffsetwipjqrrs r_square_and_reducez)linrec_coeffs.._square_and_reduces VVHaAhlV+ ,aL )DAq!!  )1&1*q.!QqS(! ) )s1vz1q5"- *A1X *!a%!) !QqT )  * *!u c|krAtjg|ztjgztjg|z dz zzS|dz|dzS)Nrr)rr One)r _final_coeffsr(rs rr,z$linrec_coeffs.._final_coeffssY q5FF8A:'166(AEAI*>> >%mAF&;QUC Cr))r )rrr,r(rs` @@@rrrws&$ AA"D  r)N) __doc__ sympy.corerrsympy.utilities.iterablesrsympy.utilities.miscrrrr)rr2s!".'j&Z/r)