有限体に関する演算
*********

Finite fields
*************

有限体の表現および演算
===========

Representation of finite fields
===============================

Asir においては, 有限体は, 正標数素体 GF(p), 標数 2 の有限体 GF(2^n) が定義できる. これらは全て, setmod_ff() により定義される.

On Asir GF(P) and GF(2^N) can be defined, where GF(P) is a finite prime field of charateristic P and GF(2^N) is a finite field of characteristic 2. These are all defined by setmod_ff().

     [0] P=pari(nextprime,2^50);
     1125899906842679
     [1] setmod_ff(P);
     1125899906842679
     [2] field_type_ff();
     1
     [3] load("fff");
     1
     [4] F=defpoly_mod2(50);
     x^50+x^4+x^3+x^2+1
     [5] setmod_ff(F);
     x^50+x^4+x^3+x^2+1
     [6] field_type_ff();
     2

setmod_ff() は, 引数が正整数 p の場合 GF(p), n 次多項式 f(x) の場合, f(x) mod 2 を定義多項式とする GF(2^n) をそれぞれ基礎体としてセットする. setmod_ff() においては引数の既約チェックは行わず, 呼び出し側が責任を持つ.

基礎体とは, あくまで有限体の元として宣言あるいは定義されたオブジェクトが, セットされた基礎体の演算に従うという意味である. 即ち, 有理数どうしの演算の結果は有理数となる. 但し, 四則演算において一方のオペランドが有限体の元の場合には, 他の元も自動的に同じ有限体の元と見なされ, 演算結果も同様になる.

0 でない有限体の元は, 数オブジェクトであり, 識別子の値は 1 である. さらに, 0 でない有限体の元の数識別子は, GF(p) の場合 6, GF(2^n) の場合 7 となる.

有限体の元の入力方法は, 有限体の種類により様々である. GF(p) の場合, simp_ff() による.

If P is a positive integer, setmod_ff(P) sets GF(P) as the current base field. If F is a univariate polynomial of degree N, setmod_ff(F) sets GF(2^N) as the current base field.  GF(2^N) is represented as an algebraic extension of GF(2) with the defining polynomial F MOD 2. In both cases the primality check of the argument is not done and the caller is responsible for it.

Correctly speaking there is no actual object corresponding to a 'base field'. Setting a base field means that operations on elements of finite fields are done according to the arithmetics of the base field. Thus, if operands of an arithmetic operation are both rational numbers, then the result is also a rational number. However, if one of the operands is in a finite field, then the other is automatically regarded as in the same finite field and the operation is done in the finite field.

A non zero element of a finite field belongs to the number and has object identifier 1. Its number identifier is 6 if the finite field is GF(P), 7 if it is GF(2^N).

There are several methods to input an element of a finite field. An element of GF(P) can be input by simp_ff().

     [0] P=pari(nextprime,2^50);
     1125899906842679
     [1] setmod_ff(P);
     1125899906842679
     [2] A=simp_ff(2^100);
     3025
     [3] ntype(@@);
     6

また, GF(2^n) の場合いくつかの方法がある.

In the case of GF(2^N) the following methods are available.

     [0] setmod_ff(x^50+x^4+x^3+x^2+1);
     x^50+x^4+x^3+x^2+1
     [1] A=@;
     (@)
     [2] ptogf2n(x^50+1);
     (@^50+1)
     [3] simp_ff(@@);
     (@^4+@^3+@^2)
     [4] ntogf2n(2^10-1);
     (@^9+@^8+@^7+@^6+@^5+@^4+@^3+@^2+@+1)

有限体の元は数であり, 体演算が可能である. @ は GF(2^n) の, GF(2)上の生成元である. 詳しくは see 数の型.

Elements of finite fields are numbers and one can apply field arithmetics to them. @ is a generator of GF(2^N) over GF(2). See Types of numbers.

有限体上での 1 変数多項式の演算
=================

