K i)ddlmZddlZddlmZddlmZmZddlm Z ddl m Z ddl m Z ddlmZdd Zddd Zd Zd Zd Zy)) annotationsN) factor_terms)IntegerRational)S)Dummy)_sympify)as_intct|}td|jDr|jr t |ddS|j r!t |j |jdS|jrI|jtjur-|jjrt dd|jS|jrt|jdk(r|jdj r|jdjr|jdjjrd|jdjtjur;|j\}}t d|j|j|j S|j!j#\}}|jr+|j r t ||S|j$r(t|jdk(r|j\}}ntj&}|}|jrtj(}|jr(t|jdk(r|j\}}n|jr t+d}|}|jrXjrL|jtjur0|jjr|j}t ||||St-d|z)aReturn the continued fraction representation of a Rational or quadratic irrational. Examples ======== >>> from sympy.ntheory.continued_fraction import continued_fraction >>> from sympy import sqrt >>> continued_fraction((1 + 2*sqrt(3))/5) [0, 1, [8, 3, 34, 3]] See Also ======== continued_fraction_periodic, continued_fraction_reduce, continued_fraction_convergents c34K|]}|jywN) is_Rational).0is f/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/ntheory/continued_fraction.py z%continued_fraction..s ,Q1== ,srz4expecting a rational or quadratic irrational, not %s)r allatoms is_Integercontinued_fraction_periodicrpqis_PowexprHalfbaseis_Mullenargsexpandas_numer_denomis_AddZeroNaNr ValueError)aebrdbccs rcontinued_fractionr. s"  A ,!'') ,, <<.q!Q7 7 ]].qssACC; ; XX!%%166/aff.?.?.q!QVV< < XX#aff+*q %%q   q ))q '66DAq.q!##qvvqssC C88:,,.DAq||==6q!<<88AFF q 0FFEArAB<<AyyS\Q%6!ww1#AJ||HH!&&FF--FF:1aAFF >B DDc ddlm}m}tt t ||||g\}}}}|dkrt d|z|dk(r t d|sd}||}|jr$ttt|||zz|S|dkr | | | }}}|||zz|z }|dkr/|| }| |z } td| z } | dxx|dzzcc<| S||dzz}||z}||dzz |zr||dzz}||z}||z}||z}g} i} ||f| vrDt| | ||f<| j||z|z| d|z|z }||dzz |z}||f| vrD| ||f} | d| | | dgzS) aR Find the periodic continued fraction expansion of a quadratic irrational. Compute the continued fraction expansion of a rational or a quadratic irrational number, i.e. `\frac{p + s\sqrt{d}}{q}`, where `p`, `q \ne 0` and `d \ge 0` are integers. Returns the continued fraction representation (canonical form) as a list of integers, optionally ending (for quadratic irrationals) with list of integers representing the repeating digits. Parameters ========== p : int the rational part of the number's numerator q : int the denominator of the number d : int, optional the irrational part (discriminator) of the number's numerator s : int, optional the coefficient of the irrational part Examples ======== >>> from sympy.ntheory.continued_fraction import continued_fraction_periodic >>> continued_fraction_periodic(3, 2, 7) [2, [1, 4, 1, 1]] Golden ratio has the simplest continued fraction expansion: >>> continued_fraction_periodic(1, 2, 5) [[1]] If the discriminator is zero or a perfect square then the number will be a rational number: >>> continued_fraction_periodic(4, 3, 0) [1, 3] >>> continued_fraction_periodic(4, 3, 49) [3, 1, 2] See Also ======== continued_fraction_iterator, continued_fraction_reduce References ========== .. [1] https://en.wikipedia.org/wiki/Periodic_continued_fraction .. [2] K. Rosen. Elementary Number theory and its applications. Addison-Wesley, 3 Sub edition, pages 379-381, January 1992. r)sqrtfloorz(expected non-negative for `d` but got %szThe denominator cannot be 0.rrN) sympy.functionsr1r2listmapr r'rcontinued_fraction_iteratorrr.r append)rrr+sr1r2sdnwfone_ftermspqrs rrrLsr,c&1aA,/0JAq!Q1uCaGHHAv788  aB }}/QrT10EFGG 1u"qb1"a1 QrT1 A1u 1"I BF"1q5) aAE AIA!GB AqD!| QT  a Q QE B a& ZAq6  a"fq[! "IaK!O AXM a&  Aq6 A !9ab { ""r/c ddlm}gtd  fd}tj}t ||D]}rZtd}|t |gz|z |}|j|d}|j |j}n|}|jrBt|}|jr+|jddk(r|j|j}|S)a2 Reduce a continued fraction to a rational or quadratic irrational. Compute the rational or quadratic irrational number from its terminating or periodic continued fraction expansion. The continued fraction expansion (cf) should be supplied as a terminating iterator supplying the terms of the expansion. For terminating continued fractions, this is equivalent to ``list(continued_fraction_convergents(cf))[-1]``, only a little more efficient. If the expansion has a repeating part, a list of the repeating terms should be returned as the last element from the iterator. This is the format returned by continued_fraction_periodic. For quadratic irrationals, returns the largest solution found, which is generally the one sought, if the fraction is in canonical form (all terms positive except possibly the first). Examples ======== >>> from sympy.ntheory.continued_fraction import continued_fraction_reduce >>> continued_fraction_reduce([1, 2, 3, 4, 5]) 225/157 >>> continued_fraction_reduce([-2, 1, 9, 7, 1, 2]) -256/233 >>> continued_fraction_reduce([2, 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8]).n(10) 2.718281835 >>> continued_fraction_reduce([1, 4, 2, [3, 1]]) (sqrt(21) + 287)/238 >>> continued_fraction_reduce([[1]]) (1 + sqrt(5))/2 >>> from sympy.ntheory.continued_fraction import continued_fraction_periodic >>> continued_fraction_reduce(continued_fraction_periodic(8, 5, 13)) (sqrt(13) + 8)/5 See Also ======== continued_fraction_periodic r)solvexc3rK|D]-}t|trj|y|/ywr ) isinstancer5extend)cfnxtperiodrCs r untillistz,continued_fraction_reduce..untillists9 C#t$ c"I  s47yr3) sympy.solversrBrrr%continued_fraction_convergentscontinued_fraction_reducesortsubsradsimpr$rrr!func) rGrBrJr(rKsolnspurervrIrCs @@rrNrNsV$ F c A A +IbM :    #J/! =A1E Ry VVAt_ $ $ &  yy "  99r)"''"B Ir/c#LKddlm} ||}|||z}|syd|z }w)a Return continued fraction expansion of x as iterator. Examples ======== >>> from sympy import Rational, pi >>> from sympy.ntheory.continued_fraction import continued_fraction_iterator >>> list(continued_fraction_iterator(Rational(3, 8))) [0, 2, 1, 2] >>> list(continued_fraction_iterator(Rational(-3, 8))) [-1, 1, 1, 1, 2] >>> for i, v in enumerate(continued_fraction_iterator(pi)): ... if i > 7: ... break ... print(v) 3 7 15 1 292 1 1 1 References ========== .. [1] https://en.wikipedia.org/wiki/Continued_fraction r)r2rN)r4r2)rCr2rs rr7r7s:D&  !H Q  aC s"$c#|Kt|trBt|dtr/tj|ddtj|d}t j t j}}t jt j }}|D]!}||z|z||z|z}}||}}||}}||z #yw)aL Return an iterator over the convergents of a continued fraction (cf). The parameter should be in either of the following to forms: - A list of partial quotients, possibly with the last element being a list of repeating partial quotients, such as might be returned by continued_fraction and continued_fraction_periodic. - An iterable returning successive partial quotients of the continued fraction, such as might be returned by continued_fraction_iterator. In computing the convergents, the continued fraction need not be strictly in canonical form (all integers, all but the first positive). Rational and negative elements may be present in the expansion. Examples ======== >>> from sympy.core import pi >>> from sympy import S >>> from sympy.ntheory.continued_fraction import continued_fraction_convergents, continued_fraction_iterator >>> list(continued_fraction_convergents([0, 2, 1, 2])) [0, 1/2, 1/3, 3/8] >>> list(continued_fraction_convergents([1, S('1/2'), -7, S('1/4')])) [1, 3, 19/5, 7] >>> it = continued_fraction_convergents(continued_fraction_iterator(pi)) >>> for n in range(7): ... print(next(it)) 3 22/7 333/106 355/113 103993/33102 104348/33215 208341/66317 >>> it = continued_fraction_convergents([1, [1, 2]]) # sqrt(3) >>> for n in range(7): ... print(next(it)) 1 2 5/3 7/4 19/11 26/15 71/41 See Also ======== continued_fraction_iterator, continued_fraction, continued_fraction_periodic r3N)rEr5 itertoolschaincyclerr%One)rGp_2q_2p_1q_1r(rrs rrMrM0sr"d 2b64 8 __RWioobf&= >vvquuCuuaffC us{AcECK1SaSc sB:B<)returnr5)rr) __future__rrXsympy.core.exprtoolsrsympy.core.numbersrrsympy.core.singletonrsympy.core.symbolrsympy.core.sympifyr sympy.utilities.miscr r.rrNr7rMr/rris>"-0"#''>DBj#ZHV)XAr/