一些理论
椭圆曲线的定义
形如 \(y^2+a_1xy+a_3y=x^3+a_2x^2+a_4x+a_6\) 的三次曲线叫做椭圆曲线。许多椭圆曲线都有唯一对应的 \(a,b\) 满足 \(y^2=x^3+ax+b\)。接下来不做特殊说明的椭圆曲线默认为定义在 \(\mathbb Q\) 上的。
椭圆曲线上的点是可以做加法和数乘的。
椭圆曲线的秩(rank)定义为曲线上能够给出全体有理点的、线性无关的基。
它的 conductor 是一个重要标识,并且一定是判别式 \(-16(4a^3+27b^2)\) 的因子。
点 \(P=(x,y)\) 的高度(height)是一个接近 \(\ln\max(|x_{num}|,|x_{den}|)\) 的值。它的定义是 \(h(P)=\lim_{n\rightarrow+\infty}\frac{\ln\max(|{(nP)_x}_{num}|,|{(nP)_x}_{den}|)}{n^2}\)。这是因为将 \(P\) 自乘大致会让 \(x\) 的分母和分子到平方级别。
同构(isogeny)是对于相同 conductor 的曲线之间的一种双射。
挠群(torsion group)是一些点的集合,这些点的高度均为 \(0\),并且存在一个正整数,使得它数乘上这些点会得到无穷远点。这个集合通常写作 \(E(\mathbb Q)_{\text{tors}}\)。有定理表明挠群的大小只有有限中可能。同构一定是基于挠群的点构造的。
Mordell-Weil 定理表明
还有一个定理表明一个椭圆曲线上的整数点个数是有限的。
有一个数据库把所有 conductor \(<5\times10^5\) 的曲线全部收集了。这里展示了所有曲线的 conductor、同构等等信息。
一些常见三次问题
例 1.
找到所有相邻的三个正整数,使得他们的积可以被表示为两个相邻正整数的积。
Solution.
显然对应的曲线是 \(y^2+y=x^3-x\),数据库标识为 37a1,有生成元 \((0,0)\) 和平凡挠群。从这个点可以生成的正整数点仅有 \((2,2),(6,14)\)。因此唯一答案为 \(1\times2\times3=2\times3\) 和 \(6\times7\times8=14\times15\)。
例 2.
找到一个三边长均为有理数的直角三角形,使得其面积为 997。
Solution.
为了日后方便,我们设这个三角形的面积为 \(n\)(此处 \(n=997\))。
设三边长分别为 \(a,b,c\)。于是 \(ab=2n,a^2+b^2=c^2\)。
考虑 \((a+b)^2\) 和 \((a-b)^2\),它们满足 \((a+b)^2=c^2+4n,(a-b)^2=c^2-4n\),并且两者均为有理数的平方。
现在假设 \(d=c(a+b)(a-b)\)。我们有 \(d^2=c^2(c^2+4n)(c^2-4n)\)。做换元 \(x=\frac{c^2}4,y=\frac d8\),我们得到 \(y^2=x^3-n^2x\)。
这是一条椭圆曲线。在 \(n=997\) 的情况下找到一个生成元,并且倍增后找到解。
mysqrt(a)=if(!issquare(a),return(0));return(sqrtint(numerator(a))/sqrtint(denominator(a)));
getres(poi)=hyp=mysqrt(poi[1])*2;n=sqrtint(poi[1]^2-poi[2]^2/poi[1]);if(hyp==0,return([0,0,0]));apb=hyp^2+4*n;amb=hyp^2-4*n;apb=mysqrt(apb);amb=mysqrt(amb);return([(apb+amb)/2,(apb-amb)/2,hyp]);my_sqrt(n)=return(sqrtint(numerator(n))/sqrtint(denominator(n)));
descend(E,limit)=covers=ell2cover(E);[hyperell,trans]=covers[#covers];poi=hyperellratpoints(hyperell,limit,1);if(poi==[],return([]));[x,y]=poi[1];return([eval(trans)]);
check_double_point_worker(n,dbl_P)=[dbl_x,dbl_y]=dbl_P;denom=denominator(dbl_x);localprec(log(denom)/log(10)+10);rot=polroots((x^4+2*n^2*x^2+n^4)-dbl_x*(4*x^3-4*n^2*x));\
for(i=1,#rot,if(abs(imag(rot[i]))<0.1,orig_x=round(real(rot[i])*denom)/denom;y=orig_x^3-n^2*orig_x;if(issquare(y),return([orig_x,my_sqrt(y)]))));return([]);
check_double_point(n,dbl_P)=E=ellinit([-n^2,0]);ans=check_double_point_worker(n,dbl_P);if(ans!=[],return(ans));dbl_P=elladd(E,dbl_P,[n,0]);\
ans=check_double_point_worker(n,dbl_P);if(ans!=[],return(ans));dbl_P=elladd(E,dbl_P,[-n,0]);ans=check_double_point_worker(n,dbl_P);if(ans!=[],return(ans),return(dbl_P));
try_isogeny_0(n)=F=ellinit([4*n^2,0]);gens=descend(F,5*10^5);if(gens==[],return([]));for(i=1,#gens,gens[i]=ellmul(F,gens[i],2);\
denom=denominator(gens[i][1]);localprec(log(denom)/log(10)+10);kill(x);gens[i][1]=round(real(polroots(x^2-n^2-gens[i][1]*x)[1])*denom)/denom;\
gens[i][2]=my_sqrt(gens[i][1]^3-n^2*gens[i][1]);gens[i]=check_double_point(n,gens[i]));return(gens);
try_isogeny_n(n)=F=ellinit([-11*n^2,-14*n^3]);gens=descend(F,5*10^5);if(gens==[],return([]));for(i=1,#gens,gens[i]=ellmul(F,gens[i],2);\
denom=denominator(gens[i][1]);localprec(log(denom)/log(10)+10);kill(x);gens[i][1]=round(real(polroots(x^2-n*x+2*n^2-gens[i][1]*(x-n))[1])*denom)/denom;\
gens[i][2]=my_sqrt(gens[i][1]^3-n^2*gens[i][1]);gens[i]=check_double_point(n,gens[i]));return(gens);
try_isogeny_negn(n)=F=ellinit([-11*n^2,14*n^3]);gens=descend(F,5*10^5);if(gens==[],return([]));for(i=1,#gens,gens[i]=ellmul(F,gens[i],2);\
denom=denominator(gens[i][1]);localprec(log(denom)/log(10)+10);kill(x);gens[i][1]=round(real(polroots(x^2+n*x+2*n^2-gens[i][1]*(x+n))[1])*denom)/denom;\
gens[i][2]=my_sqrt(gens[i][1]^3-n^2*gens[i][1]);gens[i]=check_double_point(n,gens[i]));return(gens);
findgen(n)=E=ellinit([-n^2,0]);default(debug,0);gens=ellrank(E);gens[4]=descend(E,5*10^4);if(length(gens[4])==gens[1],return(gens[4]));gens=try_isogeny_0(n);if(gens!=[],return(gens));\
gens=try_isogeny_n(n);if(gens!=[],return(gens));gens=try_isogeny_negn(n);if(gens!=[],return(gens),print1("[heegner] ");default(debug,1);return([ellheegner(E)]));getres(ellmul(ellinit([-997^2,0]),findgen(997),2))
结果:
[42045784500290583601169350167524066632293909499680451537042308010444196669128265360595820330636163/399082703293075088386715661082193007805935653266204519939704131581460772660281532877763215888410, 795770910366391726243111028197892857565035692612811812759770038373432780684601376558259852481489540/42045784500290583601169350167524066632293909499680451537042308010444196669128265360595820330636163, 1796146590560926602672575298788333284688177317936517549763322686459574431371325695942870465833419357597822737332868555849070485647088525666103363597033670990586154161851347370389369338567447248681/16779745340454042397713600388842368755458928925218529234514192521219285938221689838169684478157168127740868068401278345762181099631619258083130462538905961256138482916992038230210170084518570830]