利用SymPy高效生成指定范围内的合数序列


利用sympy高效生成指定范围内的合数序列

本文详细阐述如何利用Python和SymPy库,高效地生成指定整数范围内的合数序列。通过自定义`compositerange`函数,它借鉴`sympy.primerange`的思路,采用生成器方式,避免一次性加载所有数字,从而在内存和性能上实现优化,特别适用于需要处理大范围数字或进行数据可视化等场景。

背景与挑战

在数学探索和数据可视化领域,有时需要获取特定范围内的素数或合数序列。Python的sympy库提供了一个非常便利的primerange(a, b)函数,可以高效地生成指定区间[a, b)内的所有素数。然而,对于合数,sympy库并没有直接提供类似的compositerange函数。传统的做法可能包括生成整个范围内的所有数字,然后逐一判断是否为素数,再筛选出合数;或者预先存储一个合数数据库,但这两种方法在处理大范围数字时,都可能面临内存消耗过大或效率低下的问题。

解决方案:基于生成器的compositerange函数

为了解决上述挑战,我们可以设计一个自定义的compositerange函数,它巧妙地结合了range函数和sympy.primerange的优势,以生成器(generator)的方式按需生成合数,从而避免一次性在内存中存储大量数据。

核心思想

该方法的核心思想是:遍历给定范围内的所有整数,同时利用sympy.primerange生成一个素数序列。当遍历到某个数字时,检查它是否与当前素数序列中的素数匹配。如果一个数字不是素数,则将其作为合数(或非素数)返回。这种同步迭代的方式确保了高效性。

函数实现

以下是compositerange函数的Python实现:

from sympy import primerange

def compositerange(a, b=None):
    """
    生成指定整数范围内([a, b) 或 [0, a))的所有非素数。

    参数:
        a (int): 范围的起始值(如果b为None)或结束值。
        b (int, optional): 范围的结束值。如果为None,则范围为 [0, a)。
                           注意:sympy.primerange的范围是 [start, end)。
                           本函数生成的是 [start, end) 范围内的非素数。

    Yields:
        int: 范围内的非素数。
    """
    if b is None:
        start, end = 0, a
    else:
        start, end = a, b

    # 获取一个素数生成器
    # primerange(start, end) 会生成 [start, end) 范围内的素数
    primegen = primerange(start, end)

    # 获取第一个素数,如果范围内没有素数,则设置为end,确保后续比较正确
    prime = next(primegen, end)

    # 遍历指定范围内的所有数字
    for num in range(start, end):
        # 如果当前素数小于当前数字,说明当前素数已经被“跳过”或已处理
        # 此时需要获取下一个素数
        while prime < num:
            prime = next(primegen, end) # 获取下一个素数,如果耗尽则为end

        # 如果当前数字不等于当前素数,说明它不是素数,因此是合数(或非素数)
        # 注意:1 既非素数也非合数,但此函数会将其作为非素数包含。
        # 0 也不是素数,也会被包含。
        if num != prime:
            yield num

使用示例

我们可以通过以下方式使用compositerange函数:

# 示例1:生成10到22之间的非素数
print(list(compositerange(10, 22)))
# 预期输出: [10, 12, 14, 15, 16, 18, 20, 21]

# 示例2:生成0到10之间的非素数
print(list(compositerange(10)))
# 预期输出: [0, 1, 4, 6, 8, 9] (注意:0和1被包含)

# 示例3:生成一个空范围
print(list(compositerange(5, 5)))
# 预期输出: []

从示例中可以看出,对于大于等于4的整数,该函数会返回合数。而对于0和1,它们既非素数也非合数,但此函数会将它们视为非素数并包含在结果中。如果需要严格意义上的合数(即大于1且不是素数的整数),可以在使用结果时进行额外过滤(例如,[n for n in compositerange(a, b) if n > 1])。

结合数据可视化

最初的问题背景提及了素数的极坐标绘图。现在,有了compositerange函数,我们可以轻松地将它应用到合数的极坐标绘图中,替换原有的sympy.primerange。

首先,确保你已安装必要的库:

import math
import sympy
import numpy as np
import matplotlib.pyplot as plt
# 如果在Jupyter环境,可以添加以下配置
# %matplotlib inline
# %config InlineBackend.figure_format='retina'
plt.style.use('dark_background') # 可选,根据个人喜好设置绘图风格

