python连续质数计算代码分析,素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)...
因为文中存在公式,只能用图片方式上传了!
以下为C语言源代码:
#include typedef long long unsigned LLU;
typedef int BOOL;
#define TRUE 1
#define FALSE 0
BOOL isPrime(LLU n) { //这是传统的方法,用于与Miller-Rabin算法的结果进行对比。
if( (n&1)==0 || n%5==0)
return FALSE;
LLU i,bnd;
bnd=sqrt(n);
for(i=2; i<=bnd; i++)
if(n%i==0)
return FALSE;
return TRUE;
}
//实现(a*b)%c,用类似快速幂的方式实现。
//将模运算下的乘法用加法实现的思想是时间换空间。
//这可以作为典型的时间换空间的例子。
LLU quickMult(LLU a,LLU b,LLU c){
LLU result=0;
while(b>0) {
if(b&1)
result=(result+a)%c;
a=(a+a)%c;
b>>=1;
}
return result;
}
//请注意,计算快速幂时,因为变量的数据类型为long long,是64bits长度的整数。
//a的值不能大于(2的32次方-1)≈4000000000
//否则,计算a*a时会越界,超过64bits整数的表示范围。
//例如a,b,c分别为:7087881096594 10000000000036 10000000000037时,
//正确结果 (a^b)%c=1,但是,在此计算的结果不为1。
//因此,可以改进为用“快速乘”代替*乘法运算符,能更加充分第利用64的long long unsigned型的存储空间。
//这个例子可以作为算法改进从O(n)到O(lg(n))的进步的例子。
LLU quickPower(LLU a,LLU b,LLU c) {
LLU result=1;
while(b>0) {
if(b&1)
//result=result*a%c; //此为直接乘法
result=quickMult(result,a,c);
//a=a*a%c; //此为直接乘法
a=quickMult(a,a,c);
b>>=1;
}
return result;
}
//如果返回值为TRUE表示n为素数,返回值为FALSE表示n为合数。
BOOL MillerRabinPrimeTest(LLU n) {
LLU d,x,newX,a=1;
int i;
for (i=0; i<4; i++)
a*=rand();
a=a%(n-3)+2;//随机第选取一个a∈[2,n-2]
//printf("随机选取的a=%lld\n",a);
int s=0;//s为d中的因子2的幂次数。
d=n-1; //d取初值n-1
while( (d&1)==0) {//将d中因子2全部提取出来。
s++;
d>>=1;
}
x=quickPower(a,d,n);
for(i=0; inewX=quickPower(x,2,n);
if(newX==1 && x!=1 && x!=n-1)
return FALSE; //用二次定理的逆否命题,此时n确定为合数。
x=newX;
}
if(x!=1)
return FALSE; //用费马小定理的逆否命题判断,此时x=a^(n-1) (mod n),那么n确定为合数。
return TRUE; //用费马小定理的逆命题判断。能经受住考验至此的数,大概率为素数。
}
//经过连续特定次数的Miller-Rabin测试后,
//如果返回值为TRUE表示n为素数,返回值为FALSE表示n为合数。
BOOL isPrimeByMR(LLU n) {
if((n&1)==0 || n%5==0)
return FALSE;
int i;
for (i=0; i<100; i++)
if(MillerRabinPrimeTest(n)==FALSE)
return FALSE;
return TRUE;
}
//对比传统方法和Miller-Rabin算法的结果
void check(LLU n) {
char isRight;
BOOL resultA,resultB;
resultA=isPrime(n);
resultB=isPrimeByMR(n);
if(resultA==resultB) {
isRight='V';
printf("%c,%llu %d %d\n",isRight,n,resultA,resultB);
} else {
isRight='X';
printf("%c,%llu %d %d\n",isRight,n,resultA,resultB);
}
}
//测试任务:在本人笔记本电脑上测试,N=10的18次方至N+10之间的质数为:
//1000000000000000003
//1000000000000000009
//Miller-Rabin算法的速度:0.22秒
//常规算法:22秒
int main() {
srand(time(NULL));
LLU i,n,N;
N=1000000000000000000;
BOOL result;
for(i=N; in=i;
//check(n);
//result=isPrime(n);
result=isPrimeByMR(n);
if(result==TRUE)
printf("%llu\n",n);
}
return 0;
}
以下为Python语言源代码:
import math
import random
def isPrime(n): #这是传统的方法,用于与Miller-Rabin算法的结果进行对比。
if (n & 1) == 0 or n % 5 == 0:
return False
bnd = int(math.sqrt(n))
for i in range(2, bnd + 1):
if n % i == 0:
return False
return True
# 实现(a*b)%c,用类似快速幂的方式实现。
# 将模运算下的乘法用加法实现的思想是时间换空间。
# 这可以作为典型的时间换空间的例子。
def quickMult(a, b, c):
result = 0
while b > 0:
if b & 1:
result = (result + a) % c
a = (a + a) % c
b >>= 1
return result
#因为Python支持大整数运算,所以在此也可以不用快速乘法,而直接使用乘法*。
def quickPower(a, b, c):
result = 1
while b > 0:
if (b & 1):
# result=result*a%c #此为直接乘法
result = quickMult(result, a, c)
# a=a*a%c #此为直接乘法
a = quickMult(a, a, c)
b >>= 1
return result
#如果返回值为TRUE表示n为素数,返回值为FALSE表示n为合数。
def MillerRabinPrimeTest(n):
a = random.randint(2,n-2) #随机第选取一个a∈[2,n-2]
# print("随机选取的a=%lld\n"%a)
s = 0 #s为d中的因子2的幂次数。
d = n - 1
while (d & 1) == 0: #将d中因子2全部提取出来。
s += 1
d >>= 1
x = quickPower(a, d, n)
for i in range(s): #进行s次二次探测
newX = quickPower(x, 2, n)
if newX == 1 and x != 1 and x != n - 1:
return False #用二次定理的逆否命题,此时n确定为合数。
x = newX
if x != 1: # 用费马小定理的逆否命题判断,此时x=a^(n-1) (mod n),那么n确定为合数。
return False
return True # 用费马小定理的逆命题判断。能经受住考验至此的数,大概率为素数。
# 经过连续特定次数的Miller-Rabin测试后,
# 如果返回值为TRUE表示n为素数,返回值为FALSE表示n为合数。
def isPrimeByMR(n):
if ((n & 1) == 0 or n % 5 == 0):
return False
for i in range(100):
if MillerRabinPrimeTest(n) == False:
return False
return True
#对比传统方法和Miller-Rabin算法的结果
def check(n):
resultA = isPrime(n)
resultB = isPrimeByMR(n)
if resultA == resultB:
isRight = 'V'
print("%c,%u %d %d" % (isRight, n, resultA, resultB))
else:
isRight = 'X'
print("%c,%u %d %d" % (isRight, n, resultA, resultB))
# 测试任务:在本人笔记本电脑上测试,N=10的18次方至N+10之间的质数为:
# 1000000000000000003
# 1000000000000000009
# Miller-Rabin算法的速度:0.22秒
# 常规算法:22秒
# python的常规算法,耗时更长。
def main():
# freopen("result.txt","w",stdout)
random.seed()
# res=quickPower(2,10,7)
# print("%u"%res)
N = 1000000000000000000
for i in range(N, N + 10):
n = i
#check(n)
# n=int(input())
#result=isPrime(n)
result = isPrimeByMR(n)
if result == True :
print("%u" % n)
return 0
# print(isPrime(1000000000000000003))
# a, b, c = [int(e) for e in input().split(" ")]
# print(quickPower(a,b,c))
# # 7087881096594 10000000000036 10000000000037 =1
main()
python连续质数计算代码分析,素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)...相关推荐
- python连续质数计算_GitHub - xxqfft/AlgorithmsByPython: 算法/数据结构/Python/剑指offer/机器学习/leetcode...
尝试用Python实现一些简单的算法和数据结构 之前的算法和数据结构基本都是用Swift写的,现在尝试用Python实现一些简单的算法和数据结构. update 20160704 准备加入<剑指 ...
- 米勒罗宾素性测试(Miller–Rabin primality test)
1 #include<iostream> //该程序为哥德巴赫猜(想输出所有的组合) 2 #include<cmath> 3 #include<cstdlib> 4 ...
- python随机密码生成以整数17为随机数种子_python习题 随机密码生成 + 连续质数计算...
随机密码生成 描述 补充编程模板中代码,完成如下功能: ...
- python试题中连续质数计算,官方答案看不懂,就自己写了个,请大神过目!
连续质数计算 描述 补充编程模板中代码,完成如下功能: ...
- S3C6410开发板adc驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板adc驱动代码的实现过程进行分析,然后通过一个实例对adc功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 adc的设备驱动主要 ...
- S3C6410开发板LED驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...
- python历史性分布计算代码_量化交易中,如何使用Python计算「筹码分布」指标【附代码】 [量化小讲堂-64]...
引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总] 请点击此处 这是邢不行第 64 ...
- S3C6410开发板按键驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 按键的设备驱动主要实现了 ...
- python两数相加代码_一边学编程,一边学语数外,用python编程全排列10以内两数加法...
原标题:一边学编程,一边学语数外,用python编程全排列10以内两数加法 编程并不神秘 编程只是解决问题的一共方法 python是一门编程语言 python是一种解决问题的编程工具 在小学阶段,学习 ...
最新文章
- python 代理使用方法简介
- vb编程的好帮手--资源文件
- 在zabbix web上进行监控主机配置
- Oracle常见错误
- 深度学习——模型的压缩和加速
- php svn客户端
- 4大华为云“安全镖局”秘密法宝揭秘
- python中common在哪个模块导入_python的常用模块之collections模块详解
- 读书笔记_量化交易如何建立自己的算法交易01
- c语言单片机题目设计大全,单片机课程设计要求及参考题目
- c语言开发unity,[Unity3D]U3D开发项目总结
- 彻底搞懂SSD网络结构
- 卡西欧科学计算机使用方法,科学计算器的使用方法
- 前端灰度发布 你知多少?
- python中如何进行类的派生与继承_python 面向对象之继承与派生
- 【学习OpenCV4】分水岭算法详解
- 人工智能与智能的异同
- 均值场博弈_平均场博弈论(Mean-field Games)简介
- 谭浩强《C语言程序设计 》习题 6-3
- AI代码实时生成工具teleportHQ
热门文章
- mysql游标是什么特性_[转]MySQL游标特性
- python安装在什么地方_python模块安装目录在哪里
- 安卓手机管理器_神器推荐,安卓手机拯救者来了!!!
- mysql 更新并查询结果_数据库_基础知识_MySQL_UpdateSelect(根据查询出来的结果批量更新)...
- AHS of FCGRC 停课 Day 3
- ecshop商品属性价不打折
- 前端工程师---软必备
- codeforces 431 B Shower Line【暴力】
- 擠出機步進馬達的 Steps per Unit 該如何計算?
- [原创]如何写好SqlHelper 之终章