To be able to calculate in GF(2**n), the field must first be initialized by the command

`gf2n_init(n)`

, where n is the degree of
the field over GF(2). Example:
==> gf2n_init(53). 9_00719_92547_41063This function calculates an irreducible polynomial f(X) of degree n (here n = 53). (The return value is an encoding of this polynomial.) The field GF(2**n) is then represented as GF(2)[X]/(f(X)), its elements as polynomials mod f(X), which have a uniquely defined representative of degree < n. Such a polynomial

g(X) = sum(a_i * X**i: 0 <= i < n), a_i = 0,1,can be regarded as a bitvector of length n. In ARIBAS the data type of elements in GF(2**n) is called

`gf2nint`

, the literals of this data type
have the prefix `2x`

followed by the hexadecimal
representation of the bitvector. Also base 2 and base 8
representation is allowed; in this case the prefix is
`2y`

resp. `2o`

. The zero and
unit elements of GF(2**n) are `2x0`

and
`2x1`

. A random element of GF(2**n) can
be generated by
==> x := gf2nint(random(2**53)). -: 2x7_FF23_0C47_07BE(The function

gf2nint(n: integer): gf2nint;transforms integers to data type

`gf2nint`

.)
Let's generate a second random element of GF(2**53)

==> y := gf2nint(random(2**53)). -: 2x13_C4A3_92A9_D731We can add, multiply and divide these elements:

==> x + y. -: 2x14_3B80_9EEE_D08F ==> x*y. -: 2x15_069C_F71C_C1BD ==> z1 := x+y. -: 2x14_3B80_9EEE_D08F ==> z2 := x*y. -: 2x15_069C_F71C_C1BD ==> z3 := x/y. -: 2x15_F736_CC28_0101 ==> z1 + y. -: 2x7_FF23_0C47_07BE ==> z3 * y. -: 2x7_FF23_0C47_07BE(Note that

`(x + y) + y = x`

, since in GF(2**n)
addition is the same as subtraction.)Another operation is exponentiation of an

`gf2nint`

by an
integer, where the exponent may also be negative.
==> x**-1. -: 2x13_CF16_5F28_DCA4 ==> _ * x. -: 2x1 ==> x**(2**53 - 1). -: 2x1The last result comes from the fact that the multiplicative group of GF(2**n) has order 2**n - 1. Another example for exponentiation: Every element x of GF(2**n) is a square. Its square root can be calculated by raising x to the power 2**(n-1). Example:

==> u := x**(2**52). -: 2x4_615D_D2E9_7C49 ==> u**2. -: 2x7_FF23_0C47_07BE ==> _ = x. -: true

gf2n_degree(): integer;There is always only one field GF(2**n) active. This function returns its degree.

gf2n_fieldpol(): integer;Returns the irreducible polynomial serving to define the active field GF(2**n). This polynomial is encoded as an integer; an integer f in binary representation

f = sum(a_i * 2**i: 0 <= i <= n), a_i = 0,1represents the polynomial

f(X) = sum(a_i * X**i: 0 <= i <= n).Example: If GF(2**53) is active, then

==> f := gf2n_fieldpol(). -: 9_00719_92547_41063 ==> write(f:base(2)). 100000_00000000_00000000_00000000_00000000_00000000_01000111 -: 1This means that

f(X) = X**53 + X**6 + X**2 + X + 1.The trace Tr: GF(2**n) --> {0,1} can be calculated by the function

gf2n_trace(x: gf2nint): integer;

`ec_gf2n.ari`

.

Homepage of ARIBAS

Otto Forster 2004-08-16