【问题标题】:Is there a way to list super primes between 1 and n in NumPy有没有办法在 NumPy 中列出 1 和 n 之间的超素数
【发布时间】:2021-12-29 16:01:18
【问题描述】:

有没有办法使用 NumPy 列出 1 和 n 之间的超素数(素数位置 wikipedia article)。

【问题讨论】:

  • @msanford -- 问题是关于生成“超级素数”而不是常规素数。
  • 为什么是numpy?它是可以从像arange(1,n) 这样的数组中计算出来的吗?还是任务本质上是迭代的,按顺序评估每个数字?
  • 真@DarrylG;尽管如此,这对于 SO 来说不是远程的一个主题问题。我投票决定以副本的形式关闭,以尝试在此过程中提供些许帮助。
  • 这能回答你的问题吗? Simple prime number generator in Python
  • 我们是否不再期望提问者表现出哪怕是最轻微的尝试来解决他们自己的问题?

标签: python numpy math


【解决方案1】:

我在没有 Numpy 的情况下得到了这个,可以吗? 这是基于

的代码

阿特金筛

import math

is_prime = list()
limit = 100
for i in range(5, limit):
    is_prime.append(False)

for x in range(1, int(math.sqrt(limit)) + 1):
    for y in range(1, int(math.sqrt(limit)) + 1):
        n = 4 * x ** 2 + y ** 2
        if n <= limit and (n % 12 == 1 or n % 12 == 5) and n <= len(is_prime):
            # print "1st if"
            is_prime[n] = not is_prime[n]
        n = 3 * x ** 2 + y ** 2
        if n <= limit and n % 12 == 7:
            # print "Second if"
            is_prime[n] = not is_prime[n]
        n = 3 * x ** 2 - y ** 2
        if x > y and n <= limit and n % 12 == 11:
            # print "third if"
            is_prime[n] = not is_prime[n]

for n in range(5, int(math.sqrt(limit))):
    if is_prime[n]:
        for k in range(n ** 2, limit + 1, n ** 2):
            if k <= len(is_prime):
                is_prime[k] = False
for n in range(5, limit):
    if n < len(is_prime) and is_prime[n]:
        print(n)

【讨论】:

  • 是的;没有 NumPy 很好,我只是认为使用 NumPy 可能会更快。
  • 那么你得到了你需要的东西,只需编辑 limit 变量以匹配问题标题中的 n 数字
  • @freas alfrih 我只是将其更改为输入。
【解决方案2】:

Numpy 代码版本

user2357112 supports Monica对 Numpy Sieve 的 Sieve 修改

import numpy as np

def sieve(n):
    '''
        Sieve of Erastosenes using numpy
    '''
    flags = np.ones(n, dtype=bool)  # Set all values to True
    
    # Set 0, 1, and even numbers > 2 to False
    flags[0] = flags[1] = False
    flags[4:n:2] = False  
    for i in range(3, n, 2):
        # Check for odd primes
        if flags[i]:
            flags[i*i::i] = False
            
    return np.flatnonzero(flags)    # Indexes of True are prime

def superPrimes(n):
    '''
        Find superprimes
    '''
    # Find primes up to n using sieve
    p = sieve(n)

    # p(i) denotes the ith prime number, the numbers in this sequence are those of the form p(p(i))
    # Want to find numbers we can index in the list (i.e. has to be less than len(p))
    indexes = p[p < len(p)]             # base 1 indexes within range
    return p[indexes-1]                 # Subtract 1 since primes array is base 0 indexed
 

测试

print(superPrimes(200))
# Output: [  3   5  11  17  31  41  59  67  83 109 127 157 179 191]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2021-10-01
    • 2023-03-08
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多