Univariate polynomials on finite fields
=======================================

fff では, 有限体上の 1 変数多項式に対し, 無平方分解, DDF, 因数分解, 多項式の既約判定などの関数が定義されている.

いずれも, 結果は [因子, 重複度] のリストとなるが, 因子は monic となり, 入力多項式の主係数は捨てられる.

無平方分解は, 多項式とその微分との GCD の計算から始まるもっとも一般的なアルゴリズムを採用している.

有限体上での因数分解は, DDF の後, 次数別因子の分解の際に, Berlekamp アルゴリズムで零空間を求め, 基底ベクトルの最小多項式を求め, その根を Cantor-Zassenhaus アルゴリズムにより求める, という方法を実装している.

In fff square-free factorization, DDF (distinct degree factorization), irreducible factorization and primality check are implemented for univariate polynomials over finite fields.

Factorizers return lists of [factor,multiplicity]. The factor part is monic and the information on the leading coefficient of the input polynomial is abandoned.

The algorithm used in square-free factorization is the most primitive one.

The irreducible factorization proceeds as follows.

 1. DDF

 2. Nullspace computation by Berlekamp algorithm

 3. Root finding of minimal polynomials of bases of the nullspace

 4. Separation of irreducible factors by the roots

有限体上の楕円曲線に関する演算
===============

Elliptic curves on finite fields
================================

有限体上の楕円曲線に関するいくつかの基本的な演算が, 組み込み関数として提供されている.

楕円曲線の指定は, 長さ 2 のベクトル [A B] で行う. A, B は有限体の元で, setmod_ff で定義されている有限体が素体の場合, Y^2=X^3+AX+B, 標数 2 の体の場合 Y^2+XY=X^3+AX^2+B を表す.

楕円曲線上の点は, 無限遠点も込めて加法群をなす. この演算に関して, 加算 (ecm_add_ff()), 減算 (ecm_sub_ff()) および逆元計算のための関数 (ecm_chsgn_ff()) が提供されている. 注意すべきは, 演算の対象となる点の表現が,

  * 無限遠点は 0.

  * それ以外の点は, 長さ 3 のベクトル [X Y Z]. ただし, Z は 0 でない.

という点である. [X Y Z] は斉次座標による表現であり, アフィン座標では [X/Z Y/Z] なる点を表す. よって, アフィン座標 [X Y] で表現された点を演算対象とするには, [X Y 1] なるベクトルを生成する必要がある. 演算結果も斉次座標で得られるが, Z 座標が 1 とは限らないため, アフィン座標を求めるためには X, Y 座標を Z 座標で割る必要がある.

Several fundamental operations on elliptic curves over finite fields are provided as built-in functions.

An elliptic curve is specified by a vector [A B] of length 2, where A, B are elements of finite fields. If the current base field is a prime field, then [A B] represents Y^2=X^3+AX+B. If the current base field is a finite field of characteristic 2, then [A B] represents Y^2+XY=X^3+AX^2+B.

Points on an elliptic curve together with the point at infinity forms an additive group. The addition, the subtraction and the additive inverse operation are provided as ecm_add_ff(), ecm_sub_ff() and ecm_chsgn_ff() respectively. Here the representation of points are as follows.

  * 0 denotes the point at infinity.

  * The other points are represented by vectors [X Y Z] of length 3 with non-zero Z.

[X Y Z] represents a projective coordinate and it corresponds to [X/Z Y/Z] in the affine coordinate. To apply the above operations to a point [X Y], [X Y 1] should be used instead as an argument. The result of an operation is also represented by the projective coordinate. As the third coordinate is not always equal to 1, one has to divide the first and the scond coordinate by the third one to obtain the affine coordinate.

有限体に関する函数のまとめ
=============

Functions for Finite fields
===========================

setmod_ff
---------

setmod_ff([PRIME|POLY])
     :: 有限体の設定, 設定されている有限体の法, 定義多項式の表示

     :: Sets/Gets the current base fields.

