用c++编程求解椭圆曲线上的点集
时间: 2023-10-23 15:10:49 浏览: 244
要求解椭圆曲线上的点集,首先需要定义椭圆曲线的参数,包括有限域Fp上的参数p、a、b和椭圆曲线上的基点G的坐标(x,y)。然后采用椭圆曲线上的加法运算,循环计算椭圆曲线上所有可能的点,直到出现无穷远点为止。
以下是一个简单的C++程序,可以实现求解椭圆曲线上的点集:
```
#include <iostream>
#include <gmpxx.h> //需要引入gmp库
using namespace std;
const mpz_class p("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); //有限域Fp上的参数p
const mpz_class a("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2C"); //椭圆曲线参数a
const mpz_class b("0x0000000000000000000000000000000000000000000000000000000000000003"); //椭圆曲线参数b
const mpz_class x("0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"); //基点G的x坐标
const mpz_class y("0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"); //基点G的y坐标
mpz_class mod_inverse(mpz_class a, mpz_class n) //求逆元函数
{
mpz_class x, y, gcd;
mpz_gcdext(gcd.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(), a.get_mpz_t(), n.get_mpz_t()); //使用gmp库中的扩展欧几里得算法求逆元
if (gcd != 1) return 0;
else return (x % n + n) % n;
}
class Point //定义椭圆曲线上的点类
{
public:
mpz_class x, y;
Point() {}
Point(mpz_class _x, mpz_class _y) { x = _x; y = _y; }
};
Point operator +(Point p1, Point p2) //椭圆曲线上的加法运算
{
Point p;
mpz_class lambda;
if (p1.x == p2.x && p1.y == p2.y) //点p1与点p2相等,即点p1为自己的相反点
{
mpz_class inv = mod_inverse(2 * p1.y, p); //求逆元
if (inv == 0) return Point(0, 0); //不存在逆元
lambda = (3 * p1.x * p1.x + a) * inv; //计算斜率
}
else //点p1与点p2不相等
{
mpz_class inv = mod_inverse(p2.x - p1.x, p); //求逆元
if (inv == 0) return Point(0, 0); //不存在逆元
lambda = (p2.y - p1.y) * inv; //计算斜率
}
p.x = (lambda * lambda - p1.x - p2.x) % p; //计算新点的x坐标
p.y = (lambda * (p1.x - p.x) - p1.y) % p; //计算新点的y坐标
return p;
}
int main()
{
Point G(x, y), P = G; //定义基点G和当前点P
cout << "椭圆曲线上的点为:" << endl;
cout << "(" << G.x << ", " << G.y << ")" << endl; //输出基点G
for (int i = 1; i < 16; i++) //循环计算椭圆曲线上的点
{
P = P + G; //点加运算
cout << "(" << P.x << ", " << P.y << ")" << endl; //输出当前点P
}
return 0;
}
```
该程序中,使用了gmp库中的mpz_class类,可以处理任意大小的整数。定义了椭圆曲线上的点类Point,以及椭圆曲线上的加法运算,使用循环计算椭圆曲线上的所有点。
阅读全文