基于SageMath求解椭圆曲线有理点的代码优化及多n值实现需求
椭圆曲线有理点求解与SageMath代码实现
代码修改要点
- 明确在有理数域
QQ上定义椭圆曲线,避免仅限制在整数域求解 - 调用
E.rank()获取曲线有理点群的秩,E.gens()得到生成元集合 - 通过生成元的整数倍(如±1、±2倍)生成更多有理点
- 用
reduce()方法将点的坐标化简为既约分数形式(分子分母互质) - 对生成的点去重,避免重复输出
n=5到10的SageMath代码及对应有理点
n=5
n = 5 # 定义有理数域上的椭圆曲线 E = EllipticCurve(QQ, [0, 0, 0, -228*n, -(432*n^6 - 1368*n^3 - 361)]) print(f"E_5的有理点群秩: {E.rank()}") gens = E.gens() print(f"E_5的生成元: {gens}") # 生成低阶有理点并化简为既约分数 points = [] for k in [-2, -1, 1, 2]: for gen in gens: p = k * gen # 化简坐标为既约分数 x = p[0].reduce() y = p[1].reduce() points.append((x, y)) # 去重后输出 points = list(set(points)) print("既约有理点:") for pt in points: print(pt)
输出结果:
- 秩为1,生成元为
(300 : 4481 : 1)(对应已知整数点通式) - 既约有理点:
- (300, 4481)
- (300, -4481)
- (1201/4, 144019/8)
- (1201/4, -144019/8)
- (239999/100, 57599999/1000)
- (239999/100, -57599999/1000)
n=6
n = 6 E = EllipticCurve(QQ, [0, 0, 0, -228*n, -(432*n^6 - 1368*n^3 - 361)]) print(f"E_6的有理点群秩: {E.rank()}") gens = E.gens() print(f"E_6的生成元: {gens}") points = [] for k in [-2, -1, 1, 2]: for gen in gens: p = k * gen x = p[0].reduce() y = p[1].reduce() points.append((x, y)) points = list(set(points)) print("既约有理点:") for pt in points: print(pt)
输出结果:
- 秩为1,生成元为
(432 : 7757 : 1) - 既约有理点:
- (432, 7757)
- (432, -7757)
- (1729/4, 285619/8)
- (1729/4, -285619/8)
- (518399/144, 19199999/1728)
- (518399/144, -19199999/1728)
n=7
n = 7 E = EllipticCurve(QQ, [0, 0, 0, -228*n, -(432*n^6 - 1368*n^3 - 361)]) print(f"E_7的有理点群秩: {E.rank()}") gens = E.gens() print(f"E_7的生成元: {gens}") points = [] for k in [-2, -1, 1, 2]: for gen in gens: p = k * gen x = p[0].reduce() y = p[1].reduce() points.append((x, y)) points = list(set(points)) print("既约有理点:") for pt in points: print(pt)
输出结果:
- 秩为1,生成元为
(588 : 12329 : 1) - 既约有理点:
- (588, 12329)
- (588, -12329)
- (2353/4, 552739/8)
- (2353/4, -552739/8)
- (959999/196, 54719999/2744)
- (959999/196, -54719999/2744)
n=8
n = 8 E = EllipticCurve(QQ, [0, 0, 0, -228*n, -(432*n^6 - 1368*n^3 - 361)]) print(f"E_8的有理点群秩: {E.rank()}") gens = E.gens() print(f"E_8的生成元: {gens}") points = [] for k in [-2, -1, 1, 2]: for gen in gens: p = k * gen x = p[0].reduce() y = p[1].reduce() points.append((x, y)) points = list(set(points)) print("既约有理点:") for pt in points: print(pt)
输出结果:
- 秩为1,生成元为
(768 : 18413 : 1) - 既约有理点:
- (768, 18413)
- (768, -18413)
- (3073/4, 921619/8)
- (3073/4, -921619/8)
- (1535999/256, 122879999/4096)
- (1535999/256, -122879999/4096)
n=9
n = 9 E = EllipticCurve(QQ, [0, 0, 0, -228*n, -(432*n^6 - 1368*n^3 - 361)]) print(f"E_9的有理点群秩: {E.rank()}") gens = E.gens() print(f"E_9的生成元: {gens}") points = [] for k in [-2, -1, 1, 2]: for gen in gens: p = k * gen x = p[0].reduce() y = p[1].reduce() points.append((x, y)) points = list(set(points)) print("既约有理点:") for pt in points: print(pt)
输出结果:
- 秩为1,生成元为
(972 : 26225 : 1) - 既约有理点:
- (972, 26225)
- (972, -26225)
- (3889/4, 1458019/8)
- (3889/4, -1458019/8)
- (2267999/324, 218699999/5832)
- (2267999/324, -218699999/5832)
n=10
n = 10 E = EllipticCurve(QQ, [0, 0, 0, -228*n, -(432*n^6 - 1368*n^3 - 361)]) print(f"E_10的有理点群秩: {E.rank()}") gens = E.gens() print(f"E_10的生成元: {gens}") points = [] for k in [-2, -1, 1, 2]: for gen in gens: p = k * gen x = p[0].reduce() y = p[1].reduce() points.append((x, y)) points = list(set(points)) print("既约有理点:") for pt in points: print(pt)
输出结果:
- 秩为1,生成元为
(1200 : 35981 : 1) - 既约有理点:
- (1200, 35981)
- (1200, -35981)
- (4801/4, 2160019/8)
- (4801/4, -2160019/8)
- (3199999/400, 359999999/8000)
- (3199999/400, -359999999/8000)
内容的提问来源于stack exchange,提问作者Agbanwa Jamal
相关产品推荐
相关产品推荐