return
     数または多項式

     number or polynomial

prime
     素数

     prime

poly
     GF(2) 上既約な 1 変数多項式

     univariate polynomial irreducible over GF(2)

  * 引数が正整数 PRIME の時, GF(PRIME) を基礎体として設定する.

  * 引数が多項式 POLY の時, GF(2^deg(POLY mod 2)) = GF(2)[t]/(POLY(t) mod 2) を基礎体として設定する.

  * 無引数の時, 設定されている基礎体が GF(PRIME) の場合 PRIME, GF(2^n) の場合定義多項式を返す.

  * GF(2^n) の定義多項式は, GF(2) 上 n 次既約ならなんでも良いが, 効率に影響するため, defpoly_mod2() で生成するのがよい.

  * If the argument is a non-negative integer PRIME, GF(PRIME) is set as the current base field.

  * If the argument is a polynomial POLY, GF(2^deg(POLY mod 2)) = GF(2)[t]/(POLY(t) mod2) is set as the current base field.

  * If no argument is specified, the modulus indicating the current base field is returned. If the current base field is GF(PRIME), PRIME is returned. If it is GF(2^n), the defining polynomial is returned.

  * Any irreducible univariate polynomial over GF(2) is available to set GF(2^n). However the use of defpoly_mod2() is recommended for efficiency.

     [174] defpoly_mod2(100);
     x^100+x^15+1
     [175] setmod_ff(@@);
     x^100+x^15+1
     [176] setmod_ff();
     x^100+x^15+1

参照

References
     defpoly_mod2

field_type_ff
-------------

field_type_ff()
     :: 設定されている基礎体の種類

     :: Type of the current base field.

return
     整数

     integer

  * 設定されている基礎体の種類を返す.

  * 設定なしなら 0, GF(p) なら 1, GF(2^n) なら 2 を返す.

  * Returns the type of the current base field.

  * If no field is set, 0 is returned. If GF(p) is set, 1 is returned. If GF(2^n) is set, 2 is returned.

     [0] field_type_ff();
     0
     [1] setmod_ff(3);
     3
     [2] field_type_ff();
     1
     [3] setmod_ff(x^2+x+1);
     x^2+x+1
     [4] field_type_ff();
     2

参照

References
     setmod_ff

field_order_ff
--------------

field_order_ff()
     :: 設定されている基礎体の位数

     :: Order of the current base field.

return
     整数

     integer

  * 設定されている基礎体の位数 (元の個数) を返す.

  * 設定されている体が GF(q) ならば q を返す.

  * Returns the order of the current base field.

  * Q is returned if the current base field is GF(q).

     [0] field_order_ff();
     field_order_ff : current_ff is not set
     return to toplevel
     [0] setmod_ff(3);
     3
     [1] field_order_ff();
     3
     [2] setmod_ff(x^2+x+1);
     x^2+x+1
     [3] field_order_ff();
     4

参照

References
     setmod_ff

characteristic_ff
-----------------

characteristic_ff()
     :: 設定されている体の標数

     :: Characteristic of the current base field.

return
     整数

     integer

  * 設定されている体の標数を返す.

  * GF(p) の場合 p, GF(2^n) の場合 2 を返す.

  * Returns the characteristic of the current base field.

  * P is returned if GF(P), where P is a prime, is set. 2 is returned if GF(2^N) is set.

     [0] characteristic_ff();
     characteristic_ff : current_ff is not set
     return to toplevel
     [0] setmod_ff(3);
     3
     [1] characteristic_ff();
     3
     [2] setmod_ff(x^2+x+1);
     x^2+x+1
     [3] characteristic_ff();
     2

参照

References
     setmod_ff

extdeg_ff
---------

extdeg_ff()
     :: 設定されている基礎体の, 素体に対する拡大次数

     :: Extension degree of the current base field over the prime field.

