第一次接觸Sage,我在這段代碼中遇到了以下問題:
abc2 = ((x * d).numerator() forx in abc)
for x in abc2:
顯示(type(x))
顯示(gcd (x.coefficients())
g = (gcd (x.coefficients()) for x in abc2)
print ("g =", tuple(g)
列印以下輸出:
<class 'sage.ring.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular' >
177282774041995797378340812360777728/101
<類 'sage.ring.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
177282774041995797378340812360777728
<class 'sage.ring.polynomial.multi_polynomial_libsingular.MPolynomial_libsingular'>
177282774041995797378340812360777728
g = ()
正如你可以從回圈中的列印結果推斷的那樣,3個gcds被計算出來,正如你所期望的那樣,從gcd (x.coefficients())。然而,當gcd (x.coefficients())在回圈后的生成器中使用時,生成器是空的,而我期望它有3個元素?
我在這里錯過了什么? 我檢查了生成的.py檔案,該部分沒有變化,所以我對Python的理解是錯誤的?
$ sage --version
SageMath版本9.0,發布日期。2020-01-01
FYI,這里是完整的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)。
"" 從一個點P=(x,y)上取回
E: y^2 = x^3 a2 x^2 a1 x 到(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).分子() for x in abc)
for x in abc2:
顯示(type(x))
顯示(gcd (x.coefficients())
g = (gcd (x.coefficients()) for x in abc2)
print ("g ="/span>, tuple(g))
def ECadd(P,E)。
(xP, yP) = P
(a2,a1) = E
# 得到短的韋爾斯特拉斯形式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)
# 在E'上把S加到自己身上。
s = (3 * xS*xS A) / (2 * yS)
xSS = s*s - xS - xS
ySS = -yS - s * (xSS - xS)
# 在E上回傳P P。
(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)
uj5u.com熱心網友回復:
當你對一個生成器進行迭代時,當生成器被耗盡時,迭代就會停止,所以當你第二次迭代時,已經沒有元素了。
如果您需要對資料進行多次迭代,請先將其轉換為另一種型別,如串列,然后再進行迭代。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/307315.html
標籤:
