如何创建最紧凑的映射 n → isprime(n) 达到极限 N?

Posted

技术标签:

【中文标题】如何创建最紧凑的映射 n → isprime(n) 达到极限 N?【英文标题】:How to create the most compact mapping n → isprime(n) up to a limit N? 【发布时间】:2010-12-20 13:25:02 【问题描述】:

当然,对于bool isprime(number),我可以查询一个数据结构。 我定义了最佳算法,该算法在 (1, N] 范围内生成内存消耗最低的数据结构,其中 N 是一个常数。 只是我正在寻找的一个例子:我可以用一位来表示每个奇数,例如对于给定的数字范围 (1, 10],从 3 开始:1110

下面的字典可以多挤一点吧?我可以通过一些工作消除五的倍数,但是以 1、3、7 或 9 结尾的数字必须存在于位数组中。

我该如何解决这个问题?

【问题讨论】:

您的要求有点模糊。您给出一个测试单个数字的签名,但随后要求提供 (1,N] 的数据结构。您想要一个生成字典 的算法还是只检查单个数字是否为一次性函数是素数吗? @Michael 抱歉,这是我能想到的最好的描述。我正在寻找的正是您所说的:布尔字典。我想最小化字典的空间。谢谢:) 如果您正在寻找它已经被问到了:***.com/questions/1032427/… 你需要询问 NSA 相关:Miller–Rabin primality test in Python 【参考方案1】:

这是最快的方法:

def divisors(integer):
    result = []
    i = 2 
    j = integer/2
    while(i <= j):
        if integer % i == 0:
            result.append(i)
            if i != integer//i:
                result.append(integer//i)
        i += 1
        j = integer//i
    if len(result) > 0:
        return sorted(result)
    else:
        return f"integer is prime"

【讨论】:

【参考方案2】:

当我必须进行快速验证时,我根据低于输入平方根的数字之间的基本除法编写了这个简单的代码。

def isprime(n):
    if n%2==0:
        return n==2
    else:
        cota = int(n**0.5)+1
        for ind in range(3,2,cota):
            if n%ind==0:
                print(ind)
                return False
    is_one = n==1
    return True != is_one

isprime(22783)
最后一个True != n==1是为了避开n=1的情况。

【讨论】:

【参考方案3】:

素数第一法则:如果除以 2 等于整数或整数 不,它不是素数。

使用任何计算机语言的最快知道方法是使用字符串而不是数学进行类型匹配。匹配字符串浮点数中的 DOT。

除以 2,,, n = n / 2 将此转换为字符串,,, n = string(n) 如果“。”旅店: printf "是的,我是 Prime !"

【讨论】:

“素数的第一条规则”是如果任何个大于一的整数整除它,那么它就不是素数。仅使用 2 进行测试是不够的。将数字转换为字符串以测试它是否为整数可能是您可以合理提出的最慢的方法。

以上是关于如何创建最紧凑的映射 n → isprime(n) 达到极限 N?的主要内容,如果未能解决你的问题,请参考以下文章

创建 STL - 身份映射的最简单方法是啥?

數論學習

代码题— 统计所有小于非负整数 n 的质数的数量

计算质数问题

计算质数问题

欧拉筛