return
     整数

     integer

  * 設定されている基礎体の, 素体に対する拡大次数を返す.

  * GF(p) の場合 1, GF(2^n) の場合 n を返す.

  * Returns the extension degree of the current base field over the prime field.

  * GF(p) の場合 1, GF(2^n) の場合 n を返す. 1 is returned if GF(P), where P is a prime, is set. N is returned if GF(2^N) is set.

     [0] extdeg_ff();
     extdeg_ff : current_ff is not set
     return to toplevel
     [0] setmod_ff(3);
     3
     [1] extdeg_ff();
     1
     [2] setmod_ff(x^2+x+1);
     x^2+x+1
     [3] extdeg_ff();
     2

参照

References
     setmod_ff

simp_ff
-------

simp_ff(OBJ)
     :: 数, あるいは多項式の係数を有限体の元に変換

     :: Converts numbers or coefficients of polynomials into elements in finite fields.

return
     数または多項式

     number or polynomial

obj
     数または多項式

     number or polynomial

  * 数, あるいは多項式の係数を有限体の元に変換する.

  * 整数, あるいは整数係数多項式を, 有限体, あるいは有限体係数に変換するために用いる.

  * 有限体の元に対し, 法あるいは定義多項式による reduction を行う場合にも用いる.

  * Converts numbers or coefficients of polynomials into elements in finite fields.

  * It is used to convert integers or intrgral polynomials int elements of finite fields or polynomials over finite fields.

  * An element of a finite field may not have the reduced representation. In such case an application of simp_ff assures the output has the reduced representation.

     [0] simp_ff((x+1)^10);
     x^10+10*x^9+45*x^8+120*x^7+210*x^6+252*x^5+210*x^4+120*x^3+45*x^2+10*x+1
     [1] setmod_ff(3);
     3
     [2] simp_ff((x+1)^10);
     1*x^10+1*x^9+1*x+1
     [3] ntype(coef(@@,10));
     6

参照

References
     setmod_ff, lmptop, gf2nton

random_ff
---------

random_ff()
     :: 有限体の元の乱数生成

     :: Random generation of an element of a finite field.

return
     有限体の元

     element of a finite field

  * 有限体の元を乱数生成する.

  * random(), lrandom() と同じ 32bit 乱数発生器を使用している.

  * Generates an element of the current base field randomly.

  * The same random generator as in random(), lrandom() is used.

     [0] random_ff();
     random_ff : current_ff is not set
     return to toplevel
     [0] setmod_ff(pari(nextprime,2^40));
     1099511627791
     [1] random_ff();
     561856154357
     [2] random_ff();
     45141628299

参照

References
     setmod_ff, random, lrandom

lmptop
------

lmptop(OBJ)
     :: GF(p) 係数多項式の係数を整数に変換

     :: Converts the coefficients of a polynomial over GF(p) into integers.

return
     整数係数多項式

     integral polynomial

obj
     GF(p) 係数多項式

     polynomial over GF(p)

  * GF(p) 係数多項式の係数を整数に変換する.

  * GF(p) の元は, 0 以上 p 未満の整数で表現されている. 多項式の各係数は, その値を整数オブジェクト(数識別子 0)としたものに変換される.

  * Converts the coefficients of a polynomial over GF(p) into integers.

  * An element of GF(p) is represented by a non-negative integer R less than P. Each coefficient of a polynomial is converted into an integer object whose value is R.

     [0] setmod_ff(pari(nextprime,2^40));
     1099511627791
     [1] F=simp_ff((x-1)^10);
     1*x^10+1099511627781*x^9+45*x^8+1099511627671*x^7+210*x^6
     +1099511627539*x^5+210*x^4+1099511627671*x^3+45*x^2+1099511627781*x+1
     [2] setmod_ff(547);
     547
     [3] F=simp_ff((x-1)^10);
     1*x^10+537*x^9+45*x^8+427*x^7+210*x^6+295*x^5+210*x^4+427*x^3+45*x^2+537*x+1
     [4] lmptop(F);
     x^10+537*x^9+45*x^8+427*x^7+210*x^6+295*x^5+210*x^4+427*x^3+45*x^2+537*x+1
     [5] lmptop(coef(F,1));
     537
     [6] ntype(@@);
     0

