因为文中存在公式,只能用图片方式上传了!

以下为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实现)...相关推荐

  1. python连续质数计算_GitHub - xxqfft/AlgorithmsByPython: 算法/数据结构/Python/剑指offer/机器学习/leetcode...

    尝试用Python实现一些简单的算法和数据结构 之前的算法和数据结构基本都是用Swift写的,现在尝试用Python实现一些简单的算法和数据结构. update 20160704 准备加入<剑指 ...

  2. 米勒罗宾素性测试(Miller–Rabin primality test)

    1 #include<iostream> //该程序为哥德巴赫猜(想输出所有的组合) 2 #include<cmath> 3 #include<cstdlib> 4 ...

  3. python随机密码生成以整数17为随机数种子_python习题 随机密码生成 + 连续质数计算...

    随机密码生成 描述 补充编程模板中代码,完成如下功能:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪ ...

  4. python试题中连续质数计算,官方答案看不懂,就自己写了个,请大神过目!

    连续质数计算 描述 补充编程模板中代码,完成如下功能:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪ ...

  5. S3C6410开发板adc驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板adc驱动代码的实现过程进行分析,然后通过一个实例对adc功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 adc的设备驱动主要 ...

  6. S3C6410开发板LED驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...

  7. python历史性分布计算代码_量化交易中,如何使用Python计算「筹码分布」指标【附代码】 [量化小讲堂-64]...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总] 请点击此处 这是邢不行第  64 ...

  8. S3C6410开发板按键驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 按键的设备驱动主要实现了 ...

  9. python两数相加代码_一边学编程,一边学语数外,用python编程全排列10以内两数加法...

    原标题:一边学编程,一边学语数外,用python编程全排列10以内两数加法 编程并不神秘 编程只是解决问题的一共方法 python是一门编程语言 python是一种解决问题的编程工具 在小学阶段,学习 ...

最新文章

  1. python 代理使用方法简介
  2. vb编程的好帮手--资源文件
  3. 在zabbix web上进行监控主机配置
  4. Oracle常见错误
  5. 深度学习——模型的压缩和加速
  6. php svn客户端
  7. 4大华为云“安全镖局”秘密法宝揭秘
  8. python中common在哪个模块导入_python的常用模块之collections模块详解
  9. 读书笔记_量化交易如何建立自己的算法交易01
  10. c语言单片机题目设计大全,单片机课程设计要求及参考题目
  11. c语言开发unity,[Unity3D]U3D开发项目总结
  12. 彻底搞懂SSD网络结构
  13. 卡西欧科学计算机使用方法,科学计算器的使用方法
  14. 前端灰度发布 你知多少?
  15. python中如何进行类的派生与继承_python 面向对象之继承与派生
  16. 【学习OpenCV4】分水岭算法详解
  17. 人工智能与智能的异同
  18. 均值场博弈_平均场博弈论(Mean-field Games)简介
  19. 谭浩强《C语言程序设计 》习题 6-3
  20. AI代码实时生成工具teleportHQ

热门文章

  1. mysql游标是什么特性_[转]MySQL游标特性
  2. python安装在什么地方_python模块安装目录在哪里
  3. 安卓手机管理器_神器推荐,安卓手机拯救者来了!!!
  4. mysql 更新并查询结果_数据库_基础知识_MySQL_UpdateSelect(根据查询出来的结果批量更新)...
  5. AHS of FCGRC 停课 Day 3
  6. ecshop商品属性价不打折
  7. 前端工程师---软必备
  8. codeforces 431 B Shower Line【暴力】
  9. 擠出機步進馬達的 Steps per Unit 該如何計算?
  10. [原创]如何写好SqlHelper 之终章