【发布时间】:2021-09-15 15:15:46
【问题描述】:
Sage 新手,我在这段代码中遇到了以下问题:
abc2 = ((x * d).numerator() for x in abc)
for x in abc2:
show (type(x))
show (gcd (x.coefficients()))
g = (gcd (x.coefficients()) for x in abc2)
print ("g =", tuple(g))
打印以下输出:
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
177282774041995797378340812360777728/101
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
177282774041995797378340812360777728
<class 'sage.rings.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
177282774041995797378340812360777728
g = ()
从循环中的打印可以推断,3 个 gcd 的计算结果与 gcd (x.coefficients()) 的预期一致。但是,当循环后在生成器中使用gcd (x.coefficients()) 时,生成器是空的,我希望它有 3 个元素?
我在这里缺少什么?我检查了生成的.py文件,那部分没有变化,所以我对Python的理解是错误的?
$ sage --version
SageMath version 9.0, Release Date: 2020-01-01
仅供参考,这是完整的 Sage 代码,上面的代码片段从第 24 行开始:
#!/usr/bin/env sage
R.<a,b,c> = QQ[]
def to_xy (abc, E):
(a2, a1) = E
(a, b, c) = abc
d = 6*a + 6*b - c
x = -28 * (a + b + 2*c) / d
y = 364 * (a - b) / d
return (x, y)
def to2_abc (P, E):
""" Get back from a point P = (x,y) on
E: y^2 = x^3 + a2 x^2 + a1 x to (a,b,c).
"""
(x,y) = P
abc = (-56/101 - 12 * x, 56 - x + y, 56 - x - y)
d = lcm (x.denominator() for x in abc)
abc2 = ((x * d).numerator() for x in abc)
for x in abc2:
show (type(x))
show (gcd (x.coefficients()))
g = (gcd (x.coefficients()) for x in abc2)
print ("g =", tuple(g))
def ECadd (P, E):
(xP, yP) = P
(a2,a1) = E
# Get to short Weierstrass form E': y^2 = x^2 + A x + B.
k = -a2 / 3
A = 3*k*k + 2*a2*k + a1
# B = (k*k + a2*k + a1) * k
(xS, yS) = (xP-k, yP)
# Add S to itself on E'.
s = (3 * xS*xS + A) / (2 * yS)
xSS = s*s - xS - xS
ySS = -yS - s * (xSS - xS)
# Return P+P on E.
(xPP, yPP) = (xSS+k, ySS)
return (xPP, yPP)
E = (109, 224)
P = to_xy ((a,b,c), E)
P2 = ECadd (P, E)
to2_abc (P2, E)
【问题讨论】:
标签: python python-3.x sage