吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 825|回复: 2
收起左侧

[已解决] (已解决)magma代码重写为python遇到问题

 关闭 [复制链接]
xqyqx 发表于 2024-2-21 17:26
本帖最后由 xqyqx 于 2024-2-21 18:34 编辑

在网上找到了一段magma代码,想把它重写为Python,可是重写后的代码计算完全错误,不知问题出在何处
解决了,映射点出错了
magma代码:
[C] 纯文本查看 复制代码
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!")

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lxd1215 发表于 2024-2-21 20:29
厉害厉害厉害厉害厉害厉害

免费评分

参与人数 2吾爱币 -1 违规 +1 收起 理由
RS水果 + 1 技术区禁止回复与主题无关非技术内容, 屡教不改,违规+1
kll545012 -1 请勿灌水,提高回帖质量是每位会员应尽的义务!

查看全部评分

sai609 发表于 2024-2-21 21:37
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 04:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表