NAME
Math::GF - Galois Fields arithmetics
VERSION
This document describes Math::GF version 0.004.
SYNOPSIS
use
Math::GF;
# prime orders leverage on Math::GF::Zn
my
$GF5
= Math::GF->new(
order
=> 5);
# prints "yes!" because 5 is prime
say
'yes!'
if
$GF5
->order_is_prime;
# prints "order 5 = 5^1"
say
'order '
,
$GF5
->order,
' = '
,
$GF5
->p,
'^'
,
$GF5
->n;
# generate some elements
my
$zero_gf5
=
$GF5
->additive_neutral;
my
$one_gf5
=
$GF5
->multiplicative_neutral;
my
$four_gf5
=
$GF5
->e(4);
# scalar context
my
(
$two_gf5
,
$three_gf5
) =
$GF5
->(2, 3);
# list context
# use some operations, both print "yes!"
say
'yes!'
if
$two_gf5
==
$one_gf5
+
$one_gf5
;
say
'yes!'
if
$three_gf5
==
$four_gf5
*
$two_gf5
;
# non-prime orders leverage on Math::GF::Extension
my
$GF8
= Math::GF->new(
order
=> 8);
# prints "order not prime!"
say
'order not prime!'
unless
$GF8
->order_is_prime;
# prints "order 8 = 2^3"
say
'order '
,
$GF8
->order,
' = '
,
$GF8
->p,
'^'
,
$GF8
->n;
# same operations as before anyway, no change in API
my
$zero_gf8
=
$GF8
->additive_neutral;
my
$one_gf8
=
$GF8
->multiplicative_neutral;
my
(
$three_gf8
,
$five_gf8
) =
$GF8
->e(3, 5);
# use some operations... no more modulo operations in GF(2^3)
say
'yes!'
if
$three_gf8
*
$five_gf8
==
$GF8
->e(4);
# import a factory function for building elements
Math::GF->import_builder(81,
name
=>
'GF81'
);
# GF(3^4)
say
'yes!'
if
GF81(5) * GF81(8) == GF81(19);
# Need all elements? No problem
my
@all_gf27
= Math::GF->new(
order
=> 27)->all;
DESCRIPTION
This module allows you to generate and handle operations inside a Galois Field (GF) of any allowed order:
orders that are too big are likely to explode
orders that aren't prime number powers do not have associated Galois Fields.
It's easy to generate a new GF of a given order:
my
$GF5
= Math::GF->new(
order
=> 5);
# GF(5)
my
$GF8
= Math::GF->new(
order
=> 8);
# GF(2^3)
Since a GF of order N has exactly N elements, it's easy to refer to them with integers from 0 to N - 1. If you want to actually generate the associated element you can use the "e" method:
my
$e5_gf8
=
$GF8
->e(5);
If you're planning to work extensively with a specific GF, or just want some syntactic sugar, you can import a factory function in your package that will generate elements in the specific GF:
# by default, import a function named GF_p_n for GF(p^n)
Math::GF->import_builder(8);
my
$e5
= GF_2_3(5);
# you can give your name though
Math::GF->import_builder(8,
name
=>
'GF8'
);
my
$e5_gf8
= GF8(5);
If you need all elements, look at the "all" method. It's the same as doing this:
my
@all
=
map
{
$GF8
->e(
$_
) } 0 .. 8 - 1;
but easier to type and possibly a bit quicker.
Elements associated to 0 and 1 have the usual meaning of the additive and multiplicative neutral elements, respectively. You can also get them with "additive_neutral" and "multiplicative_neutral".
METHODS
In the following, $GF
is supposed to be a Math::GF
object.
additive_neutral
my
$zero
=
$GF
->additive_neutral;
the neutral element of the Galois Field with respect to the addition operation. Same as $GF->e(0)
.
all
my
@all_elements
=
$GF
->all;
generate all elements of the Galois Field.
e
my
$e5
=
$GF
->e(5);
my
@some
=
$GF
->e(2, 3, 5, 7);
factory method to generate one or more elements in the field. When called in scalar context it always operate on the first provided argument only.
element_class
my
$class_name
=
$GF
->element_class;
the underlying class for generating elements. It defaults to Math::GF::Zn when the "order" is a prime number and Math::GF::Extension when it is not; there is probably little motivation for you to fiddle with this.
import_builder
Math::GF->import_builder(
$order
,
%args
);
import a factory function in the caller's package for easier generation of elements in the GF of the specified $order
.
By default, the name of the imported function is GF_p
or GF_p_n
where p
is a prime and n
is the power of the prime such that $order = p ** n
(the n
part is omitted if it is equal to 1
). For example:
Math::GF->import_builder(5);
# imports GF_5()
Math::GF->import_builder(8);
# imports GF_2_3()
You can pass your own name
in the %args
though:
Math::GF->import_builder(8,
name
=>
'GF8'
);
# imports GF8()
The imported function is a wrapper around "e":
my
$one
= GF_2_3(1);
my
@some
= GF_5(1, 3, 4);
Allowed keys in %args
:
level
-
by default the function is imported in the caller's package. This allows you to alter which level in the call stack you want to peek for importing the sub.
name
-
the name of the method, see above for the default.
multiplicative_neutral
my
$one
=
$GF
->multiplicative_neutral;
the neutral element of the Galois Field with respect to the multiplication operation. Same as $GF>e(1)
.
n
my
$power
=
$GF
->n;
the "order" of a Galois Field must be a power of a prime "p", this method provides the value of the power. E.g. if the order is 8
, the prime is 2
and the power is 3
.
order
my
$order
=
$GF
->order;
the order of the Galois Field. Only powers of a single prime are allowed.
order_is_prime
my
$boolean
=
$GF
->order_is_prime;
the "order" of a Galois Field can only be a power of a prime, with the special case in which this power is 1, i.e. the order itself is a prime number. This method provided a true value in this case, false otherwise.
p
my
$prime
=
$GF
->p;
the "order" of a Galois Field must be a power of a prime, this method provides the value of the prime number. E.g. if the order is 8
, the prime is 2
and the power is 3
. See also "n".
prod_table
my
$pt
=
$GF
->prod_table;
a table that can be used to evaluate the product of two elements in the field.
The table is provided as a reference to an Array of Arrays. The elements in the field are associated to indexes from 0
to order - 1
; table element $pt->[$A][$B]
represents the result of the product between element associated to $A
and element associated to $B
.
You shouldn't in general need to fiddle with this table, as it is used behind the scenes by Math::GF::Extension
, where all operations are overloaded.
sum_table
my
$st
=
$GF
->sum_table;
a table that can be used to evaluate the product of two elements in the field.
The table is provided as a reference to an Array of Arrays. The elements in the field are associated to indexes from 0
to order - 1
; table element $pt->[$A][$B]
represents the result of the addition between element associated to $A
and element associated to $B
.
You shouldn't in general need to fiddle with this table, as it is used behind the scenes by Math::GF::Extension
, where all operations are overloaded.
BUGS AND LIMITATIONS
Report bugs through GitHub (patches welcome).
SEE ALSO
Math::Polynomial is used behind the scenes to generate the tables in case the order is not a prime.
Math::GF::Zn is used for generating elements in the field and handling operations between them in an easy way in case of prime "order". Math::GF::Extension is used for elements in the field in case of non-prime "order"s.
AUTHOR
Flavio Poletti <polettix@cpan.org>
COPYRIGHT AND LICENSE
Copyright (C) 2017, 2018 by Flavio Poletti <polettix@cpan.org>
This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0.
This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose.