如何实现类似sympy.primerange的区间合数生成并绘制极坐标图
生成指定区间合数并绘制极坐标图的解决方案
核心思路
要实现类似sympy.primerange的合数区间生成功能,无需依赖现成数据库,直接基于质数判断反向筛选即可:
- 合数定义为大于1的非质数,只需遍历区间内整数,排除质数和1
- 用生成器实现懒加载,和
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=False): nums = np.array(list(nums)) x, y = get_coordinate(nums) plt.figure(figsize=(figsize, figsize)) plt.axis("on") plt.scatter(x, y, s=s) # 可选:开启后显示每个点对应的合数数值 if show_annot: for idx, num in enumerate(nums): plt.annotate(num, (x[idx], y[idx]), fontsize=6, color='white') plt.show() def composite_range(a, b): # 合数必须大于1,自动修正区间起始点 start = max(a, 2) for num in range(start, b): # 非质数即为合数(已排除<2的情况) if not sympy.isprime(num): yield num # 替换为你需要的区间,示例为2到1000 a, b = 2, 1000 composites = composite_range(a, b) create_plot(composites, show_annot=False)
关键说明
- composite_range函数:
- 自动处理区间下限,确保从2开始(1既非质数也非合数)
- 生成器模式返回合数,和
primerange使用方式完全匹配 - 依赖
sympy.isprime做质数判断,准确率与效率有保障
- create_plot优化:
- 补全原代码中定义但未使用的
show_annot参数,可按需显示数值标注 - 保留原有深色背景、高清渲染配置,和质数绘图风格统一
- 补全原代码中定义但未使用的
内容的提问来源于stack exchange,提问作者Pure
相关产品推荐
相关产品推荐

