程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在 sagemath 中生成具有模数条件的随机素数

发布于2023-05-30 00:08     阅读(680)     评论(0)     点赞(27)     收藏(0)


我想知道在 sagemath 中是否有一种干净的方法来生成具有特定模数条件的随机素数?对于模数条件,我的意思是,例如,我可能想要生成一个随机素数 $1 \pmod{12}$ 或 $3 \pmod{4}$。

当然有random_prime,但我在文档中看不到任何允许您指定模数条件的内容。有一种蛮力替代方法,您可以在其中列出满足模数条件的所需边界之间的所有数字,检查它们是否为素数,然后将所有素数放入列表中并使用 python 函数选择列表中的一个元素随机的,但我认为也许有更优雅的方法。


解决方案


看看 sage 使用的代码很有趣random_prime它本质上是这样的:

def random_prime(lowerbound, upperbound):
    # some input validation that I ignore
    while True:
        p = randint(lowerbound, upperbound)
        if is_prime(p):
            return p

尝试所有数字然后检查素数的原因之一是 sage 希望对范围内的所有素数进行均匀分布。选择一个随机整数,然后搜索它上面的最小素数会不成比例地避免孪生素数中的较大对,例如 --- 而圣人希望避免这种情况。

有可能让 sage 仅仅寻找可能的素数,它is_pseudoprime代替is_prime上面的使用。根据范围,这可能会快得多。(这使用了 Baillie-PSW pseudoprimality test,目前没有已知的例外......即使我们推测有无限多)。

这提示了潜在的解决方案

def random_prime_in_a_mod_b(lowerbound, upperbound, a, b, proof=False):
    """
    Returns a random prime in [lowerbound, upperbound]
    that is congruent to a mod b.
    """
    if not gcd(a, b) == 1:
        raise ValueError("a and b are not coprime")
    if not lowerbound < upperbound:
        raise ValueError("lowerbound is not smaller than upperbound")
    if proof:
        prime_test = is_prime
    else:
        prime_test = is_pseudoprime
    while True:
        n = randint(lowerbound // b, upperbound // b)
        p = n * b + a
        if p < lowerbound or p > upperbound:
            continue
        if prime_test(p):
            return p

此函数在给定范围内与模 b 一致的整数中统一选择。通过自己执行模数工作,我们永远不会在错误的同余类中测试素数。

根据您对用户的信任程度,使用额外的输入验证可能是有意义的,例如检查 a 和 b 是否为非负数,或者该范围[lowerbound, upperbound]包含至少一个与 a mod b 一致的数字,等等。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1983587/81db2dcb6fbbda86dd36/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)