主筛返回一些奇怪的数字

时间:2016-03-17 02:00:17

标签: python primes sieve

我正在尝试开发一个主要的筛子,而且在纸面上我的算法在纸上非常有意义,但是在平方根之上的素数中返回一个非常短的复合数选择。

例如,有一个限制(找到所有素数达到极限)为10,000(平方根为100),它与其素数混合的复合数字是115,119,121和125 (都非常接近(及以上!)100)。

请让我知道我的代码有什么问题,哪些部分需要修复/如何解决。

澄清:我担心它返回的复合(非素数),在我的素数测试中哪里出错了我怎么能纠正它?

到目前为止,这是我的筛子:

{{1}}

3 个答案:

答案 0 :(得分:3)

删除平方根下方的素数后,您无法再使用squareroot作为primes的索引,因为primes的长度会发生变化。

答案 1 :(得分:2)

您获得高于平方根的复合材料的一个原因是因为您的循环是如何构建的。从列表中删除项目时,较高索引处的所有项目都会向下移动一个。因此,当在第一个循环中移除一个项目时,平方根向下移动。当第二个循环开始时,squareroot不再是平方根的索引。

# Removing composites BELOW the square root
for p in prime[:squareroot][:]:
    for f in range(2, int(p ** 0.5) + 1):
        if p % f == 0:
            prime.remove(p)  # <- you removed an item from `prime`, so the
            break            # square root is now at prime[squareroot - 1]

# Removing composites ABOVE the square root
for f in prime[:squareroot][:]:    #    now p[squareroot] is actually a number
    for p in prime[squareroot:]:   # <- above the real square root, so this 
        if p % f == 0:             #    loop starts too high
            prime.remove(p)

修复它的一种方法是在第一个循环中删除值时调整squareroot的值。另一种方法是在第二次循环之前重新计算squareroot

在迭代列表时添加或删除列表中的项目通常是个坏主意。例如,可以在一次传递中标记项目(例如,将它们设置为零或无),然后可以在第二次传递中复制未标记的项目。

修改添加示例代码以标记复合材料:

# Removing composites BELOW the square root
for i,p in enumerate(prime[:squareroot]):
    for f in range(2, int(p ** 0.5) + 1):
        if p % f == 0:
            prime[i] = 0  # <- mark composites
            break         

# Removing composites ABOVE the square root
for f in prime[:squareroot]:    
    if f == 0: 
        continue                              # skip composites
    for i,p in enumerate(prime[squareroot:]): # <- this loop is okay now
        if p % f == 0:            
            prime[i] = 0                      # mark composite

# at this point, prime contains 0's where the compsites were found
# and non-zeros for the primes.  Just need to collect all the
# non-zero elements.
result = []         
for p in prime:     
    if p:                    
        result.append(p)

您的代码还有其他问题,但这应该回答您当前的问题。随着你越来越熟练使用python,你会看到你可以进一步改进(一个主要的筛子可以写成大约6行python)。

答案 2 :(得分:1)

我根据T. Silver的反应来修复它 - 我刚刚确定它以确保在极限的平方根以下的所有内容都是素数后,它再次找到平方根。这是固定代码:

 index.html
<custom-element>
    <div class="selected_content">
        <h2>{{item.id}}</h2>
        <span>{{item.member.dept.name}}</span>
    </div>
</custom-element>   

customElement.html    
<iron-ajax
    auto
    url={{url}}
    handle-as="json"
    last-response={{lastresponse}}
    debounce-duration="300"></iron-ajax>

<template is="dom-repeat" items=[[lastresponse]]>
    <content select=".selected_content"></content>
</template>