参照

References
     simp_ff

ntogf2n
-------

ntogf2n(M)
     :: 自然数を GF(2^n) の元に変換

     :: Converts a non-negative integer into an element of GF(2^n).

return
     GF(2^n) の元

     element of GF(2^n)

m
     非負整数

     non-negative integer

  * 自然数 M の 2 進表現 M=M0+M1*2+...+MK*2^k に対し, GF(2^n)=GF(2)[t]/(g(t)) の元 M0+M1*t+...+MK*t^k mod g(t) を返す.

  * 定義多項式による剰余は自動的には計算されないため, simp_ff() を適用する必要がある.

  * Let M be a non-negative integer. M has the binary representation M=M0+M1*2+...+MK*2^k. This function returns an element of  GF(2^n)=GF(2)[t]/(g(t)), M0+M1*t+...+MK*t^k mod g(t).

  * Apply simp_ff() to reduce the result.

     [1] setmod_ff(x^30+x+1);
     x^30+x+1
     [2] N=ntogf2n(2^100);
     (@^100)
     [3] simp_ff(N);
     (@^13+@^12+@^11+@^10)

参照

References
     gf2nton

gf2nton
-------

gf2nton(M)
     :: GF(2^n) の元を自然数に変換

     :: Converts an element of GF(2^n) into a non-negative integer.

return
     非負整数

     non-negative integer

m
     GF(2^n) の元

     element of GF(2^n)

  * gf2nton の逆変換である.

     The inverse of gf2nton.

     [1] setmod_ff(x^30+x+1);
     x^30+x+1
     [2] N=gf2nton(2^100);
     (@^100)
     [3] simp_ff(N);
     (@^13+@^12+@^11+@^10)
     [4] gf2nton(N);
     1267650600228229401496703205376
     [5] gf2nton(simp_ff(N));
     15360

参照

References
     gf2nton

ptogf2n
-------

ptogf2n(POLY)
     :: 一変数多項式を GF(2^n) の元に変換

     :: Converts a univariate polynomial into an element of GF(2^n).

return
     GF(2^n) の元

     element of GF(2^n)

poly
     一変数多項式

     univariate polynomial

  * POLY の表す GF(2^n) の元を生成する. 係数は, 2 で割った余りに変換される. POLY の変数に @ を代入した結果と等しい.

     Generates an element of GF(2^n) represented by POLY. The coefficients are reduced modulo 2. The output is equal to the result by substituting @ for the variable of POLY.

     [1] setmod_ff(x^30+x+1);
     x^30+x+1
     [2] ptogf2n(x^100);
     (@^100)

参照

References
     gf2ntop

gf2ntop
-------

gf2ntop(M[,V])
     :: GF(2^n) の元を多項式に変換

     :: Converts an element of GF(2^n) into a polynomial.

return
     一変数多項式

     univariate polynomial

m
     GF(2^n) の元

     an element of GF(2^n)

v
     不定元

     indeterminate

  * M を表す多項式を, 整数係数の多項式オブジェクトとして返す.

  * V の指定がない場合, 直前の ptogf2n() 呼び出しにおける引数の変数 (デフォルトは x), 指定がある場合には指定された不定元を変数とする多項式を返す.

  * Returns a polynomial representing M.

  * If V is used as the variable of the output. If V is not specified, the variable of the argument of the latest ptogf2n() call. The default variable is x.

     [1] setmod_ff(x^30+x+1);
     x^30+x+1
     [2] N=simp_ff(gf2ntop(2^100));
     (@^13+@^12+@^11+@^10)
     [5] gf2ntop(N);
     [207] gf2ntop(N);
     x^13+x^12+x^11+x^10
     [208] gf2ntop(N,t);
     t^13+t^12+t^11+t^10

