/*author:wsnpyo Update Date:2014-11-16
Algorithm: Fast power/fermat, Solovay_stassen, miller-rabin primality test/EXGCD non-recursive version/Chinese remainder theorem */ImportRandomdefQuickpower (A, N, p):#Fast Power AlgorithmTMP =a ret= 1 while(N >0):if(n&1): Ret= (RET * tmp)%P tmp= (TMP * tmp)%P N>>=1returnretdefJacobi (N, m):#Calc Jacobi (n/m)n = n%mifn = =0:return0 Jacobi2= 1if not(n&1):#if n is an even number, calculate JACOBI2 = Jacobi (2/m) ^ (s) where n = 2^s*t T is oddK = ( -1) * * (((m**2-1)//8) &1) while not(n&1): Jacobi2*=k N>>= 1ifn = = 1: returnJacobi2returnJACOBI2 * ( -1) * * (((m-1)//2* (n-1)//2) * &1 (JacobiN, N)defEXGCD (R0, R1):#Calc Ax+by = gcd (A, B) return xx0, y0 = 1, 0 x1, y1= 0, 1x, y=R0, R1 R= r0%R1 Q= R0//R1 whiler:x, y= X0-q * x1, Y0-q *y1 x0, y0=x1, y1 x1, y1=x, y r0=R1 R1=R R= r0%R1 Q= R0//R1returnxdefFermat (x, T):#Fermat primality judgment ifX < 2: returnFalseifX <= 3: returnTrueifx%2 = = 0orx%3 = =0:returnFalse forIinchRange (T): Ran= Random.randint (2, X-2)#randomly take an integer [2, X-2] ifQuickpower (ran, x-1, x)! = 1: returnFalsereturnTruedefSolovay_stassen (x, T):#Solovay_stassen primality judgment ifX < 2: returnFalseifX <= 3: returnTrueifx%2 = = 0orx%3 = =0:returnFalse forIinchRange (T):#random selection of t integersRan = Random.randint (2, X-2) R= Quickpower (ran, (x-1)//2, X)ifR! = 1 andr! = X-1: returnFalseifr = = X-1: R=-1ifr! =Jacobi (ran, x):returnFalsereturnTruedefMillerrabin (x, ran):#x-1 = 2^s*ttx = X-1S2= tx& (~tx+1)#remove the last binary that starts with 1, which is 2^sR = Quickpower (ran, tx//s2, x)ifr = = 1orr = =TX:returnTrue whileS2>1:#from 2^s to 2^1 cycle s timesR = (r*r)%xifr = = 1: returnFalseifr = =TX:returnTrue S2>>= 1returnFalsedefMillerrabin_init (x, T):#Miller-rabin primality judgment ifX < 2: returnFalseifX <= 3: returnTrueifx%2 = = 0orx%3 = =0:returnFalse forIinchRange (T):#random selection of t integersRan = Random.randint (2, X-2) if notMillerrabin (x, ran):returnFalsereturnTruedefCRT (b, M, N):#Calc x = b[]% m[]M = 1 forIinchrange (N): M*=M[i] ans=0 forIinchrange (n): ans+ = b[i] * M//m[i] * EXGCD (m//M[i], m[i])returnAns%m
The above as a half semester to learn number theory a summary, perhaps later difficult to learn the system of number theory. Slightly sad Eedle
--thanks to the teacher of Information Security Mathematics Foundation
Number theory algorithm--Summary of basic algorithm of information security Mathematics (Python version)