数论基础算法总结(python版)
/*
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
以上作为半个学期来数论学习的一个小结,也许以后难以再系统的学习数论了。略伤感咿
—— 多谢信息安全数学基础的老师
数论基础算法总结(python版)的更多相关文章
- 字符串匹配算法之 kmp算法 (python版)
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...
- 二分查找算法(Python版)
[本文出自天外归云的博客园] 记性不好(@.@),所以平时根本用不到的东西就算学过如果让我去想也会需要很多时间(*.*)! 二分查找算法 在一个有序数组中查找元素最快的算法,也就是折半查找法,先找一个 ...
- 数据结构与算法(python版)
ADT抽象数据类型(ADT:Abstract Data Type):ADT是对数据进行处理的一种逻辑描述,并不涉及如何实现这些处理. 同一ADT可以采用不同的数据结构来实现:1.采用程序设计语言的控制 ...
- 数据结构与算法(python版)教程
算法的性质 算法的描述 算法的设计与分析
- 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS
LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
- Python基础教程(第2版 修订版) pdf
Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识11.1安装Python11.1.1Windows11.1.2Linux和UNIX31.1.3苹果机(Macintosh)41. ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
随机推荐
- IOS自动化定位方式
原文地址http://blog.csdn.net/wuyepiaoxue789/article/details/77885136 元素属性的介绍 type:元素类型,与className作用一致,如: ...
- 以二进制方式读取图片保存到string
procedure TForm1.BitBtn1Click(Sender: TObject);var StringStream : TStringStream; FSize : integer; ...
- Linux系统——日志文件
日志文件的分类 (1)内核及系统日志 由系统服务rsyslog管理,根据去主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置. /etc/rsyslog ...
- HDU 1950 Bridging signals(LIS)
最长上升子序列(LIS)的典型变形,O(n^2)的动归会超时.LIS问题可以优化为nlogn的算法. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则记录最小的那个最末元 ...
- SqoopFlume、Flume、HDFS之间比较
Sqoop Flume HDFS Sqoop用于从结构化数据源,例如,RDBMS导入数据 Flume 用于移动批量流数据到HDFS HDFS使用 Hadoop 生态系统存储数据的分布式文件系统 Sqo ...
- 学习Android开发看那些书好?
学习一样新事物或许有多种方式,报培训班,看视频,向高手请教等等,但一本好书往往可以让你少走很多弯路,事半功倍. 下面推荐几本个人觉得搞Android开发值得一读的书籍. Head First Java ...
- AtCoder Regular Contest 080 C - 4-adjacent
地址:http://arc080.contest.atcoder.jp/tasks/arc080_a 题目: C - 4-adjacent Time limit : 2sec / Memory lim ...
- Ubuntu 14.04.5 imx6 开发环境搭建
1,下载VMware Workstation虚拟机 地址:http://1.xp510.com:801/xp2011/VMware10.7z 2,下载Ubuntu 14.04.5 LTS 32位Ubu ...
- 【Thinking in Java, 4e】控制流程执行
p46~p75: [迭代] 1.Java不允许将数字作为布尔值用. 1.有点意思的小程序WhileTest. public class WhileTest { static boolean condi ...
- Linux学习笔记之CentOS6.9 防火墙的关闭以及开启
有的时候,我们需要对系统的防火墙进行操作,今天小编就给大家讲解一下如何开启以及关闭CentOS6.9系统下的防火墙. 输入:cat /etc/issue 查看版本 (一)通过service命令 s ...