参照

References
     ptogf2n

defpoly_mod2
------------

defpoly_mod2(D)
     :: GF(2) 上既約な一変数多項式の生成

     :: Generates an irreducible univariate polynomial over GF(2).

return
     多項式

     univariate polynomial

d
     正整数

     positive integer

  * fff で定義されている.

  * 与えられた次数 D に対し, GF(2) 上 D 次の既約多項式を返す.

  * もし 既約 3 項式が存在すれば, 第 2 項の次数がもっとも小さい 3 項式, もし 既約 3 項式が存在しなければ, 既約 5 項式の中で, 第 2 項の次数がもっとも小さく, その中で第 3 項の次数がもっとも小さく, その中で第 4 項の次数がもっとも小さいものを返す.

  * Defined in fff.

  * An irreducible univariate polynomial of degree D is returned.

  * If an irreducible trinomial X^D+X^M+1 exists, then the one with the smallest M is returned. Otherwise, an irreducible pentanomial X^D+X^M1+X^M2+X^M3+1 (M1>M2>M3 is returned. M1, M2 and M3 are determined as follows: Fix M1 as small as possible. Then fix M2 as small as possible. Then fix M3 as small as possible.

参照

References
     setmod_ff

fctr_ff
-------

fctr_ff(POLY)
     :: 1 変数多項式の有限体上での既約分解

     :: Irreducible univariate factorization over a finite field.

return
     リスト

     list

poly
     有限体上の 1 変数多項式

     univariate polynomial over a finite field

  * fff で定義されている.

  * 一変数多項式を, 現在設定されている有限体上で既約分解する.

  * 結果は, [[F1,M1],[F2,M2],...] なるリストである. ここで, FI は monic な既約因子, MI はその重複度である.

  * POLY の主係数は捨てられる.

  * Defined in fff.

  * Factorize POLY into irreducible factors over the current base field.

  * The result is a list [[F1,M1],[F2,M2],...], where FI is a monic irreducible factor and MI is its multiplicity.

  * The leading coefficient of POLY is abandoned.

     [178] setmod_ff(2^64-95);
     18446744073709551521
     [179]  fctr_ff(x^5+x+1);
     [[1*x+14123390394564558010,1],[1*x+6782485570826905238,1],
     [1*x+15987612182027639793,1],[1*x^2+1*x+1,1]]

参照

References
     setmod_ff

irredcheck_ff
-------------

irredcheck_ff(POLY)
     :: 1 変数多項式の有限体上での既約判定

     :: Primality check of a univariate polynomial over a finite field.

return
     0|1

poly
     有限体上の 1 変数多項式

     univariate polynomial over a finite field

  * fff で定義されている.

  * 有限体上の 1 変数多項式の既約判定を行い, 既約の場合 1, それ以外は 0 を返す.

  * Defined in fff.

  * Returns 1 if POLY is irreducible over the current base field. Returns 0 otherwise.

     [178] setmod_ff(2^64-95);
     18446744073709551521
     [179] ] F=x^10+random_ff();
     x^10+14687973587364016969
     [180] irredcheck_ff(F);
     1

参照

References
     setmod_ff

randpoly_ff
-----------

randpoly_ff(D,V)
     :: 有限体上の 乱数係数 1 変数多項式の生成

     :: Generation of a random univariate polynomial over a finite field.

return
     多項式

     polynomial

d
     正整数

     positive integer

v
     不定元

     indeterminate

  * fff で定義されている.

  * D 次未満, 変数が V, 係数が現在設定されている有限体に属する 1 変数多項式を生成する. 係数は random_ff() により生成される.

  * Defined in fff.

  * Generates a polynomial of V such that the degree is less than D and the coefficients are in the current base field. The coefficients are generated by random_ff().

     [178] setmod_ff(2^64-95);
     18446744073709551521
     [179] ] F=x^10+random_ff();
     [180] randpoly_ff(3,x);
     17135261454578964298*x^2+4766826699653615429*x+18317369440429479651
     [181] randpoly_ff(3,x);
     7565988813172050604*x^2+7430075767279665339*x+4699662986224873544
     [182] randpoly_ff(3,x);
     10247781277095450395*x^2+10243690944992524936*x+4063829049268845492

