发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!