【问题标题】:Why does this primes algorithm fail for 323?为什么这个素数算法对 323 失败?
【发布时间】:2020-11-26 19:10:17
【问题描述】:

对于 323,以下代码应该返回 False,它不是素数。

import math as m
    def isprime(a):
        if a < 2 or a != 2 and a % 2 == 0 or str(a)[-1] == "5" and a != 5 or sum([int(i) for i in list(str(a))]) % 3 == 0 and a != 3:
            return(False)
        elif a == 2:
            return(True)
        else:
            for divisor in range(3, m.floor(m.sqrt(a))):
                if a % divisor == 0:
                    return(False)
            return(True)     # So far, fails ONLY for 323!
    print(isprime(323))   # prints "True" when this should not be!

但是,它返回 True。

【问题讨论】:

  • 在 Python 中 range() 不包括最后一个值。 m.floor(m.sqrt(a)) 是 17,而 a 是 323。所以你的范围变成了 range(3, 17),这意味着你永远不会检查 17 作为除数。您可以将m.ceil() 的使用范围加1,而不是floor()
  • 你能清理一下第一个 if 语句吗?有点难读。要开始 Id 添加一个独立的 if a
  • 更一般地说,您的方法编码好的规则,但有一种更有效的方法。 en.m.wikipedia.org/wiki/Sieve_of_Eratosthenes
  • 在边缘情况下使用 ceil 而不是将底值加 1 失败。到目前为止,后者已经勾选了所有选项!
  • 虽然我同意埃拉托色尼筛法是一种更好的方法,但要找到一线希望,我认为我的努力是值得的!谢谢夸奖!

标签: python algorithm logic primes


【解决方案1】:

Range是从右边打开的,所以你需要增加它的上限:

for divisor in range(3, 1 + m.floor(m.sqrt(a))):

【讨论】:

  • 这是完美的工作。谢谢!这完成了一个关于主要差距的项目:Gap in Primes.
【解决方案2】:

正如所指出的,错误是排除了平方根本身。在某些情况下,数字本身之后的最高因子比平方根大一。同样,在尝试了两种方法后,我添加了平方根的上限与简单地添加 1 的效果不同。 只添加作品。

以下不起作用

for divisor in range(3, m.ceil(m.sqrt(a))):

请改用:

for divisor in range(3, 1 + m.floor(m.sqrt(a))):

我很乐意收到关于为什么会这样的数学解释。

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多