Miller-Rabin素数测试应用于生日的素数检验

做题时经常看到结果要对10e9+7或者他的孪生素数10e9+9取余,上网搜了一下,发现这么做有三个原因:

  1. 1000000007是一个质数(素数),对质数取余能最大程度避免冲突
  2. int32位的最大值为2147483647,所以int32足够大
  3. int64位的最大值为2^63-1,1000000007的平方不会在int64中溢出
    ——来自 柳婼 の blog

看评论时有人提到经常用妹子的生日做这一素数,因此产生了计算一下可能的生日为素数的情况的想法。
由于数据量过大,暴力求解显然不能成立,于是,在有没有dalao生日是质数。给蒟蒻%一下。。里看到了Miller-Rabin测试的方法,结合素数与素性测试(Miller-Rabin测试)提供的教程,得出便捷算法如下:
首先,了解理论基础,即Fermat小定理:

如果p是素数,a是小于p的正整数,那么a^(p-1) mod p = 1

证明如下:

首先证明:如果p是一个素数的话,那么对任意一个小于p的正整数a,有:a, 2a, 3a, …, (p-1)a除以p的余数正好是一个1到p-1的排列。
例如,5是素数,3, 6, 9, 12除以5的余数分别为3, 1, 4, 2,正好就是1到4这四个数。
这里使用反证法,假如结论不成立的话,那么就是说有两个小于p的正整数m和n使得na和ma除以p的余数相同。不妨假设n>m,则p可以整除a(n-m)。但p是素数,那么a和n-m中至少有一个含有因子p。这显然是不可能的,因为a和n-m都比p小。
用同余式表述,我们证明了:
(p-1)! ≡ a * 2a * 3a * … * (p-1)a (mod p)
也即:
(p-1)! ≡ (p-1)! * a^(p-1) (mod p)
利用同余式的性质,两边同时除以(p-1)!(是p的互素数),就得到了最终结论:
1 ≡ a^(p-1) (mod p)

这里我们尝试使用它的逆命题,即:

不满足a^(n-1) mod n = 1的n一定不是素数;如果满足的话则一定是素数

这个命题的前半句是对的,但是因为存在伪素数,后半句被证伪,现在公认的真命题是

不满足a^(n-1) mod n = 1的n一定不是素数;如果满足的话则很大可能是素数

这时Miller-Rabin素性测试算法被提出了。 他基于有限域上的平方根定理:

如果p是素数,x是小于p的正整数,且x^2 mod p = 1,那么解只有两个:x=1,x=-1(等价于x=p-1)。
这是显然的,因为x^2 mod p =1相当于p能整除x^2-1,也即p能整除(x+1)(x-1)。由于p是素数,那么只可能是x-1能被p整除(此时x=1)或x+1能被p整除(此时
x=p-1)。

这里使用Miller-Rabin素性测试算法详解提供的思想在这里插入图片描述
python生成一组1024与512位数的大素数对提供的算法:

def day_of_mouth(year, mouth):
    if mouth in [1, 3, 5, 7, 8, 10, 12]:
        return 31
    elif mouth in [4, 6, 9, 11]:
        return 30
    elif mouth == 2:
        if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
            return (29)
        else:
            return (28)
    else:
        raise

def gene_birthday(year):
    mouths = [str(i) for i in range(1, 13)]
    ori_days = [str(i) for i in range(1, 32)]
    for li in [mouths, ori_days]:
        for i in range(len(li)):
            if len(li[i]) < 2:
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值