K i0AdZddlZddlmZddlmZddlmZmZmZmZm Z m Z m Z dgdzZ e ddD]Zegdd ez zze dezddedzz<d=d Zd Zd Zed k(rddlZej Zej"ZdZedk(rej(dk\rdZndZe dDcgc]}d|z c}ZdZdZdZedk(reZeZned k(rej4ZeZeZneZeZedk(rdeevr ej<Ze dDcgc] }e| c}Ze dDcgc] }e| c}Z dZ!dZ"de"fdZ#dde"fdZ$dde"fdZ%edk(re%Z&ne$Z&ddzZ'dd zZ(dd!zZ)dd"zZ*d#Z+d$Z,d%Z-d&Z.d'Z/d(Z0d)Z1e1Z2edk(rNej(dk\rejfxZ4xZ5Z3ejlZ7n=ejpxZ4xZ5Z3ejnZ7n ed k(re9ed*d+xZ4xZ5Z3d,Z7ne-Z4e.Z5e0Z3e/Z7ifd-Z:d.Z;ddd/fd0Zzw Utility functions for integer math. TODO: rename, cleanup, perhaps move the gmpy wrapper code here from settings.py N)bisect)xrange)BACKENDgmpysage sage_utilsMPZMPZ_ONEMPZ_ZEROcd|g}|d||zkDr||d|zdzgz}|d||zkDr|dddS)a Return a list of integers ~= [start, n*start, ..., target/n^2, target/n, target] but conservatively rounded so that the quotient between two successive elements is actually slightly less than n. With n = 2, this describes suitable precision steps for a quadratically convergent algorithm such as Newton's method; with n = 3 steps for cubic convergence (Halley's method), etc. >>> giant_steps(50,1000) [66, 128, 253, 502, 1000] >>> giant_steps(50,1000,4) [65, 252, 1000] N)starttargetnLs ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mpmath/libmp/libintmath.py giant_stepsrsP& A B%%'/ 2A  B%%'/ TrT7Nc"|dk\r||z S|| zS)zFor an integer x, calculate x >> n with the fastest (floor) rounding. Unlike the plain Python expression (x >> n), n is allowed to be negative, in which case a left shift is performed.rrxrs rrshiftr+ Ava1f}QBirc"|dk\r||zS|| z S)zFor an integer x, calculate x << n. Unlike the plain Python expression (x << n), n is allowed to be negative, in which case a right shift with default (floor) rounding is performed.rrrs rlshiftr!2rrrc~|sy|dz}|r t|Sd}|dz}|dzs|dz}|dz }|dzs|t|dzzS)z1Count the number of trailing zero bits in abs(n).rr)small_trailing)rlow_bytets rpython_trailingr'>se 4xHh'' A!GA$h a Q$h ~a$h' ''rr2c:|rt|jSyzr=ss1v||~rc4t|jSr?)r sqrtremr,s rrr>sA(rc,|dkrd| dzzt| zS||vr||S|}ttttf\}}}}|rF|dzr!||z}||z|z||zz||z|z}}|dz}n||z}||z|z|d|z|zz}}|dz}|rF|dkr|||<|S)zCComputes the nth Fibonacci number as an integer, for integer n.rrrrrX)ifibr r ) r_cachemabrzqaqqqs rrrFs 1uqbd|dA2h&&F{ay A(Hg5JAq!Q q51BQ3r6!A#:qs2vqA FA1BQ3r62ac!e8qA !GA  3wq Hri)rrc|j|}|r|St|}||dz }t}||kr||z}||kr|||<|dz }||kr|S)z.Return n factorial (for integers n >= 0 only).r)getlenMAX_FACTORIAL_CACHE)rmemofkrzMAXs rifacrask  A D A QqS A C q& Q 8DG Q q& Hrc||dz}|j|}|r|St|}||}t}||kr|dz }||z}||kr|||<||kr|S)z4Return n!! (double factorial), integers n >= 0 only.rr)rmaxr)r memo_pairrrrrzrs rifac2rpst QqS>D  A D A QA C a% Q Q 8DG a% Hrc>ttj|Sr?)r5r factorialr,s rrrsS*+rc|dz}tt|}ddg|ddtdt|dzdzD]"}||s t|dz||D]}d||< $|Dcgc]}|s| c}Scc}w)Nrrrrg)listrr5)rsieveijrzs r list_primesrs AA OEAE"1I As1c6{1} % 8AqD!Q' a  "!A "" "s %A4-A4cjtj|dzDcgc] }t|c}Scc}w)Nr)rprimesr5)r_s rrrs' $ AaC 011A111s0)rqr %)+/ctdzsdk(SdkrtvStD] }|zr ydz tz fd}dkrddg}ndkrgd }nt}|D] }||r yy ) a& Determines whether n is a prime number. A probabilistic test is performed if n is very large. No special trick is used for detecting perfect powers. >>> sum(list_primes(100000)) 454396537 >>> sum(n*isprime(n) for n in range(100000)) 454396537 rrriFcvt|}|dk(s|k(rytdD]}|dzz}|k(syy)NrTrF)powr)rrrmdrrss rtestzisprime..testsQ !AJ 6Q!V! A1qAAv rirqlHe%Z )rrqrrrrrT)r5small_odd_primes_setsmall_odd_primestrailing)rrzr witnessesrrrrs` @@@risprimers AA q5Av 2v((( 1u !A A QA 7{qE _ & $ Aw rctt|}|dkr|Sg}td|dzD]8|zr |dzzsytfd|Dr(|j :dt |zS)z Evaluates the Moebius function which is `mu(n) = (-1)^k` if `n` is a product of `k` distinct primes and `mu(n) = 0` otherwise. TODO: speed up using factorization rrrc3(K|] }|z ywr?r).0rrzs r zmoebius..s.q1u.sr)absr5rsumrNr)rfactorsrzs @rmoebiusrs| CF A1uG Aqs^"A1H.g..q! " W rc<d}|D]}|r|s|||z}}|r |}|S)Nrr)argsrrs rgcdrs< A  !a%1A  Hric|dzrtS|j|}|r|St}|}dDcgc] }t|}}t d|dzD]}t |dzddD]"}|dz ||z|dz||dzzz||dz<$|j dd}t |dzddD]'} ||| dzz }||ksd|dzz|d|zzz||<)||k(sd|dzz|zd|zzcSycc}w)a Computes the Euler numbers `E(n)`, which can be defined as coefficients of the Taylor expansion of `1/cosh x`: .. math :: \frac{1}{\cosh x} = \sum_{n=0}^\infty \frac{E_n}{n!} x^n Example:: >>> [int(eulernum(n)) for n in range(11)] [1, 0, -1, 0, 5, 0, -61, 0, 1385, 0, -50521] >>> [int(eulernum(n)) for n in range(11)] # test cache [1, 0, -1, 0, 5, 0, -61, 0, 1385, 0, -50521] r)rrrrrrrrrN)r rMAX_EULER_CACHEr rangerN) rrrrrrrrsumars reulernumrs5$ 1u 1 A C A&'AQ'A'Aqsm /qsB# /Ac1Q4Z1Q3!A#,.AacF /  qsB# :A AacFNDCx AqD\DAqDL9q  : 61a4L$&!Q$. . / (sC0c4|dks|dkrt||k\rt||k(S|dkrtStg|dzz}t|d<t d|dzD]5}t t ||ddD]}|dz ||z||dz z||<7d||zz||zS)z, Stirling number of the first kind. rrrr) ValueErrorr r r rru)rrrrrs r stirling1r%s 1uAAv16{1u  acA AaD Aqs^)Aq 1b) )AaC1Q4rsX LLLs q6A&'SA!H%5N1a4>QqS>"60   f __F __F ( ft||~    c #1!Q$ #' fHH ''MHHHH fT2H$): .ahqk . %d ,18A; ,- 3 Y Ai,!I, fGG C C C C  4.*`(   ft||~+/::5 5j5..+/994 4j5,,  G%=>?K?*u(G$K"J EG 2  1!u~  f 88D  +D >>D# f2<+,*X& J'{$/L"{ $J/ ,s, I( I-)I2