1. /*
  2. Author: wsnpyo
  3. Update Date: 2014-11-16
    Algorithm: 快速幂/Fermat, Solovay_Stassen, Miller-Rabin素性检验/Exgcd非递归版/中国剩余定理
  4. */
  5. import random
  6.  
  7. def QuickPower(a, n, p): # 快速幂算法
  8. tmp = a
  9. ret = 1
  10. while(n > 0):
  11. if (n&1):
  12. ret = (ret * tmp) % p
  13. tmp = (tmp * tmp) % p
  14. n>>=1
  15. return ret
  16.  
  17. def Jacobi(n, m): # calc Jacobi(n/m)
  18. n = n%m
  19. if n == 0:
  20. return 0
  21. Jacobi2 = 1
  22. if not (n&1): # 若有n为偶数, 计算Jacobi2 = Jacobi(2/m)^(s) 其中n = 2^s*t t为奇数
  23. k = (-1)**(((m**2-1)//8)&1)
  24. while not (n&1):
  25. Jacobi2 *= k
  26. n >>= 1
  27. if n == 1:
  28. return Jacobi2
  29. return Jacobi2 * (-1)**(((m-1)//2*(n-1)//2)&1) * Jacobi(m%n, n)
  30.  
  31. def Exgcd(r0, r1): # calc ax+by = gcd(a, b) return x
  32. x0, y0 = 1, 0
  33. x1, y1 = 0, 1
  34. x, y = r0, r1
  35. r = r0 % r1
  36. q = r0 // r1
  37. while r:
  38. x, y = x0 - q * x1, y0 - q * y1
  39. x0, y0 = x1, y1
  40. x1, y1 = x, y
  41. r0 = r1
  42. r1 = r
  43. r = r0 % r1
  44. q = r0 // r1
  45. return x
  46.  
  47. def Fermat(x, T): # Fermat素性判定
  48. if x < 2:
  49. return False
  50. if x <= 3:
  51. return True
  52. if x%2 == 0 or x%3 == 0:
  53. return False
  54. for i in range(T):
  55. ran = random.randint(2, x-2) # 随机取[2, x-2]的一个整数
  56. if QuickPower(ran, x-1, x) != 1:
  57. return False
  58. return True
  59.  
  60. def Solovay_Stassen(x, T): # Solovay_Stassen素性判定
  61. if x < 2:
  62. return False
  63. if x <= 3:
  64. return True
  65. if x%2 == 0 or x%3 == 0:
  66. return False
  67. for i in range(T): # 随机选择T个整数
  68. ran = random.randint(2, x-2)
  69. r = QuickPower(ran, (x-1)//2, x)
  70. if r != 1 and r != x-1:
  71. return False
  72. if r == x-1:
  73. r = -1
  74. if r != Jacobi(ran, x):
  75. return False
  76. return True
  77.  
  78. def MillerRabin(x, ran): # x-1 = 2^s*t
  79. tx = x-1
  80. s2 = tx&(~tx+1) # 取出最后一位以1开头的二进制 即2^s
  81. r = QuickPower(ran, tx//s2, x)
  82. if r == 1 or r == tx:
  83. return True
  84. while s2>1: # 从2^s -> 2^1 循环s次
  85. r = (r*r)%x
  86. if r == 1:
  87. return False
  88. if r == tx:
  89. return True
  90. s2 >>= 1
  91. return False
  92.  
  93. def MillerRabin_init(x, T): #Miller-Rabin素性判定
  94. if x < 2:
  95. return False
  96. if x <= 3:
  97. return True
  98. if x%2 == 0 or x%3 == 0:
  99. return False
  100. for i in range(T): # 随机选择T个整数
  101. ran = random.randint(2, x-2)
  102. if not MillerRabin(x, ran):
  103. return False
  104. return True
  105.  
  106. def CRT(b, m, n): # calc x = b[] % m[]
  107. M = 1
  108. for i in range(n):
  109. M *= m[i]
  110. ans = 0
  111. for i in range(n):
  112. ans += b[i] * M // m[i] * Exgcd(M//m[i], m[i])
  113. return ans%M

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

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

数论基础算法总结(python版)的更多相关文章

  1. 字符串匹配算法之 kmp算法 (python版)

    字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...

  2. 二分查找算法(Python版)

    [本文出自天外归云的博客园] 记性不好(@.@),所以平时根本用不到的东西就算学过如果让我去想也会需要很多时间(*.*)! 二分查找算法 在一个有序数组中查找元素最快的算法,也就是折半查找法,先找一个 ...

  3. 数据结构与算法(python版)

    ADT抽象数据类型(ADT:Abstract Data Type):ADT是对数据进行处理的一种逻辑描述,并不涉及如何实现这些处理. 同一ADT可以采用不同的数据结构来实现:1.采用程序设计语言的控制 ...

  4. 数据结构与算法(python版)教程

    算法的性质 算法的描述 算法的设计与分析

  5. 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS

    LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...

  6. 北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  7. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  8. Python基础教程(第2版 修订版) pdf

    Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识11.1安装Python11.1.1Windows11.1.2Linux和UNIX31.1.3苹果机(Macintosh)41. ...

  9. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

随机推荐

  1. iOS学习之HelloWorld工程

    本文应读者要求,主要简介使用Xcode创建一个“HelloWorld”工程. 1.打开Xcode,点击新建工程 选择工程类型 2.填写工程信息 3.代码简介 // // main.m // hello ...

  2. docker——安装

    Docker划分为CE和EE.CE即社区版(免费,支持后期三个月),EE即企业版,强调安全,付费使用. #安装依赖包 yum install -y yum-utils device-mapper-pe ...

  3. Druid学习之路 (三)Druid的数据源和段

    作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9703204.html 转载请注明出处 Druid的数据源和分段 Druid的数据存储在"Da ...

  4. mysql外键约束无法删除数据的情况解决办法

    先删除子表的数据,然后再删除主表的数据.

  5. vue下载文件

    import fileDownload from 'js-file-download' let params = { ", ", "filename":&quo ...

  6. C/C++结构体语法总结

    转自:http://blog.csdn.net/dawn_after_dark/article/details/73555562 结构体简介 结构体属于聚合数据类型的一类,它将不同的数据类型整合在一起 ...

  7. Android Camera API ISO Setting

    https://stackoverflow.com/questions/2978095/android-camera-api-iso-setting exif this.mCameraParamete ...

  8. 20145303《Java程序设计》实验三实验报告

    20145303<Java程序设计>实验三实验报告 ssh公钥配置及git安装: eclipse中git配置: 队友链接: http://www.cnblogs.com/5321z/p/5 ...

  9. shell内置命令eval的具有什么作用

    答:把变量中的内容当成命令来执行

  10. ETL增量处理总结

    1 LOG表 1.1 思路 用log表记录业务库某表yw_tableA发生变化数据的主键.数据进入BI库目标表bi_tableA前,先根据log表记录的主键进行delete. 1.2 设计 1.2.1 ...