Math::EllipticCurve::Prime::Point

素数空間楕円曲線上の演算を行なう。

use Math::EllipticCurve::Prime::Point;
パッケージをロードする。

my $p = Math::EllipticCurve::Prime::Point->new(curve => $curve,
 x => Math::BigInt->new($x), y => Math::BigInt->new($y));

$curve : 使用する楕円曲線を指定する。FIPS186で指定された曲線を使用可能。

FIPS186での名称 $curve
P-192 secp192r1
P-224 secp224r1
P-256 secp256r1
P-384 secp384r1
P-521 secp521r1

$x, $y : 楕円曲線上の点のx, y 座標

FIPS186のベースポイントを現わすオブジェクトを作る場合は、下記の様にする。
use Math::EllipticCurve::Prime;
my $cv = new Math::EllipticCurve::Prime(name => $curve);
my $G = $cv->g;     // ベースポイントを現わすオブジェクトが返る。

my $p = Math::EllipticCurve::Prime::Point->from_hex($hex);

$hex : SECフォーマットで表現した楕円曲線上の点(16進表記)

使用する楕円曲線が指定されないので、オブジェクトを作成後、curveメソッドで曲線指定を追加する事。
$p->curve(Math::EllipticCurve::Prime->new(name => $curve));

my $hex = $p->to_hex();
楕円曲線上の点を表現したSECフォーマットを返す。
SECフォーマット := 04 || x座標 || y座標 x座標とy座標は、同一バイト長になっている。

my $rc = $p->infinity();
点が無限遠点の時、真。

my $x = $p->x;
x座標。Math::BigIntオブジェクトが返る。

my $y = $p->y;
y座標。Math::BigIntオブジェクトが返る

 my $curve = $p->curve;
使用している楕円曲線。Math::EllipticCurve::Primeオブジェクトが返る。

下記のメソッドで楕円曲線のパラメタが取得できる。
方程式は、y^2≡x^3 + ax + b (mod p)

$p->curve->p: 素数モジュラス
$p->curve->a:係数a(FIPS186では-3だが、0x1ff...fc = p-3が返る)
$p->curve->b:係数b
$p->curve->g:ベースポイント(Math::EllipticCurve::Prime::Pointオブジェクト)
$p->curve->n:Gの点位数

以下のメソッドはMath::BigIntと同様にOOスタイルのメソッドなので、copyしてから演算する事。

my $q = $p->copy()->bmul($d);
楕円曲線上のスカラー倍算。

my $q = $p->copy()->bad($p2);
楕円曲線上の加算。