椭圆曲线的整数点加法的计算问题

一、椭圆曲线的定义

椭圆曲线是域上亏格为1的光滑射影曲线。对于特征不等于2的域,它的仿射方程可以写成:y^2=x^3+ax^2+bx+c。复数域上的椭圆曲线为亏格为1的黎曼面。Mordell证明了整体域上的椭圆曲线是有限生成交换群,这是著名的BSD猜想的前提条件。阿贝尔簇是椭圆曲线的高维推广

                                                                                                                                                            —百度百科

椭圆曲线的普通方程为

                          《椭圆曲线的整数点加法的计算问题》

椭圆曲线上的点全体构成一个加法群。

注:

在数学中,群是一种代数结构,由一个集合以及一个二元运算所组成。已知集合和运算(G,*)如果是群则必须满足如下要求

封闭性:∀a,b∈G,a*b ∈ G

结合性: ∀a,b,c∈G ,有 (ab)c = a* (b*c)

单位元:ョe∈G, ∀a ∈G,有ea = ae = a

逆元: ∀a ∈G ,ョb∈G 使得 ab = ba = e

二、应用

椭圆曲线上的点构成加法群,那么椭圆曲线上的有理点是有限生成的,另一方面,椭圆曲线上的整数点只有有限多个(我也不懂>!<)

  

《椭圆曲线的整数点加法的计算问题》

如果已知P(x1,y1)和Q(x2,y2),如何求R

解:设有P和Q构成的直线方程f为

   y=a*x+《椭圆曲线的整数点加法的计算问题》

那么P+Q可以表示为(x3,-(a*x3+《椭圆曲线的整数点加法的计算问题》))

那么 x3=((yq-yp)/(xq-xp))^3-xp-xq

        y3=-yp+((yq-yp)/(xq-xp))*(x1-x3)

 

由此得出L如果P(x1,y1),Q(x2,y2),则P+Q=(x3,y3)为

x3=k^2-x1-x2(mod p)

y3=k(x1-x3)-y1(mod p)

其中如果P!=Q 那么k=(y2-y1)/(x2-x1)

如果P==Q  那么k=(3*x1^2+a)/(2*y1)

(其中a为y^2=x^3+a*x+b中的x的系数,p满足4*a^2+27*b^2 mod p !=0)

 

《椭圆曲线的整数点加法的计算问题》

三、计算

这里以y^2=x^3-x为例初始点为(2,7),方法是ip=(i-1)p+p;

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
//计算椭圆曲线的程序
int a=1;
int b=6;
int p=11;//mod p
int x[10][2]={2,7,2,7};
//初始方程的为y^2=x^3+x+6

//通过快速幂求出一个数的逆
//a-1=a^p-2 mod p
int mod(int a,int b,int c)
{
    int sum=1;
    a=a%c;
    while(b)
    {
        if(b & 1)//如果b为奇数,那么结果就应该乘上一个a
            sum=(sum*a)%c;
        a=(a*a)%c;//这里就是相当于把指数b不断分解,进而降低规模
        b=b>>1;//就是除2
    }
    return sum;
}
int calculate_k(int xp,int yp,int xq,int yq)
{    int xielu;
  if((xp==xq)&&(yp==yq))//如果两个点相同
     return (((3*xp*xp+a)*mod(2*yp,p-2,p))%p+p)%p;
   else//两个点不相同
   return (((yq-yp)*mod(xq-xp,p-2,p))%p+p)%p;
}
int main(int args,char *argv)
{

     //初始值暂定为x1=2,y1=7;
     //其中二维数组存储着1p 和2p 等等
     int k=0;
        for(int i=2;i<=9;i++)//循环计算相关的ip
        {
            //4p=3p+p
         k=calculate_k(x[i-1][0],x[i-1][1],x[1][0],x[1][1]);
         //传入相关的数据计算k
        // cout<<k<<endl;
         x[i][0]=((k*k-x[i-1][0]-x[1][0])%p+p)%p;
         x[i][1]=( (k*(x[i-1][0]-x[i][0])-x[i-1][1])%p+p)%p;
        }
         cout<<"输出相关的计算数据"<<endl;
        for(int i=1;i<=9;i++)
           cout<<x[i][0]<<"  "<<x[i][1]<<endl;
}

 

    原文作者:我自是年少韶华倾负
    原文地址: https://blog.csdn.net/qq_38345598/article/details/89743395
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