K i@RddlZddlmZdgdzZeddD]Zegddez zzedezddedzz<d"dZd"dZdZ d Z d Z d Z ejZ ejZd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$y)#Nc^|syt||z }|dz}|r t||zSd|z}|dz}|jdz }|d|zk(r||zS|dkr|dzsG|dz}|dz }|dzsn6|dz }|dzs,|d|zdz zr|dz}|d|zdz zr||z}||z }|dzs,|t|dzzS)Nrri,)abs_small_trailing bit_length)xnlow_bytetzps \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/external/ntheory.py bit_scan1rs  AF A4xHx(1,, AA!GA AAF{1u 3wd( !GA FAd( Fd(Q!|$aQ!|$ !GA FA d( q4x( ((c&t|d|zz|S)Nr)r)r r s r bit_scan0r0s Q!q&\1 %%rcx|dkr td|dk(ry|dk(rt|}||z |fSd}t||\}}|sw|}|dz }|dkDrY|dzg}|rQ|d}t||\}}|s(|dt|zz }|}|j |dzn|j |rQt||\}}|sw||fS)Nzfactor must be > 1r)rrr) ValueErrorrdivmodlenappendpop)r fbmyrempow_list_fs rremover'4s1u-..AvAv aLAvqy A Aq\FAs  Q q51vHb\23c(m++AAOOBE*LLN13 a4KrcPttjt|S)z Return x!.)intmlibifacr s r factorialr-Ps tyyQ !!rcPttjt|S)zInteger square root of x.)r)r*isqrtr,s rsqrtr0Us tzz#a&! ""rcptjt|\}}t|t|fS)z'Integer square root of x and remainder.r*sqrtremr))r srs rr3r3Zs+ <<A DAq FCF rc|dkrd| fSd|fS)Nrrrr s r_signr9ds1uA2v a4Krc|r|s&t|xs t|}|sy|||z||zfSt|\}}t|\}}d\}}d\}}|r*t||\} } || }}||| |zz }}||| |zz }}|r*|||z||zfS)N)rrr)rrrr)r r9r) ar!gx_signy_signr r5r#r4qcs rgcdextrBjs A F c!f1616""aIFAaIFA DAq DAq a|1!1!ac'1!ac'1 q6z1v: &&rc|dkrydd|dzzzry|dz}dd|dzzzryd d|d zzzryd d|d zzzrytjt|ddk(S) z$Return True if x is a square number.rFl }{wo^?{~riE l}}k-[o{?_}cl=}:Mv?_[l}s;yUr2r r"s r is_squarerIs1u**Q1s7^< F A"aAFm4 A!b&M2!B-0 <<A  "a ''rcN t|d|S#t$r tdwxYw)zModular inverse of x modulo m. Returns y such that x*y == 1 mod m. Uses ``math.pow`` but reproduces the behaviour of ``gmpy2.invert`` which raises ZeroDivisionError if no inverse exists. rzinvert() no inverse exists)powrZeroDivisionErrorrHs rinvertrMs0>1b!} > <==>s $cl|dks|dzs td||z}|syt||dz dz|dk(ryy)zLegendre symbol (x / y). Following the implementation of gmpy2, the error is raised only when y is an even number. rrzy should be an odd primerr)rrK)r r#s rlegendrerOsK  AvQU344FA  1q1ulA!# rc>|dks|dzs td||z}|st|dk(S|dk(s|dk(ryt||dk7ryd}|dk7rP|dzdk(r"|dkDr|dz}|dzdvr| }|dzdk(r|dkDr||}}|dz|dzcxk(rdk(rnn| }||z}|dk7rP|S) zJacobi symbol (x / y).rrz#y should be an odd positive integerrrrrR)rr)gcd)r r#js rjacobirVsAvQU>??FA 16{Ava 1ayA~ A q&!eqjQU !GA1uB!eqjQU!1 q5AE Q A Q q& Hrct||dk7ry|dk(ry|dkr|dkrdnd}t|}t|}||z}|dzr |dzdvr| }|t||zS)zKronecker symbol (x / y).rrrrrrQ)rTr rrV)r r#signr4s r kroneckerrYss 1ayA~AvQ1q52aD AA! A!GA1uQ&u &A, rc|dkr td|dkr td|dvr|dfS|dk(r|dfS|dk(r&tj|\}}t|| fS||j k\ry t|d |z zd z}|d kDr3d|}} ||dz z}||dz |z||zz|z}}t||z dkrn.|}||z}||kr|dz }||z}||kr||kDr|dz}||z}||kDr|||k(fS#t $rTt j||z }|d kDr&t|d z }td ||z zdz|z}ntd |z}YwxYw)Nrzy must be nonnegativerzn must be positiver;Tr)rFg?g?5g@l r) rr*r3r)r OverflowErrormathlog2r ) r#r r r$guessexpshiftxprevrs rirootrcs1u0111u-..F{$wAv$wAva31v3wALLN"A1IO$ u}uqAE AAE19q!t+a/1E1u9~!   1A a% Q qD a% a% Q qD a% a1f93 "iil1n 8bMEcEk*Q./58ESME "s2C66AEEc|dkr td|dkr td|dk(ry|dzdk(r|dk(S||z}t||dk7r tdt||dz |dk(S)Nrz7is_fermat_prp() requires 'a' greater than or equal to 2rz.is_fermat_prp() requires 'n' be greater than 0Frz&is_fermat_prp() requires gcd(n,a) == 1)rrTrKr r<s r is_fermat_prprfs1uRSS1uIJJAv1uzAv FA 1ayA~ABB q!a% q  rc|dkr td|dkr td|dk(ry|dzdk(r|dk(S||z}t||dk7r tdt||dz |t|||zk(S)Nrz6is_euler_prp() requires 'a' greater than or equal to 2rz-is_euler_prp() requires 'n' be greater than 0Frz%is_euler_prp() requires gcd(n,a) == 1)rrTrKrVres r is_euler_prprh%s1uQRR1uHIIAv1uzAv FA 1ayA~@AA q!q&! q! q 0 00rct|dz }t|||z |}|dk(s||dz k(ryt|dz D] }t|d|}||dz k(ry|dk(s yy)NrTrF)rrKrange)r r<r4_s r_is_strong_prprl4sw!a%A AqAvqAAva!e 1q5\ 1aL A: 6  rc|dkr td|dkr td|dk(ry|dzdk(r|dk(S||z}t||dk7r tdt||S)Nrz7is_strong_prp() requires 'a' greater than or equal to 2rz.is_strong_prp() requires 'n' be greater than 0Frz&is_strong_prp() requires gcd(n,a) == 1)rrTrlres r is_strong_prprnBsu1uRSS1uIJJAv1uzAv FA 1ayA~ABB !Q rc|dk(ry|dzd|zz }d}|}||z}|dk(r_t|ddD]L}||z|z}||zdz |z}|dk(s||z|z||z||zz}}|dzr||z }|dzr||z }|dz |dz }}NnA|dk(rj|d k(ret|ddD]N}||z|z}|dk(r ||zdz |z}n ||zdz|z}d}|dk(s/||z|dz}}|dzr||z }|dz}||z }d }P||z}n|dk(r_t|ddD]M}||z|z}||zd|zz |z}||z}|dk(r&||z||zdz}}|dzr||z }|dz}||z }||z}||z}Onnt|ddD]]}||z|z}||zd|zz |z}||z}|dk(r6||z|z||z||zz}}|dzr||z }|dzr||z }|dz |dz }}||z}||z}_||z||z|fS) aReturn the modular Lucas sequence (U_k, V_k, Q_k). Explanation =========== Given a Lucas sequence defined by P, Q, returns the kth values for U and V, along with Q^k, all modulo n. This is intended for use with possibly very large values of n and k, where the combinatorial functions would be completely unusable. .. math :: U_k = \begin{cases} 0 & \text{if } k = 0\\ 1 & \text{if } k = 1\\ PU_{k-1} - QU_{k-2} & \text{if } k > 1 \end{cases}\\ V_k = \begin{cases} 2 & \text{if } k = 0\\ P & \text{if } k = 1\\ PV_{k-1} - QV_{k-2} & \text{if } k > 1 \end{cases} The modular Lucas sequences are used in numerous places in number theory, especially in the Lucas compositeness tests and the various n + 1 proofs. Parameters ========== n : int n is an odd number greater than or equal to 3 P : int Q : int D determined by D = P**2 - 4*Q is non-zero k : int k is a nonnegative integer Returns ======= U, V, Qk : (int, int, int) `(U_k \bmod{n}, V_k \bmod{n}, Q^k \bmod{n})` Examples ======== >>> from sympy.external.ntheory import _lucas_sequence >>> N = 10**2000 + 4561 >>> sol = U, V, Qk = _lucas_sequence(N, 3, 1, N//2); sol (0, 2, 1) References ========== .. [1] https://en.wikipedia.org/wiki/Lucas_sequence r)rrrrrSrrRN1r)bin) r PQkDUVQkr!s r_lucas_sequenceryQsr Av 1qs A A A QBAvQ &A1 A1qA ACxsQw!ac 1q5FAq5FAAvqAv1 & aAGQ A1 AQwqS1WMqS1WMCxAqAv1q5FAaQ  a aQ A1 A1qtq A "HBCxA!z1q5FAaEa !GB  Q A1 A1qtq A "HBCxsQw!ac 1q5FAq5FAAvqAv1a !GB  E1q5" rc|dzd|zz }|dk(s |dks|dvr td|dkr td|dk(ry|dzdk(r|dk(St||||d||zk(S) NrrSr)rrz,invalid values for p,q in is_fibonacci_prp()rz1is_fibonacci_prp() requires 'n' be greater than 0F)rryr rr@ds ris_fibonacci_prpr}s 1qs AAva1G+GHH1uLMMAv1uzAv 1aA &q )QU 22rc |dzd|zz }|dk(r td|dkr td|dk(ry|dzdk(r|dk(St|||zd|fvr tdt||||t||z ddk(S) NrrSrz(invalid values for p,q in is_lucas_prp()rz-is_lucas_prp() requires 'n' be greater than 0Fz)is_lucas_prp() requires gcd(n,2*q*D) == 1)rrTryrVr{s r is_lucas_prprs 1qs AAvCDD1uHIIAv1uzAv  1ac{1a& DEE 1aAq! $4 5a 8A ==rctdddD]Y}|dzr| }t||}|dk(rt|dd|z dz|dzddk(cS|dk(r||zry|d k(sMt|sYyt d ) adLucas compositeness test with the Selfridge parameters for n. Explanation =========== The Lucas compositeness test checks whether n is a prime number. The test can be run with arbitrary parameters ``P`` and ``Q``, which also change the performance of the test. So, which parameters are most effective for running the Lucas compositeness test? As an algorithm for determining ``P`` and ``Q``, Selfridge proposed method A [1]_ page 1401 (Since two methods were proposed, referred to simply as A and B in the paper, we will refer to one of them as "method A"). method A fixes ``P = 1``. Then, ``D`` defined by ``D = P**2 - 4Q`` is varied from 5, -7, 9, -11, 13, and so on, with the first ``D`` being ``jacobi(D, n) == -1``. Once ``D`` is determined, ``Q`` is determined to be ``(P**2 - D)//4``. References ========== .. [1] Robert Baillie, Samuel S. Wagstaff, Lucas Pseudoprimes, Math. Comp. Vol 35, Number 152 (1980), pp. 1391-1417, https://doi.org/10.1090%2FS0025-5718-1980-0583518-6 http://mpqs.free.fr/LucasPseudoprimes.pdf r@BrrrrSrF z=appropriate value for D cannot be found in is_selfridge_prp())rjrVryrIr)r rurUs r_is_selfridge_prprs41i #  q5A 1aL 7"1a!A#!QU;A>!C C 6a!e 7y|  T UUrc^|dkr td|dk(ry|dzdk(r|dk(St|S)Nr1is_selfridge_prp() requires 'n' be greater than 0Frr)rrr8s ris_selfridge_prprs>1uLMMAv1uzAv Q rc|dzd|zz }|dk(r td|dkr td|dk(ry|dzdk(r|dk(St|||zd|fvr tdt||}t||z }t |||||z |z \}}}|dk(s|dk(ry t |dz D]$} ||zd|zz |z}|dk(ry t |d|}&y) NrrSrz/invalid values for p,q in is_strong_lucas_prp()rrFz0is_strong_lucas_prp() requires gcd(n,2*q*D) == 1T)rrTrVrryrjrK) r rr@rurUr4rvrwrxrks ris_strong_lucas_prprs  1qs AAvJKK1uLMMAv1uzAv  1ac{1a& KLLq! A!a%Aq!QQ1 5HAq"Ava 1q5\ qS1R4Z1  6 Q]  rctdddD]}|dzr| }t||}|dk(rpt|dz}t|dd|z dz|dz|z \}}}|dk(s|dk(ryt|dz D]%}||zd|zz |z}|dk(ryt |d|}'y |dk(r||zry |d k(st |sy t d ) NrrrrrrSrTFrzDappropriate value for D cannot be found in is_strong_selfridge_prp())rjrVrryrKrIr)r rurUr4rvrwrxrks r_is_strong_selfridge_prpr7s 1i # q5A 1aL 7!a% A&q!acaZ!a%AFHAq"Ava1q5\ #qS1R4Z1$6Q]  #  6a!e 7y|'( [ \\rc^|dkr td|dk(ry|dzdk(r|dk(St|S)Nrz8is_strong_selfridge_prp() requires 'n' be greater than 0Frr)rrr8s ris_strong_selfridge_prprOs>1uSTTAv1uzAv #A &&rcz|dkr td|dk(ry|dzdk(r|dk(St|dxr t|S)Nrz,is_bpsw_prp() requires 'n' be greater than 0Frr)rrlrr8s r is_bpsw_prprYsK1uGHHAv1uzAv !Q  8$5a$88rcz|dkr td|dk(ry|dzdk(r|dk(St|dxr t|S)Nrz3is_strong_bpsw_prp() requires 'n' be greater than 0Frr)rrlrr8s ris_strong_bpsw_prprcsK1uNOOAv1uzAv !Q  ?$rs  #) q!CA/0cQ1q5\.BOAF*aAEl*+C)@&8" #   hh hh '*!(H >   0 +\ ! 1   |~ 3 >%VP 2]0'9@r