然后定义坐标转换和绘图函数:

def get_coordinate(num):
    """
    将数字转换为极坐标 (num * cos(num), num * sin(num))。
    """
    return num * np.cos(num), num * np.sin(num)

def create_plot(nums, figsize=13.5, s=8, show_annot=True):
    """
    绘制给定数字序列的极坐标散点图。

    参数:
        nums (iterable): 要绘制的数字序列。
        figsize (float): 图形尺寸。
        s (float): 散点大小。
        show_annot (bool): 是否显示注释(在此示例中未使用)。
    """
    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()

现在,你可以使用自定义的compositerange函数来绘制合数螺旋图:

# 绘制100到10000之间的合数螺旋图
composites = compositerange(100, 10000)
create_plot(composites)

# 如果想绘制严格的合数(排除0和1)
# strict_composites = [n for n in compositerange(100, 10000) if n > 1]
# create_plot(strict_composites)

注意事项与总结

  1. 效率优势: compositerange函数采用生成器模式,按需生成数字,避免了一次性在内存中创建并存储整个列表,这对于处理非常大的数字范围至关重要。
  2. 依赖性: 该函数依赖于sympy库来生成素数序列。在使用前请确保已安装sympy (pip install sympy)。
  3. 结果解读: compositerange函数返回的是给定范围内所有“非素数”。对于大于等于4的整数,这些非素数即为合数。但对于0和1,它们既非素数也非合数,此函数会将它们包含在结果中。如果需要严格意义上的合数(即大于1的非素数),可以在使用生成器结果时添加一个简单的过滤条件,例如 [n for n in compositerange(a, b) if n > 1]。
  4. 可扩展性: 这种基于生成器和同步迭代的模式,也可以应用于其他需要筛选序列的场景,具有良好的可扩展性。

通过以上方法,我们成功地为Python提供了一个高效且内存友好的compositerange功能,弥补了sympy库在这方面的空白,使得在各种应用场景下处理合数序列变得更加便捷。

以上就是利用SymPy高效生成指定范围内的合数序列的详细内容,更多请关注其它相关文章!


# 几种  # 威海营销推广机构排名  # 优化网站重要页面设计方案  # 上海seo推广企业  # 微博内容加热和营销推广  # 网站优化月总结  # 网站建设可提供源码  # seo查询中移动流量的  # 制造业网站推广  # 沧州网站推广选择哪个  # 番禺区商标网站推广  # 会将  # python  # 既非  # 极坐标  # 浮点  # 的是  # 自定义  # 我们可以  # 遍历  # 合数  # igs  # cos  # 数据可视化 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  偃武诸葛亮阵容搭配推荐  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  微信如何设置字体大小_微信字体设置的阅读舒适  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  Golang如何使用log记录日志信息_Golang log日志记录方法总结  顺丰官方查单号入口 顺丰快递单号查询官网入口  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  我的世界官方网址入口 我的世界游戏主页直达入口  《下一站江湖2》独孤剑诀习得方法  word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  天堂漫画网页版在线阅读 天堂漫画手机版入口  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  《图怪兽》退出登录方法  家里的小飞虫总是不断,用什么方法可以彻底根除?  GBA模拟器手柄按键设置  如何配置VS Code作为您Git操作的默认编辑器  抖音小程序怎么开通?小程序开通条件是什么?  2025SNH48年度青春盛典门票价格及购买方式  在React中正确处理HTML input type="number"的数值类型  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  行者app怎样导出日志  管理打开的编辑器:固定、分组和关闭技巧  PHP动态导航按钮:根据用户登录状态切换链接与文本  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程  《花瓣》创建专辑方法  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  视频转蓝光m2ts格式  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  三角洲行动2025年9月10日摩斯密码分享  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  江苏大剧院会员卡购买步骤  b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法  如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计  如何使用 composer 和 aop-php 实现 AOP 编程?  汽水音乐车机版 汽水音乐车机版官方入口  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  抖音猜你想搜能说明对方搜过吗  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  Three.js中动态更换3D模型纹理的教程  苹果iPhone14ProMax如何新建AppleID_iPhone14ProMax新建AppleID具体流程  有道AI翻译入口 智能写作官方网站入口  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】 

 2025-12-04

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.