python 如何找到合数的范围内的两个整数类似sympy.primerange(a,b)

bsxbgnwa  于 6个月前  发布在  Python
关注(0)|答案(3)|浏览(75)

我正在修补polar plotting of prime numbers的想法,我目前正在使用下面的代码来计算和绘制所有内容。
不确定要提供什么细节,所以我会提供所有的。我使用Anaconda的ObjectiveLab,并遵循几乎从this website茶的一切。
我想修改一下绘制一个范围内的所有合数而不是一个范围内的所有素数的想法,就像sympy.primerange一样。与素数相比,合数的工具很少,我想看看是否有解决这个问题的方法。

import math
import sympy
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format='retina'
plt.style.use('dark_background')

字符串
然后

def get_coordinate(num):
    return num * np.cos(num), num * np.sin(num)


def create_plot(nums, figsize=13.5, s=8, show_annot=True):
    nums = np.array(list(nums))
    x, y = get_coordinate(nums)
    plt.figure(figsize=(figsize, figsize))
    plt.axis("on")
    plt.scatter(x, y, s=s)
    plt.show()


然后

primes = sympy.primerange(a, b)
create_plot(primes)


我试过sympy.composite,但我一直收到错误,不知道如何使它成为一个范围。我还试图复制粘贴一个数据库的复合数字,这是对我试图做的精神。

v64noz0r

v64noz0r1#

任何大于或等于2的数要么是质数要么是合数,所以只要取这个范围内的一组数,然后去掉一组质数。

a = 2
b = 100
composite_range = sorted(set(range(a,b)) - set(sympy.primerange(a,b)))

字符串

7d7tgy0s

7d7tgy0s2#

最好的解决方案是同时遍历rangesympy.primerange,丢弃素数。这样你就不需要一次把它们都存储在内存中,也不需要对它们进行排序。

from sympy import primerange

def compositerange(a, b=None):
    if b is None:
        start, end = 0, a
    else:
        start, end = a, b

    primegen = primerange(start, end)
    prime = next(primegen, end)

    for num in range(start, end):
        if prime < num:
            prime = next(primegen, end)
        if num != prime:
            yield num

字符串
使用方法:

>>> print(list(compositerange(10, 22)))
[10, 12, 14, 15, 16, 18, 20, 21]

6ie5vjzr

6ie5vjzr3#

sympy.composite函数不会像sympy.primerange那样产生一个值范围。相反,您提供n,它会返回第n个合数。要获得前50个合数,您需要调用range(1,51)的函数。这可以使用列表解析来完成。

import sympy

N = 50
composite_range = [sympy.composite(n) for n in range(1, N+1)]
print(composite_range) # [4, 6, 8, ..., 68, 69, 70]

字符串

相关问题