w := 0;
n := 4+w+w^2;
printf "N=%o\n",4+w+w^2;
R<x,y,z> := RationalFunctionField(Rationals(),3);
problem := ((x/(y+z) + y/(x+z) + z/(x+y)) - 6) ;
// first note that we know a point after some computation (-1,4,11) that
// works but has a negative coordinate, the following function returns 0, which means that
// (x/(y+z) + y/(x+z) + z/(x+y)) - 4 = 0 (just put the -4 in the other side)
Evaluate(problem,[(w^2+1)*(3*w^3+8*w^2+14*w+11),-(w^2+2*w+2)*(3*w^3+w^2+7*w-2),w^6+3*w^5+11*w^4+17*w^3+20*w^2+12*w-1]);
// after the previous returned 0 , we know the point fits, we continue.
// we multiply by all the denominators of "problem" to get a polynomials
problem*Denominator(problem);
// we obtain a polynomial without denominators x^3 - 3*x^2*y - 3*x^2*z - 3*x*y^2 - 5*x*y*z - 3*x*z^2 + y^3 - 3*y^2*z - 3*y*z^2 + z^3
// We see is cubic, three variables, and every term has the same degree (3) , therefore this is a cubic
// homogeneous curve, we know there is a point which is not the solution we want
// the point (-1,4,11) fits in the original "problem" so it should fit in this new curve without denominators too (since no denominator becomes 0)
// We transform this equation to a "curve" in Projecive space of dimension 2
P2<x,y,z> := ProjectiveSpace(Rationals(),2);
C := Curve(P2,x^3 - (n-1)*x^2*y - (n-1)*x^2*z - (n-1)*x*y^2 - (2*n-3)*x*y*z - (n-1)*x*z^2 + y^3 - (n-1)*y^2*z - (n-1)*y*z^2 + z^3);
// fit the point to the curve C (no error is returned)
Pt := C![(w^2+1)*(3*w^3+8*w^2+14*w+11),-(w^2+2*w+2)*(3*w^3+w^2+7*w-2),w^6+3*w^5+11*w^4+17*w^3+20*w^2+12*w-1];
// Since all cubic homogeneous curve with at least one point define an elliptc curve, we can transform
// this curve C to an elliptc curve form and just like in cryptography, we will add this known point (mapped to the corresponded curve)
// with itself until we get only positive coordinates and go back to C (original Problem)
// Below, E is the curve, f is the map that maps Points f:C -> E (C is our original curve without denominators, both curves C,E are equivalent
// but in E we can "Add points" to get another point of E.
// and with f^-1 we can return to the point of C which is our original solution
E,f := EllipticCurve(C);
//g is the inverse g:E->C , f:C->E so g(f([-1,4,11]))=[-1,4,11]
g := f^-1;
// We try adding the known point Pt=[-1,4,11] mapped to E, 2..100 times
// to see if when mapped back the added point to C gives positive coordinates
//, this is 2*Pt, 3*Pt, ...., 100*Pt and then mapping back to C all these.
for n:= 1 to 100 do
// we calculate n times the point of C, known [-1,4,11] but mapped (via f) inside E (where we can do the "n times")
nPt_inE:=n*f(Pt);
// we take this point on E back to C via f^-1 (which we renamed as g)
nPt_inC:=g(nPt_inE);
//We obtain each coordinate of this point to see if is our positive solution,
// here MAGMA scales automatically the point such as Z is one always 1,
// so it puts the same denominators in X,Y, so numerators of X,Y are our
//solutions and denominator our Z, think of P=(a/c,b/c,1) then c*P=(a,b,c)
X := Numerator(nPt_inC[1]);
Y := Numerator(nPt_inC[2]);
Z := Denominator(nPt_inC[1]);
// We check the condition for our original problem.
if ((X gt 0) and (Y gt 0)) then
printf "X=%o\nY=%o\nZ=%o\n",X,Y,Z;
printf("GOT IT!!! x=apple, y=banana, z=pineapple, check the above solution\n");
break;
else
//printf "Nee, some coordinate was negative above, I keep in the loop\n\n";
end if;
end for;
// We check the solution fits in the original problem
if Evaluate(problem, [X,Y,Z]) eq 0 then
printf "I evaluated the point to the original problem and yes, it worked!\n";
else
printf "Mmm this cannot happen!\n";
end if;
重写python代码:
[Python] 纯文本查看复制代码
from sage.all import *
from fractions import Fraction
def multiply_list_values_1(lst, number):
for i in range(len(lst)):
lst[i] *= number
return lst
# 定义有理数域
R = RationalField()
w = 0
n = 4+w+w**2
# 定义射影平面 P2
P2 = ProjectiveSpace(2, R)
x, y, z = P2.coordinate_ring().gens()
# 定义曲线 C
#C = Curve(x**3 - (n-1)*x**2*y - (n-1)*x**2*z - (n-1)*x*y**2 - (2*n-3)*x*y*z - (n-1)*x*z**2 + y**3 - (n-1)*y**2*z - (n-1)*y*z**2 + z**3)
# 定义点 Pt
Pt = [1, -4, -11]
# 创建椭圆曲线 E
E = EllipticCurve_from_cubic(x**3 - (n-1)*x**2*y - (n-1)*x**2*z - (n-1)*x*y**2 - (2*n-3)*x*y*z - (n-1)*x*z**2 + y**3 - (n-1)*y**2*z - (n-1)*y*z**2 + z**3,[(w**2+1)*(3*w**3+8*w**2+14*w+11),-(w**2+2*w+2)*(3*w**3+w**2+7*w-2),w**6+3*w**5+11*w**4+17*w**3+20*w**2+12*w-1])
g = E.inverse()
# 循环计算
for n in range(1, 101):
# 在曲线 C 上计算点 nPt
nPt_inC = multiply_list_values_1(Pt,n)
# 映射点 nPt 到椭圆曲线 E 上
nPt_inE = E(nPt_inC)
print(nPt_inC)
# 逆映射点 nPt_inE 回曲线 C 上
nPt_inC = g(nPt_inE)
# 提取坐标
X = nPt_inC[0].numerator()
Y = nPt_inC[1].numerator()
Z = nPt_inC[0].denominator()
print("X =", X)
print("Y =", Y)
print("Z =", Z)
# 检查条件
if X > 0 and Y > 0:
print("GOT IT!!! x=apple, y=banana, z=pineapple, check the above solution")
break
else:
print("Nee, some coordinate was negative above, I keep in the loop\n")
# 在原始问题上评估点
problem = x**3 - (n-1)*x**2*y - (n-1)*x**2*z - (n-1)*x*y**2 - (2*n-3)*x*y*z - (n-1)*x*z**2 + y**3 - (n-1)*y**2*z - (n-1)*y*z**2 + z**3
if problem(X, Y, Z) == 0:
print("I evaluated the point to the original problem and yes, it worked!")
else:
print("Mmm this cannot happen!")