Fermat素性检测算法及python实现

Fermat素性检测算法及python实现

目录

    • Fermat素性检测算法及python实现
    • 实验目的
      • 完整代码
    • 方案设计
    • 方案实现
      • 流程图
      • 函数介绍以及代码实现
    • 数据分析与测试
    • 总结


实验目的

1. 实现快速模指数的算法
2. 实现求最大公因数算法
3. 学会调用内置函数库实现生成随机数
4. 实现素性检测算法


完整代码

环境:python 3.0

import random
import math

def quick_mod(a,b,c):
    #定义实现快速模指数运算函数
    fx = 1
    while b > 0:
        if (b & 1) == 1:
            fx = (fx * a) % c
        a = (a * a) % c
        b = b >> 1
    return fx

f = open("5.txt","r")
n = int(f.read())
k = int(input("请输入安全参数k: "))
i = 1

while i <= k:
    d = random.randint(2,n-2)
    #生成随机数d
    print("k="+str(i)+"时,生成的随机数为"+str(d),end=",")
    h = math.gcd(d,n)
    #计算(d,n)
    f = quick_mod(d,n-1,n)
    #计算d^(n-1)mod n]
    if h != 1:
        print("(%d,%d)=%d,该数为合数" %(d,n,h))
        break
    elif(f != 1):
        print("%d**%d(mod %d)=%d,该数为合数" %(d,n-1,n,f))
        break
    else:
       print("n="+str(n)+"可能为素数")
       i += 1
if(i == k+1):
       print("因此,该数可能为素数,且概率为"+str((1-1/(2**k))*100)+"%")

方案设计

  • 背景:Fermat素性检测算法基于费马小定理提出

  • 原理:
    1.给定素数n,d∈Z,则有n(d-1)≡1(mod d);
    2.奇整数n,若任取一整数2≤d≤m-2,(d,n)= 1,使得n(d-1)≡1 (mod d),则n至少有1/2的概率为素数。

  • 算法步骤:
    给定奇整数n≥3和安全参数k
    (1) 随机选取整数d,2≤d≤n-2
    (2) 计算h=(d,n),如果h=1,转(3);否则跳出,m为合数
    (3) 计算f=d^(n-1)(mod n),如果f=1,m可能是素数,转(1);否则跳出,m为合数
    (4) 重复上述过程k次,如果每次得到n可能为素数,则n为素数的概率为
    1-1/2^k


方案实现

流程图

Fermat素性检测算法及python实现_第1张图片

函数介绍以及代码实现

  • quick_mod(a,b,c):实现快速模指数运算,其中,a为底数,b为指数,c为模数
//quick_mod(a,b,c)
def quick_mod(a,b,c):
    #定义实现快速模指数运算函数
    fx = 1
    while b > 0:
        if (b & 1) == 1:
            fx = (fx * a) % c
        a = (a * a) % c
        b = b >> 1
    return fx
  • random.randint(2,n-2):调用python内置函数库random,随机生成2到n-2之间的整数
//random.randint(2,n-2)
import random
  • math.gcd(d,n):调用python内置函数库math,得到d和n的最大公因数
//
def hcf(x, y):
   #定义求取最大公因数的函数
   if x > y:
       s = y
   else:
       s = x
   # 获取最小值
   for i in range(1,s + 1):
       if((x % i == 0) and (y % i == 0)):
           hcf = i
           break
   return hcf

数据分析与测试

Fermat素性检测算法及python实现_第2张图片

总结

1.巧用python内置函数,简化代码,比如gcd求最大公因数函数和random求随机数函数。
2.对大整数的模指数运算不能直接暴力用pow函数,需要利用循环结构迭代运算。
3.random函数的一些注意点:
·random() 方法返回随机生成的一个实数,它在[0,1)范围内。
·random.randint(a,b)产生a到b之间的一个整数型随机数
·random.randrange(a,b,c)产生a到b之间间隔为c的随机整数
·random.random() 产生0到1之间的随机浮点数
·random.choice(‘today’)从序列中随机选取一个元素
4. while循环比for循环运行速度更快
5. break是跳出整个循环,continue则只是跳出本次循环
6. python中print函数默认换行,若不换行,需要在结尾加上end=’’

以上内容仅为作业学习记录。

你可能感兴趣的:(密码学学习记录,笔记,Fermat素性检测算法,算法,python,其他)