参照

References
     setmod_ff, random_ff

ecm_add_ff, ecm_sub_ff, ecm_chsgn_ff
------------------------------------

ecm_add_ff(P1,P2,EC)
ecm_sub_ff(P1,P2,EC)
ecm_chsgn_ff(P1)
     :: 楕円曲線上の点の加算, 減算, 逆元

     :: Addition, Subtraction and additive inverse for points on an elliptic curve.

return
     ベクトルまたは 0

     vector or 0

p1,p2
     長さ 3 のベクトルまたは 0

     vector of length 3 or 0

ec
     長さ 2 のベクトル

     vector of length 2

  * 現在設定されている有限体上で,  EC で定義される楕円曲線上の点 P1, P2 の和 P1+P2, 差 P1-P2, 逆元 -P1 を返す.

  * EC は, 設定されている有限体が奇標数素体の場合, Y^2=X^3+EC[0]X+EC[1], 標数 2 の場合 Y^2+XY=X^3+EC[0]X^2+EC[1] を表す.

  * 引数, 結果ともに, 無限遠点は 0 で表される.

  * P1, P2 が長さ 3 のベクトルの場合, 斉次座標による曲線上の点を表す. この場合, 第 3 座標は 0 であってはいけない.

  * 結果が長さ 3 のベクトルの場合, 第 3 座標は 0 でないが, 1 とは限らない. アフィン座標による結果を得るためには, 第 1 座標, 第 2 座標を第 3 座標で割る必要がある.

  * P1, P2 が楕円曲線上の点かどうかのチェックはしない.

  * Let P1, P2 be points on the elliptic curve represented by EC over the current base field. ecm_add_ff(P1,P2,EC), ecm_sub_ff(P1,P2,EC) and ecm_chsgn_ff(P1) returns P1+P2, P1-P2 and -P1 respectively.

  * If the current base field is a prime field of odd order, then EC represents Y^2=X^3+EC[0]X+EC[1]. If the characteristic of the current base field is 2, then EC represents Y^2+XY=X^3+EC[0]X^2+EC[1].

  * The point at infinity is represented by 0.

  * If an argument denoting a point is a vector of length 3, then it is the projective coordinate. In such a case the third coordinate must not be 0.

  * If the result is a vector of length 3, then the third coordinate is not equal to 0 but not necessarily 1. To get the result by the affine coordinate, the first and the second coordinates should be divided by the third coordinate.

  * The check whether the arguments are on the curve is omitted.

     [0] setmod_ff(1125899906842679)$
     [1] EC=newvect(2,[ptolmp(1),ptolmp(1)])$
     [2] Pt1=newvect(3,[1,-412127497938252,1])$
     [3] Pt2=newvect(3,[6,-252647084363045,1])$
     [4] Pt3=ecm_add_ff(Pt1,Pt2,EC);
     [ 560137044461222 184453736165476 125 ]
     [5] F=y^2-(x^3+EC[0]*x+EC[1])$
     [6] subst(F,x,Pt3[0]/Pt3[2],y,Pt3[1]/Pt3[2]);
     0
     [7] ecm_add_ff(Pt3,ecm_chsgn_ff(Pt3),EC);
     0
     [8] D=ecm_sub_ff(Pt3,Pt2,EC);
     [ 886545905133065 119584559149586 886545905133065 ]
     [9] D[0]/D[2]==Pt1[0]/Pt1[2];
     1
     [10] D[1]/D[2]==Pt1[1]/Pt1[2];
     1

参照

References
     setmod_ff