/*
Author: wsnpyo
Update Date: 2014-11-16
Algorithm: 快速幂/Fermat, Solovay_Stassen, Miller-Rabin素性检验/Exgcd非递归版/中国剩余定理
*/
import random def QuickPower(a, n, p): # 快速幂算法
tmp = a
ret = 1
while(n > 0):
if (n&1):
ret = (ret * tmp) % p
tmp = (tmp * tmp) % p
n>>=1
return ret def Jacobi(n, m): # calc Jacobi(n/m)
n = n%m
if n == 0:
return 0
Jacobi2 = 1
if not (n&1): # 若有n为偶数, 计算Jacobi2 = Jacobi(2/m)^(s) 其中n = 2^s*t t为奇数
k = (-1)**(((m**2-1)//8)&1)
while not (n&1):
Jacobi2 *= k
n >>= 1
if n == 1:
return Jacobi2
return Jacobi2 * (-1)**(((m-1)//2*(n-1)//2)&1) * Jacobi(m%n, n) def Exgcd(r0, r1): # calc ax+by = gcd(a, b) return x
x0, y0 = 1, 0
x1, y1 = 0, 1
x, y = r0, r1
r = r0 % r1
q = r0 // r1
while r:
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 // r1
return x def Fermat(x, T): # Fermat素性判定
if x < 2:
return False
if x <= 3:
return True
if x%2 == 0 or x%3 == 0:
return False
for i in range(T):
ran = random.randint(2, x-2) # 随机取[2, x-2]的一个整数
if QuickPower(ran, x-1, x) != 1:
return False
return True def Solovay_Stassen(x, T): # Solovay_Stassen素性判定
if x < 2:
return False
if x <= 3:
return True
if x%2 == 0 or x%3 == 0:
return False
for i in range(T): # 随机选择T个整数
ran = random.randint(2, x-2)
r = QuickPower(ran, (x-1)//2, x)
if r != 1 and r != x-1:
return False
if r == x-1:
r = -1
if r != Jacobi(ran, x):
return False
return True def MillerRabin(x, ran): # x-1 = 2^s*t
tx = x-1
s2 = tx&(~tx+1) # 取出最后一位以1开头的二进制 即2^s
r = QuickPower(ran, tx//s2, x)
if r == 1 or r == tx:
return True
while s2>1: # 从2^s -> 2^1 循环s次
r = (r*r)%x
if r == 1:
return False
if r == tx:
return True
s2 >>= 1
return False def MillerRabin_init(x, T): #Miller-Rabin素性判定
if x < 2:
return False
if x <= 3:
return True
if x%2 == 0 or x%3 == 0:
return False
for i in range(T): # 随机选择T个整数
ran = random.randint(2, x-2)
if not MillerRabin(x, ran):
return False
return True def CRT(b, m, n): # calc x = b[] % m[]
M = 1
for i in range(n):
M *= m[i]
ans = 0
for i in range(n):
ans += b[i] * M // m[i] * Exgcd(M//m[i], m[i])
return ans%M

以上作为半个学期来数论学习的一个小结,也许以后难以再系统的学习数论了。略伤感咿

  —— 多谢信息安全数学基础的老师

最新文章

  1. 通过进程检测服务时脚本文件名不要起要检测的服务名字命名 shell程序从上到下执行若定义函数或引用系统函数需先定义 kill -USR2
  2. vim: 自己定义颜色主题(colorscheme)
  3. 关于32位程序在Win7&amp;64位系统中连接Microsoft Excel数据源的问题
  4. 浅谈 qmake 之 shadow build(将源码路径和构建路径分开,一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰)
  5. 【POJ】2492 A bug&#39;s life ——种类并查集
  6. 用VC实现竖写汉字的方法
  7. hdu2059 龟兔赛跑 DP
  8. 你的变量究竟存储在什么地方 &amp;&amp; 全局内存
  9. CentOS 7 FTP环境部署
  10. RN截图并且下载问题
  11. POI导入demo
  12. hive -help hive命令行执行sql参数
  13. 在global.asax中启动定时任务
  14. 模拟windows全盘搜索
  15. 学会清理.rncache 文件、清理已经安装的三方文件,三方引入文件
  16. XXE漏洞初窥
  17. android之layer-list
  18. Hadoop1.x安装配置文件及参数说明
  19. 牛客练习赛26:D-xor序列(线性基)
  20. 【Python】setup-转载

热门文章

  1. ModelForm组件
  2. 20145316《Java程序设计》第9周学习总结
  3. Axure的总结
  4. 关于URL和http协议,http消息格式
  5. Jquery13 Ajax 进阶
  6. centos7下使用yum安装mysql数据库
  7. Ubuntu16.04 + Digits + caffee
  8. sickit-learn库实现机器学习
  9. Java 1.7 ThreadPoolExecutor源码解析
  10. Yii框架(一)